import mongoengine as db db.connect('project1', port=27017) USER_TYPES = ('Admin A', 'Manager A', 'Support A', 'Admin', 'Boss', 'Manager', 'User') USER_TYPES_NUMERIC = (100, 90, 80, 70, 60, 50, 40) USER_URL_PATH = ('a_admin', 'a_manager', 'a_tp', 'company_admin', 'company_boss', 'department_boss', 'department_staff') class Company(db.Document): name = db.StringField(required=True, unique=True, min_length=4) domain = db.StringField(required=True, unique=True, min_length=4) admin_user_ref = db.ReferenceField( 'User') # , reverse_delete_rule=db.NULLIFY) #- cannot cascade because of cross dependencies users_max = db.IntField(required=True, min_value=0, default=0) calls_outgoing_max = db.IntField(required=True, min_value=0, default=0) conferences_max = db.IntField(required=True, min_value=0, default=0) conference_max_users = db.IntField(required=True, min_value=0, default=0) conferences_allowed = db.BooleanField(required=True, default=False) is_sip_client = db.BooleanField(required=True, default=False) call_queues_allowed = db.BooleanField(required=True, default=False) blacklists_allowed = db.BooleanField(required=True, default=False) departments_allowed = db.BooleanField(required=True, default=False) outgoing_settings_allowed = db.BooleanField(required=True, default=False) voicemail_allowed = db.BooleanField(required=True, default=False) call_recording_allowed = db.BooleanField(required=True, default=False) call_records_store_months = db.IntField(required=True, default=0) class Line(db.Document): company_ref = db.ReferenceField(Company, required=True, reverse_delete_rule=db.CASCADE) line = db.StringField(required=True, unique_with='company_ref', min_length=4, max_length=4) ani_did_ref = db.ReferenceField( 'Did') # , reverse_delete_rule=db.NULLIFY) #- cannot cascade because of cross dependencies class Department(db.Document): name = db.StringField(required=True) company_ref = db.ReferenceField(Company, required=True, reverse_delete_rule=db.CASCADE) line_ref = db.ReferenceField(Line) class Did(db.Document): company_ref = db.ReferenceField(Company, required=True, reverse_delete_rule=db.CASCADE) did = db.StringField(required=True, unique=True, min_length=5, max_length=14) class Network(db.Document): company_ref = db.ReferenceField(Company, required=True, reverse_delete_rule=db.CASCADE) network = db.StringField(required=True) class SipLine(db.Document): company_ref = db.ReferenceField(Company, required=True, reverse_delete_rule=db.CASCADE) line_ref = db.ReferenceField(Line, required=True, reverse_delete_rule=db.CASCADE) is_recorded = db.BooleanField(required=True, default=False) password = db.StringField(required=True, min_length=8, max_length=12) permitted_networks_ref = db.ListField(db.ReferenceField(Network, reverse_delete_rule=db.PULL), default=list) class Conference(db.Document): name = db.StringField(required=True, min_length=0, max_length=64) company_ref = db.ReferenceField(Company, required=True, reverse_delete_rule=db.CASCADE) line_ref = db.ReferenceField(Line, required=True, reverse_delete_rule=db.CASCADE) code = db.StringField(required=True, min_length=3, max_length=64) max_users = db.IntField(required=True) welcome_melody = db.ReferenceField( 'GreetingFile') # , reverse_delete_rule=db.NULLIFY) #- cannot cascade because of cross dependencies join_melody = db.ReferenceField( 'GreetingFile') # , reverse_delete_rule=db.NULLIFY) #- cannot cascade because of cross dependencies is_available_from_outside = db.BooleanField(required=True, default=False) datetime_start = db.DateTimeField() call_siplines_ref = db.ListField(db.ReferenceField(SipLine, reverse_delete_rule=db.PULL), default=list) # class Menu(db.Document): # name = db.StringField(required=True) # item_path = db.StringField(required=True) # item_text = db.StringField(required=True) class UserTypes(db.Document): name = db.StringField(required=True, unique=True, choices=USER_TYPES) privilege_numeric = db.IntField(required=True, unique=True, choices=USER_TYPES_NUMERIC) url_path = db.StringField(required=True, unique=True, choices=USER_URL_PATH) # menu_ref = db.ListField(db.ReferenceField(Menu, reverse_delete_rule=db.DENY, required=True), required=True, # default=list) class User(db.Document): name = db.StringField(required=True, unique_with='company_ref', min_length=4) password = db.StringField(required=True, max_length=64) is_password_expired = db.BooleanField(default=False) company_ref = db.ReferenceField(Company, required=True, reverse_delete_rule=db.CASCADE) sipline_ref = db.ReferenceField(SipLine, required=True, unique_with='company_ref', reverse_delete_rule=db.CASCADE) privileges_ref = db.ReferenceField(UserTypes, reverse_delete_rule=db.DENY) email = db.EmailField(required=True, max_length=64) departments_ref = db.ListField(db.ReferenceField(Department, reverse_delete_rule=db.PULL)) mobile_number = db.StringField(min_length=4, max_length=14) hide_left_menu = db.BooleanField(required=True, default=False) class GridFSData(db.Document): name = db.StringField(required=True) company_ref = db.ReferenceField(Company, required=True, reverse_delete_rule=db.CASCADE) file = db.FileField() meta = {'allow_inheritance': True} class VoiceMail(GridFSData): pass class CallRecording(GridFSData): pass class GreetingFile(GridFSData): pass class FaxFile(GridFSData): pass