Blob Blame Raw


import exception
from action.action import Action


class UserBase(Action):
  def parse_user_id(self, request):
    user_id = 0
    try:
      user_id = int(request.postvars.get('user_id', 0))
    except Exception:
      raise exception.ActionError( request.t('Used Id incorrect') )
    if not user_id:
      user_id = self.model.myrights.user_id
    if not user_id:
      raise exception.ActionError( request.t('Used Id incorrect') )
    return user_id
  

class UserLogin(UserBase):
  def __init__(self):
    super().__init__()
    self.readonly = True
  
  def process(self, request):
    login = str(request.postvars.get('login', ''))
    password = str(request.postvars.get('password', ''))
    if not login and not password:
      request.server.sessions.close_session(request)
    else:
      user_id = request.model.users.check_password(login, password)
      if not user_id:
        raise exception.ActionError( request.t('Login or password incorrect') )
      request.server.sessions.create_session(request, user_id)
    return request.answer.complete_redirect()


class UserCreate(UserBase):
  def process(self, request):
    login = str(request.postvars.get('login', ''))
    password = str(request.postvars.get('password', ''))
    passwordretry = str(request.postvars.get('passwordretry', ''))
    if password != passwordretry:
      raise exception.ActionError( request.t('Passwords mismatch') )
    name = str(request.postvars.get('name', ''))

    user = None
    try:
      user = request.model.users.create(login, password, name)
    except Exception as e:
      self.propagate_exception(e)

    request.connection.commit()
    return request.answer.complete_redirect(['user', str(user.id)])


class UserUpdate(UserBase):
  def process(self, request):
    user_id = self.parse_user_id(request)
    name = str(request.postvars.get('name', ''))
    
    user = request.model.users.get_by_id(user_id)
    if not user:
      raise exception.ActionError( request.t('Used not found') )
    
    try:
      user.update(name)
    except Exception as e:
      self.propagate_exception(e)

    request.connection.commit()
    return request.answer.complete_redirect(['user', str(user.id)])
    

class UserDelete(UserBase):
  def process(self, request):
    user_id = self.parse_user_id(request)
    password = request.postvars.get('password', '')
    if not password is None:
      password = str(password)
    
    user = request.model.users.get_by_id(user_id)
    if not user:
      raise exception.ActionError( request.t('Used not found') )
    
    try:
      user.delete(password)
    except Exception as e:
      self.propagate_exception(e)

    request.connection.commit()
    return request.answer.complete_redirect([])
    

class UserSetPassword(UserBase):
  def process(self, request):
    user_id = self.parse_user_id(request)
    oldpassword = request.postvars.get('oldpassword', '')
    newpassword = str(request.postvars.get('newpassword', ''))
    newpasswordretry = str(request.postvars.get('newpasswordretry', ''))
    if newpassword != newpasswordretry:
      raise exception.ActionError( request.t('Passwords mismatch') )
    if not oldpassword is None:
      oldpassword = str(oldpassword)
    
    user = request.model.users.get_by_id(user_id)
    if not user:
      raise exception.ActionError( request.t('Used not found') )
    
    try:
      user.change_password(newpassword, oldpassword)
    except Exception as e:
      self.propagate_exception(e)

    request.connection.commit()
    return request.answer.complete_redirect(['user', str(user.id)])
    

class UserSetSuperuser(UserBase):
  def process(self, request):
    user_id = self.parse_user_id(request)
    superuser = bool(request.postvars.get('superuser', False))
    
    user = request.model.users.get_by_id(user_id)
    if not user:
      raise exception.ActionError( request.t('User not found') )
    
    try:
      user.set_superuser(superuser)
    except Exception as e:
      self.propagate_exception(e)

    request.connection.commit()
    return request.answer.complete_redirect(['user', str(user.id)])


actions = {
  'login'        : UserLogin(),
  'create'       : UserCreate(),
  'update'       : UserUpdate(),
  'delete'       : UserDelete(),
  'setpassword'  : UserSetPassword(),
  'setsuperuser' : UserSetSuperuser(),
}