# 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')
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)
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)
user = ManyToOne('User')
target_user = ManyToOne('User')
type = Field(Integer) # UserRelationshipTypes above
+