def get(table, param): try: return self.profile[table][param] except KeyError: try: # FIXME: profile models db.perform("INSERT INTO %s (id) VALUES (%%s);" % \ table, [self.id]) except IntegrityError: pass res = cache_get('profile:%s:%s' % (table, self.id)) if res: self.profile[table] = res else: res = db.fetchone("SELECT * FROM %s WHERE id=%%s;" % \ table, [self.id]) log.debug('RES %s %s' % (table, res)) if res: self.profile[table] = dict(res) cache_store('profile:%s:%s' % (table, self.id), self.profile[table]) else: #try: # return cls._profile[param]['default'] #except KeyError: # return None return None # FIXME: remove recursive call try: return self.profile[table][param] except KeyError: cache_del('profile:%s:%s' % (table, self.id)) return get(table, param)
def confirm_account(self, code): res = db.fetchone("SELECT id, user_id, type, address, code " "FROM users.accounts_unconfirmed " "WHERE code=%s;", [code.lower()]) if not res: return False if res['user_id'] != self.id or res['code'] != str(code).lower(): return False db.perform("DELETE FROM users.accounts_unconfirmed WHERE id=%s;", [res['id']]) try: db.perform("INSERT INTO users.accounts (user_id, type, address) " "VALUES (%s, %s, %s);", [self.id, res['type'], res['address']]) except IntegrityError: log.error("%s %s already exists" % (res['type'], res['address'])) return False cache_del("addr_id_login:%s" % res['address']) return True
def confirm_account(self, code): res = db.fetchone( "SELECT id, user_id, type, address, code " "FROM users.accounts_unconfirmed " "WHERE code=%s;", [code.lower()]) if not res: return False if res['user_id'] != self.id or res['code'] != str(code).lower(): return False db.perform("DELETE FROM users.accounts_unconfirmed WHERE id=%s;", [res['id']]) try: db.perform( "INSERT INTO users.accounts (user_id, type, address) " "VALUES (%s, %s, %s);", [self.id, res['type'], res['address']]) except IntegrityError: log.error("%s %s already exists" % (res['type'], res['address'])) return False cache_del("addr_id_login:%s" % res['address']) return True
def delete_alias(self, alias): if not self.id: raise NotAuthorized res = db.fetchone("DELETE FROM users.user_aliases " "WHERE user_id=%s AND alias=%s " "RETURNING alias;", [self.id, alias.lower()]) if not res: return False cache_del('aliases:%s' % self.id) return True
def set_alias(self, alias, command): if not self.id: raise NotAuthorized try: db.perform("INSERT INTO users.user_aliases " "(user_id, alias, command) VALUES (%s, %s, %s);", [self.id, alias.lower(), command]) except IntegrityError: db.perform("UPDATE users.user_aliases SET alias=%s, command=%s " "WHERE user_id=%s;", [alias.lower(), command, self.id]) cache_del('aliases:%s' % self.id)
def delete_alias(self, alias): if not self.id: raise NotAuthorized res = db.fetchone( "DELETE FROM users.user_aliases " "WHERE user_id=%s AND alias=%s " "RETURNING alias;", [self.id, alias.lower()]) if not res: return False cache_del('aliases:%s' % self.id) return True
def set_alias(self, alias, command): if not self.id: raise NotAuthorized try: db.perform( "INSERT INTO users.user_aliases " "(user_id, alias, command) VALUES (%s, %s, %s);", [self.id, alias.lower(), command]) except IntegrityError: db.perform( "UPDATE users.user_aliases SET alias=%s, command=%s " "WHERE user_id=%s;", [alias.lower(), command, self.id]) cache_del('aliases:%s' % self.id)
def set_profile(self, param, value): def check(p, param, value): if p[param]['type'] == 'bool': if isinstance(value, (str, unicode)): if value.lower() in ['no', 'false', 'none', 'null', '0']: value = False else: value = True if param == 'private': if self.get_profile('private') and not value: self._private = False elif not self.get_profile('private') and value: self._private = True elif p[param]['type'] == 'str' and p[param]['re']: if not re.match(p[param]['re'], value): raise ValueError return value if self.__class__ != User and param in self._profile: check(self._profile, param, value) table = self._profile_table elif param in User._profile: check(User._profile, param, value) table = User._profile_table elif param.find('.') > -1: table, param = param.split('.', 1) table = 'users.profile_%s' % table if param == 'id' or re.match(r'\W', param): raise KeyError else: raise KeyError if table not in self.profile: self.profile[table] = {} self.profile[table][param] = value if table not in self.profile_upd: self.profile_upd[table] = {} self.profile_upd[table][param] = value cache_del('profile:%s:%s' % (table, self.id))
def add_account(self, type, address): if type in ACCOUNT_TYPES and not parse_email(address): raise ValueError(address) res = db.fetchone( "SELECT id FROM users.accounts " "WHERE type=%s AND address=%s;", [type, address]) if res: return res = db.fetchone( "SELECT id FROM users.accounts_unconfirmed " "WHERE type=%s AND address=%s;", [type, address]) if res: return code = '%s%s%s%s' % (settings.secret, datetime.now(), type, address) code = sha1(code).hexdigest().lower() self.accounts_add.append((type, address, code)) cache_del("addr_id_login:%s" % address) return code
def add_account(self, type, address): if type in ACCOUNT_TYPES and not parse_email(address): raise ValueError(address) res = db.fetchone("SELECT id FROM users.accounts " "WHERE type=%s AND address=%s;", [type, address]) if res: return res = db.fetchone("SELECT id FROM users.accounts_unconfirmed " "WHERE type=%s AND address=%s;", [type, address]) if res: return code = '%s%s%s%s' % (settings.secret, datetime.now(), type, address) code = sha1(code).hexdigest().lower() self.accounts_add.append((type, address, code)) cache_del("addr_id_login:%s" % address) return code
def rename(self, login): if not self.id: raise NotAuthorized if cache_get('renamed:%s' % self.id): raise RenameError if not validate_nickname(login): raise UserLoginError old_login = self.login self.login = login try: db.perform("UPDATE users.logins SET login=%s WHERE id=%s;", [login, self.id]) except IntegrityError: raise UserExists cache_store('renamed:%s' % self.id, 1, settings.user_rename_timeout) cache_del('id_login:%s' % old_login.lower()) for t in ACCOUNT_TYPES: for addr in self.get_accounts(t): cache_del("addr_id_login:%s" % addr)
def update_tune_data(self, data): cache_key = 'user_tune:%s' % self.id if data: cache_store(cache_key, data) else: cache_del(cache_key)
def del_account(self, type, address): self.accounts_del.append((type, address)) cache_del("addr_id_login:%s" % address)
def handle_subscription(self, presence): key = 'presence:%s:%s' % (presence['type'], presence['from'].bare) data = cache_get(key) if data: cache_del(key) self.send_message(**data)
def save(self): if not self.login: raise UserError("Cannot save anonymous user") is_new = False # create user if not self.id: if not self.login or not validate_nickname(self.login): raise UserError('Invalid Login: "******"' % self.login) self.id = db.fetchone( "INSERT INTO users.logins (login, type) " "VALUES (%s, %s) RETURNING id;", [self.login, self.type])[0] db.perform("INSERT INTO users.info (id, name) VALUES (%s, %s);", [self.id, self.login]) db.perform( "INSERT INTO users.profile (id, private, lang) " "VALUES (%s, false, 'en');", [self.id]) self.accounts_add = self.accounts is_new = True if not is_new: try: if self._private == True: self._set_private() elif self._private == False: self._set_public() except AttributeError: pass # save accounts for acc in self.accounts_add: try: if len(acc) == 3: db.perform( "INSERT INTO users.accounts_unconfirmed " "(user_id, type, address, code) " "VALUES (%s, %s, %s, %s);", [self.id, acc[0], acc[1], acc[2]]) else: db.perform( "INSERT INTO users.accounts " "(user_id, type, address) " "VALUES (%s, %s, %s);", [self.id, acc[0], acc[1]]) except IntegrityError: log.error("%s %s already exists" % (acc[0], acc[1])) self.accounts_add = [] for type, address in self.accounts_del: db.perform( "DELETE FROM users.accounts WHERE " "user_id=%s AND type=%s AND address=%s;", [self.id, type, address]) db.perform( "DELETE FROM users.accounts_unconfirmed WHERE " "user_id=%s AND type=%s AND address=%s;", [self.id, type, address]) self.accounts_del = [] # save profile if self.profile_upd: for table in self.profile_upd: f = [] for k in self.profile_upd[table]: f.append("%s=%%(%s)s" % (k, k)) try: try: db.perform("INSERT INTO %s (id) VALUES (%%s);" % \ table, [self.id]) except IntegrityError: pass db.perform("UPDATE %s SET %s WHERE id=%s;" % \ (table, ','.join(f), self.id), self.profile_upd[table]) cache_del('profile:%s:%s' % (table, self.id)) except ProgrammingError: raise KeyError except DataError: raise ValueError self.profile_upd = {} if self.info_upd: f = [] for k in self.info_upd: #if not self.info_upd[k]: # self.info_upd[k] = None f.append("%s=%%(%s)s" % (k, k)) db.perform("UPDATE users.info SET %s WHERE id=%s;" % \ (','.join(f), self.id), self.info_upd) self.info_upd = {} cache_del('userinfo:%s' % self.id) if self.password: db.perform("UPDATE users.logins SET password=%s WHERE id=%s;", (self.password, self.id))
def save(self): if not self.login: raise UserError("Cannot save anonymous user") is_new = False # create user if not self.id: if not self.login or not validate_nickname(self.login): raise UserError('Invalid Login: "******"' % self.login) self.id = db.fetchone("INSERT INTO users.logins (login, type) " "VALUES (%s, %s) RETURNING id;", [self.login, self.type])[0] db.perform("INSERT INTO users.info (id, name) VALUES (%s, %s);", [self.id, self.login]) db.perform("INSERT INTO users.profile (id, private, lang) " "VALUES (%s, false, 'en');", [self.id]) self.accounts_add = self.accounts is_new = True if not is_new: try: if self._private == True: self._set_private() elif self._private == False: self._set_public() except AttributeError: pass # save accounts for acc in self.accounts_add: try: if len(acc) == 3: db.perform("INSERT INTO users.accounts_unconfirmed " "(user_id, type, address, code) " "VALUES (%s, %s, %s, %s);", [self.id, acc[0], acc[1], acc[2]]) else: db.perform("INSERT INTO users.accounts " "(user_id, type, address) " "VALUES (%s, %s, %s);", [self.id, acc[0], acc[1]]) except IntegrityError: log.error("%s %s already exists" % (acc[0], acc[1])) self.accounts_add = [] for type, address in self.accounts_del: db.perform("DELETE FROM users.accounts WHERE " "user_id=%s AND type=%s AND address=%s;", [self.id, type, address]) db.perform("DELETE FROM users.accounts_unconfirmed WHERE " "user_id=%s AND type=%s AND address=%s;", [self.id, type, address]) self.accounts_del = [] # save profile if self.profile_upd: for table in self.profile_upd: f = [] for k in self.profile_upd[table]: f.append("%s=%%(%s)s" % (k, k)) try: try: db.perform("INSERT INTO %s (id) VALUES (%%s);" % \ table, [self.id]) except IntegrityError: pass db.perform("UPDATE %s SET %s WHERE id=%s;" % \ (table, ','.join(f), self.id), self.profile_upd[table]) cache_del('profile:%s:%s' % (table, self.id)) except ProgrammingError: raise KeyError except DataError: raise ValueError self.profile_upd = {} if self.info_upd: f = [] for k in self.info_upd: #if not self.info_upd[k]: # self.info_upd[k] = None f.append("%s=%%(%s)s" % (k, k)) db.perform("UPDATE users.info SET %s WHERE id=%s;" % \ (','.join(f), self.id), self.info_upd) self.info_upd = {} cache_del('userinfo:%s' % self.id) if self.password: db.perform("UPDATE users.logins SET password=%s WHERE id=%s;", (self.password, self.id))
img.save(path, fmt, **img.info) #except IOError, e: # log.error('IOError %s' % str(e)) # fd = open(path, 'w') # fd.close() except urllib2.HTTPError, e: log.warn('HTTPError %s: %s' % (e.code, url)) fd = open(path, 'w') fd.close() except urllib2.URLError, e: log.warn('URLError %s: %s' % (e.reason, url)) except Exception, e: log.error(traceback.format_exc()) finally: cache_del('thumbnail:%s' % hash) def _attach_image(src, dest, filename): def thumb(name, size, orig=False): fd = open(src) img = Image.open(fd) img.load() fmt = img.format if fmt == 'JPEG': img = _rotate(img) elif fmt == 'GIF': img.seek(0)