Added support for querying by user.
[zzz-floof.git] / floof / model / users.py
index 4f83a75..a6f3a6d 100644 (file)
@@ -4,23 +4,40 @@
 #   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))
+    name = Field(Unicode(20), unique=True)
+    display_name = Field(Unicode(20))
     uploads = OneToMany('Art')
     has_many('identity_urls', of_kind='IdentityURL')
     searches = OneToMany('SavedSearch')
     # galleries = OneToMany('GalleryWidget')
     pages = OneToMany('UserPage', inverse="owner")
     primary_page = OneToOne('UserPage', inverse="owner")
+    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
 
@@ -56,9 +73,23 @@ class UserPage(Entity):
 
     visible = Field(Boolean)
     galleries = OneToMany('GalleryWidget')
-    
-    
-    
-    
-# class ArtRelation(Entity):
-#     
\ No newline at end of file
+
+
+class UserRelationshipTypes(object):
+    IS_WATCHING = 1
+
+class UserRelationship(Entity):
+    """Represents some sort of connection between users.
+
+    For the moment, this means "watching".  Later, it may mean friending or
+    ignoring.
+
+    XXX: Watching should be made more general than this; it should have the
+    power of an arbitrary query per watched artist without being unintelligible
+    to users.
+    """
+
+    user = ManyToOne('User')
+    target_user = ManyToOne('User')
+    type = Field(Integer)  # UserRelationshipTypes above
+