Merged add_tags and lib.search into lib.tags.
[zzz-floof.git] / floof / model / users.py
index af4bfba..a6f3a6d 100644 (file)
@@ -4,12 +4,15 @@
 #   Copyright (c) 2009 Scribblr
 #
 
 #   Copyright (c) 2009 Scribblr
 #
 
-# from elixir import Entity, Field, Unicode, belongs_to, has_many
+import re
+
 from elixir import *
 from elixir import *
+
 from search import GalleryWidget
 
 class User(Entity):
 from search import GalleryWidget
 
 class User(Entity):
-    name = Field(Unicode(20))
+    name = Field(Unicode(20), unique=True)
+    display_name = Field(Unicode(20))
     uploads = OneToMany('Art')
     has_many('identity_urls', of_kind='IdentityURL')
     searches = OneToMany('SavedSearch')
     uploads = OneToMany('Art')
     has_many('identity_urls', of_kind='IdentityURL')
     searches = OneToMany('SavedSearch')
@@ -19,10 +22,25 @@ class User(Entity):
     relationships = OneToMany('UserRelationship', inverse='user')
     target_of_relationships = OneToMany('UserRelationship', inverse='target_user')
 
     relationships = OneToMany('UserRelationship', inverse='user')
     target_of_relationships = OneToMany('UserRelationship', inverse='target_user')
 
+    @classmethod
+    def is_valid_name(cls, name):
+        """Returns True iff the name is a valid username.
+
+        Only lowercase letters, numbers, and hyphens are allowed.
+
+        Names must also be at least one character long, but no more than 20,
+        and cannot start or end with a hyphen.
+        """
+        return re.match('^[-a-z0-9]{1,20}$', name) \
+               and name[0] != '-' and name[-1] != '-'
+
 
     def __unicode__(self):
         return self.name
 
 
     def __unicode__(self):
         return self.name
 
+    def __str__(self):
+        return self.name
+
     def __init__(self, **kwargs):
         super(User, self).__init__(**kwargs)
 
     def __init__(self, **kwargs):
         super(User, self).__init__(**kwargs)
 
@@ -47,10 +65,9 @@ class UserPage(Entity):
     This is so that they can keep some nice themed pages lying around for special occasions.
     Page templates that provide familiar interfaces will also be UserPage records.  Users will
     see a panel full of them, and they can choose to clone those template pages to their own page list.
     This is so that they can keep some nice themed pages lying around for special occasions.
     Page templates that provide familiar interfaces will also be UserPage records.  Users will
     see a panel full of them, and they can choose to clone those template pages to their own page list.
-    If more than one is set to visible, there would be tabs.
-
-     """
-
+    If more than one is set to visible, there would be tabs.  The primary page is indicated in the user model.
+    """
+    
     owner = ManyToOne('User', inverse="pages")
     title = Field(String)
 
     owner = ManyToOne('User', inverse="pages")
     title = Field(String)
 
@@ -75,3 +92,4 @@ class UserRelationship(Entity):
     user = ManyToOne('User')
     target_user = ManyToOne('User')
     type = Field(Integer)  # UserRelationshipTypes above
     user = ManyToOne('User')
     target_user = ManyToOne('User')
     type = Field(Integer)  # UserRelationshipTypes above
+