Blame model/rights.py

Ivan Mahonin b838e2
Ivan Mahonin b838e2
Ivan Mahonin b838e2
class Right:
Ivan Mahonin b838e2
  def __init__(self, row):
Ivan Mahonin b838e2
    self.user_id = int(row['user_id'])
Ivan Mahonin b838e2
    self.target_type = str(row['target_type'])
Ivan Mahonin b838e2
    self.target_id = int(row['target_id'])
Ivan Mahonin b838e2
    self.mode = str(row['mode'])
Ivan Mahonin b838e2
Ivan Mahonin b838e2
Ivan Mahonin b838e2
class MyRights:
Ivan Mahonin e146e6
  def __init__(self, internal, model):
Ivan Mahonin b838e2
    self.internal = internal
Ivan Mahonin e146e6
    self.model = model
Ivan Mahonin b838e2
    self.user_id = self.internal.user_id
Ivan Mahonin e146e6
    self.user = None
Ivan Mahonin e146e6
    
Ivan Mahonin e146e6
  def get_user():
Ivan Mahonin e146e6
    if self.user_id:
Ivan Mahonin e146e6
      assert self.user
Ivan Mahonin e146e6
      return None
Ivan Mahonin e146e6
    if not self.user:
Ivan Mahonin e146e6
      self.model.users.get_by_id(self.user_id)
Ivan Mahonin e146e6
      assert self.user
Ivan Mahonin e146e6
    return self.user
Ivan Mahonin b838e2
    
Ivan Mahonin b838e2
  def issuperuser(self):
Ivan Mahonin b838e2
    return self.internal.issuperuser()
Ivan Mahonin b838e2
Ivan Mahonin b838e2
  def isallowed(self, target_type, target_id, mode):
Ivan Mahonin b838e2
    return self.internal.isallowed(target_type, target_id, mode)
Ivan Mahonin b838e2
Ivan Mahonin b838e2
  def isallowed_root(self, mode):
Ivan Mahonin b838e2
    return self.internal.isallowed_root(mode)
Ivan Mahonin b838e2
Ivan Mahonin b838e2
Ivan Mahonin b838e2
class InternalRights:
Ivan Mahonin b838e2
  TABLE = 'rights'
Ivan Mahonin b838e2
  ROOT = 'root'
Ivan Mahonin b838e2
Ivan Mahonin b838e2
  def __init__(self, connection, user_id = 0, superuser = False):
Ivan Mahonin b838e2
    assert(type(user_id) is int)
Ivan Mahonin b838e2
    assert(type(superuser) is bool)
Ivan Mahonin b838e2
    self.connection = connection
Ivan Mahonin b838e2
    self.user_id = user_id
Ivan Mahonin b838e2
    self.superuser = superuser
Ivan Mahonin b838e2
    
Ivan Mahonin b838e2
  def issuperuser(self):
Ivan Mahonin b838e2
    if self.superuser:
Ivan Mahonin b838e2
      return True
Ivan Mahonin b838e2
    if self.user_id and self.get(self.user_id, self.ROOT, 0, self.ROOT):
Ivan Mahonin b838e2
      return True
Ivan Mahonin b838e2
    
Ivan Mahonin b838e2
  def isallowed(self, target_type, target_id, mode):
Ivan Mahonin b838e2
    if self.issuperuser():
Ivan Mahonin b838e2
      return True
Ivan Mahonin b838e2
    if self.user_id and self.get(self.user_id, target_type, target_id, mode):
Ivan Mahonin b838e2
      return True
Ivan Mahonin e146e6
    if self.get(0, target_type, target_id, mode):
Ivan Mahonin e146e6
      return True
Ivan Mahonin b838e2
    return False
Ivan Mahonin b838e2
Ivan Mahonin b838e2
  def build_where(self, user_id = None, target_type = None, target_id = None, mode = None):
Ivan Mahonin b838e2
    where = list()
Ivan Mahonin b838e2
    args = list()
Ivan Mahonin e146e6
    if not user_id is None:
Ivan Mahonin b838e2
      assert(type(user_id) is int)
Ivan Mahonin b838e2
      where.append("`user_id`=%d")
Ivan Mahonin b838e2
      args.append(user_id)
Ivan Mahonin e146e6
    if not target_type is None:
Ivan Mahonin b838e2
      assert(type(target_type) is str)
Ivan Mahonin b838e2
      where.append("`target_type`=%s")
Ivan Mahonin b838e2
      args.append(target_type)
Ivan Mahonin e146e6
    if not target_id is None:
Ivan Mahonin b838e2
      assert(type(target_id) is int)
Ivan Mahonin b838e2
      where.append("`target_id`=%d")
Ivan Mahonin b838e2
      args.append(target_id)
Ivan Mahonin e146e6
    if not mode is None:
Ivan Mahonin b838e2
      assert(type(mode) is str)
Ivan Mahonin b838e2
      where.append("`mode`=%s")
Ivan Mahonin b838e2
      args.append(mode)
Ivan Mahonin b838e2
    if not where:
Ivan Mahonin b838e2
      return '', list()
Ivan Mahonin b838e2
    return ' WHERE ' + ' AND '.join(where), args
Ivan Mahonin b838e2
    
Ivan Mahonin b838e2
  def get_list(self, user_id = None, target_type = None, target_id = None, mode = None):
Ivan Mahonin b838e2
    where, args = self.build_where(user_id, target_type, target_id, mode)
Ivan Mahonin e146e6
    rows = self.connection.query_dict('SELECT * FROM %T' + where, self.TABLE, *args)
Ivan Mahonin b838e2
    rights = list()
Ivan Mahonin b838e2
    for row in rows:
Ivan Mahonin b838e2
      rights.append( Right(row) )
Ivan Mahonin b838e2
    return rights
Ivan Mahonin b838e2
  
Ivan Mahonin b838e2
  def delete_list(self, user_id = None, target_type = None, target_id = None, mode = None):
Ivan Mahonin b838e2
    where, args = self.build_where(user_id, target_type, target_id, mode)
Ivan Mahonin b838e2
    self.connection.execute('DELETE FROM %T' + where, self.TABLE, *args)
Ivan Mahonin b838e2
    self.connection.cache.reset(self.TABLE)
Ivan Mahonin b838e2
Ivan Mahonin b838e2
  def reset_cache(self, user_id, target_type, target_id, mode):
Ivan Mahonin b838e2
    assert(type(user_id) is int)
Ivan Mahonin b838e2
    assert(type(target_type) is str)
Ivan Mahonin b838e2
    assert(type(target_id) is int)
Ivan Mahonin b838e2
    assert(type(mode) is str)
Ivan Mahonin b838e2
    self.connection.cache.reset(
Ivan Mahonin b838e2
      self.TABLE,
Ivan Mahonin b838e2
      { 'user_id': user_id,
Ivan Mahonin b838e2
        'target_type': target_type,
Ivan Mahonin b838e2
        'target_id': target_id,
Ivan Mahonin b838e2
        'mode': mode })
Ivan Mahonin b838e2
  
Ivan Mahonin b838e2
  def get(self, user_id, target_type, target_id, mode):
Ivan Mahonin b838e2
    assert(type(user_id) is int)
Ivan Mahonin b838e2
    assert(type(target_type) is str)
Ivan Mahonin b838e2
    assert(type(target_id) is int)
Ivan Mahonin b838e2
    assert(type(mode) is str)
Ivan Mahonin b838e2
    rows = self.connection.cache.select(
Ivan Mahonin b838e2
      self.TABLE,
Ivan Mahonin b838e2
      { 'user_id': user_id,
Ivan Mahonin b838e2
        'target_type': target_type,
Ivan Mahonin b838e2
        'target_id': target_id,
Ivan Mahonin b838e2
        'mode': mode })
Ivan Mahonin b838e2
    return bool(rows)
Ivan Mahonin b838e2
Ivan Mahonin b838e2
  def set(self, user_id, target_type, target_id, mode, allowed):
Ivan Mahonin b838e2
    assert(type(user_id) is int)
Ivan Mahonin b838e2
    assert(type(target_type) is str)
Ivan Mahonin b838e2
    assert(type(target_id) is int)
Ivan Mahonin b838e2
    assert(type(mode) is str)
Ivan Mahonin b838e2
    if not allowed:
Ivan Mahonin b838e2
      self.connection.execute(
Ivan Mahonin b838e2
        '''DELETE FROM %T WHERE
Ivan Mahonin b838e2
                `user_id`=%d
Ivan Mahonin b838e2
            AND `target_type`=%s
Ivan Mahonin b838e2
            AND `target_id`=%d
Ivan Mahonin b838e2
            AND `mode`=%s''',
Ivan Mahonin b838e2
        self.TABLE, user_id, target_type, target_id, mode )
Ivan Mahonin b838e2
      self.reset_cache(user_id, target_type, target_id, mode)
Ivan Mahonin b838e2
    elif not self.get(user_id, target_type, target_id, mode):
Ivan Mahonin b838e2
      self.connection.execute(
Ivan Mahonin b838e2
        '''INSERT INTO %T SET
Ivan Mahonin b838e2
                `user_id`=%d,
Ivan Mahonin b838e2
                `target_type`=%s,
Ivan Mahonin b838e2
                `target_id`=%d,
Ivan Mahonin b838e2
                `mode`=%s''',
Ivan Mahonin b838e2
        self.TABLE, user_id, target_type, target_id, mode )
Ivan Mahonin b838e2
      self.reset_cache(user_id, target_type, target_id, mode)
Ivan Mahonin b838e2
      
Ivan Mahonin b838e2
  def isallowed_root(self, mode):
Ivan Mahonin b838e2
    return self.isallowed(self.ROOT, 0, mode)
Ivan Mahonin b838e2
  def get_list_root(self, user_id = None, mode = None):
Ivan Mahonin b838e2
    return self.get_list(user_id, self.ROOT, 0, mode)
Ivan Mahonin b838e2
  def delete_list_root(self, user_id = None, mode = None):
Ivan Mahonin b838e2
    return self.delete_list_root(user_id, self.ROOT, 0, mode)
Ivan Mahonin b838e2
  def get_root(self, user_id, mode):
Ivan Mahonin b838e2
    return self.get(user_id, self.ROOT, 0, mode)
Ivan Mahonin b838e2
  def set_root(self, user_id, mode, allowed):
Ivan Mahonin b838e2
    return self.set(user_id, self.ROOT, 0, mode, allowed)
Ivan Mahonin b838e2
Ivan Mahonin b838e2
  def get_superuser(self, user_id):
Ivan Mahonin b838e2
    return self.get_root(user_id, self.ROOT)
Ivan Mahonin b838e2
  def set_superuser(self, user_id, allowed):
Ivan Mahonin b838e2
    return self.set_root(user_id, self.ROOT, allowed)
Ivan Mahonin b838e2