Search for usernames literally, not with func.lower().
[zzz-floof.git] / floof / model / users.py
index af4bfba..bacdfe6 100644 (file)
@@ -4,12 +4,15 @@
 #   Copyright (c) 2009 Scribblr
 #
 
-# from elixir import Entity, Field, Unicode, belongs_to, has_many
+import re
+
 from elixir import *
+
 from search import GalleryWidget
 
 class User(Entity):
     name = Field(Unicode(20))
+    display_name = Field(Unicode(20))
     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')
 
+    @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 __str__(self):
+        return self.name
+
     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.
-    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)
 
@@ -75,3 +92,4 @@ class UserRelationship(Entity):
     user = ManyToOne('User')
     target_user = ManyToOne('User')
     type = Field(Integer)  # UserRelationshipTypes above
+