def fetch_contacts(self, user_id, filters=None, limit=20, offset=0): def append_filters(query): for ft in filters: for (key, value) in ft.items(): for nr in CONTACTRESOLVERS: nrinst = nr(key, value) query.extend(nrinst) query = Contact.all(alias="a") for key in Contact.get_properties(persistent=True).keys(): query.what("a.%s" % key, alias=key) query.select("DISTINCT") group_ids = self.fetch_my_groups(user_id, onlyrtnids=True) if len(group_ids) > 0: query.model(ContactGroup.get_modelname(), alias="b", join="left", on="a.uid = b.contact_id") query.filter("b.group_id in", group_ids, parenthesis="(") query.filter("a.creator_id =", user_id, logic="or", parenthesis=")") else: query.filter("a.creator_id =", user_id) query.order("-a.uid") if filters != None: append_filters(query) if not query.has_filter("a.is_trashed"): query = query.filter("a.is_trashed =", False) def contact_proc(contact): contact.contactLeaves = self.fetch_contactleaves(contact.key()) return query.fetch(limit, offset, paging=True, model_proc=contact_proc)
def get_myself(self, user_id): query = Contact.all() query.filter("bind_user_id =", user_id) query.filter("creator_id =", user_id) if query.count() > 0: contact = query.get() else: contact = None return contact
def update_contact(self, contact, modifier_id): ct = Contact.get_by_key(contact.uid) if ct.is_trashed : raise Error("cont_error_trashedupdate") if ct.creator_id != modifier_id: raise Error("cont_error_updatesharedcontact") contact = self.link_contact_to_user(contact, contact.bind_user_account) contact.put(modifier_id) self.create_contactgroups(contact.key(), contact.group_ids, modifier_id) return contact
def fetch_contacts_created_by(self, user_id): query = Contact.all() query.what("uid") query.what("creator_id") query.what("contact_name") query.filter("creator_id =", user_id) query.order("-uid") query = query.filter("is_trashed =", False) def contact_proc(contact): """""" return query.fetch(model_proc=contact_proc)
def get_contactcount(self, is_trashed, user_id, group_id=None): query = Contact.all(alias="a") query.filter("a.is_trashed =", is_trashed) if group_id is not None and group_id != model.EMPTY_UID: query.model(ContactGroup.get_modelname(), alias="b", join="inner", on="a.uid = b.contact_id") query.filter("b.group_id =", group_id) else: query.filter("a.creator_id =", user_id) query.filter("a.uid not in", "(select contact_id from %s)" % ContactGroup.get_modelname(), wrapper=False) return query.count()
def fetch_contacts_by_group(self, group_id): query = Contact.all(alias="a") query.select("DISTINCT") query.what("a.uid") query.what("a.creator_id") query.what("a.contact_name") query.model(ContactGroup.get_modelname(), alias="b", join="left", on="a.uid = b.contact_id") query.filter("b.group_id =", group_id) query.order("-uid") query = query.filter("is_trashed =", False) def contact_proc(contact): """""" return query.fetch(model_proc=contact_proc)
def delete_contact(self, contact_id, modifier_id): contact = Contact.get_by_key(int(contact_id)) if contact.is_trashed: contact.delete(modifier_id) self.delete_contactgroups(modifier_id, contact_id=contact_id) else: if contact.creator_id != modifier_id: raise Error("cont_error_deletesharedcontact") query = Task.all() query.filter("assignee_id =", contact_id) query.filter("is_trashed =", False) if query.count() > 0: raise Error('cont_error_assignedtasks') else: self.trash_contacts([contact.uid], True, modifier_id) return True
def fetch_groups(self, user_id, is_shared=None, sharetome=None, withcontactcount=True): query = Group.all("a") if is_shared != None: query.filter("is_shared =", is_shared) if sharetome: query.model(ContactGroup.get_modelname(), alias="b", join="inner", on="a.uid=b.group_id") query.model(Contact.get_modelname(), alias="c", join="inner", on="c.uid=b.contact_id") query.filter("c.bind_user_id =", user_id) query.filter("a.is_shared =", True) else: query.filter("creator_id =", int(user_id)) def group_proc(group): if withcontactcount: group.contactcount = self.get_contactcount(False, user_id, group_id=group.key()) groups = query.fetch(model_proc=group_proc) return groups
def link_contact_to_user(self, contact, bind_user_account): if strutil.is_empty(bind_user_account): contact.bind_user_id = model.EMPTY_UID return contact query = Contact.all() usermo = user.get_user(u_account=bind_user_account) if usermo is None: raise Error("cont_error_linkusernotfound", account=bind_user_account) query.filter("bind_user_id =", usermo.key()) query.filter("creator_id =", contact.creator_id) if contact.key() != None: query.filter("uid !=", contact.key()) if query.count() > 0: raise Error("cont_error_linkuserexisted", account=bind_user_account, contactName=query.get().contact_name) contact.bind_user_id = usermo.key() return contact
def fetch_my_contacts(self, user_id): query = Contact.all(alias="a") query.select("DISTINCT") query.what("a.uid", alias="uid") query.what("a.contact_name", alias="contact_name") query.what("a.creator_id", alias="creator_id") group_ids = self.fetch_my_groups(user_id, onlyrtnids=True) if len(group_ids) > 0: query.model(ContactGroup.get_modelname(), alias="b", join="left", on="a.uid = b.contact_id") query.filter("b.group_id in", group_ids, parenthesis="(") query.filter("a.creator_id =", user_id, logic="or", parenthesis=")") else: query.filter("a.creator_id =", user_id) query.order("-a.uid") query = query.filter("a.is_trashed =", False) def contact_proc(contact): """""" return query.fetch(model_proc=contact_proc)
def empty_trash(self, user_id, modifier_id): query = Contact.all() query.filter("is_trashed =", True) query.filter("creator_id =", user_id) status = query.delete(modifier_id) return status
def trash_contacts(self, contact_ids, is_trashed, modifier_id): for contact_id in contact_ids: contact = Contact.get_by_key(contact_id) contact.is_trashed = is_trashed contact.put(modifier_id) return True
def get_contact(self, contact_id): contact = Contact.get_by_key(contact_id) return contact
def recover_contact(self, contact_id, modifier_id): ct = Contact.get_by_key(contact_id) ct.is_trashed = False ct.put(modifier_id) return ct