Esempio n. 1
0
 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)
Esempio n. 2
0
 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)
Esempio n. 3
0
    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
Esempio n. 4
0
    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
Esempio n. 5
0
    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
Esempio n. 6
0
    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)
Esempio n. 7
0
    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
Esempio n. 8
0
    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)
Esempio n. 9
0
    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))
Esempio n. 10
0
    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))
Esempio n. 11
0
    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
Esempio n. 12
0
    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
Esempio n. 13
0
    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)
Esempio n. 14
0
    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)
Esempio n. 15
0
 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)
Esempio n. 16
0
 def del_account(self, type, address):
     self.accounts_del.append((type, address))
     cache_del("addr_id_login:%s" % address)
Esempio n. 17
0
 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)
Esempio n. 18
0
    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))
Esempio n. 19
0
 def del_account(self, type, address):
     self.accounts_del.append((type, address))
     cache_del("addr_id_login:%s" % address)
Esempio n. 20
0
 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)
Esempio n. 21
0
    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))
Esempio n. 22
0
        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)
Esempio n. 23
0
 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)