# Path: ddserver/utils/deps.py
# def extend(self, extend):
#   ''' Extends this export.
# 
#       The instance created by the wrapped factory is extended by passing the
#       created instance to the given extend function after creation.
# 
#       The extend function must accept the instance as its only argument. If
#       the function returns a value which is not None, the instance is replaced
#       with the returned value.
#   '''
# 
#   assert self.__instance is None
# 
#   self.__extends.append(extend)
# 
# def require(**requirements):
#   ''' Decorator to inject requirements into a function.
# 
#       The decorated function is called with a named argument for each
#       specified requirement containing the exported instances.
#   '''
# 
#   exports = {name : Export.load(requirement)
#              for name, requirement
#              in requirements.iteritems()}
# 
#   def wrapper(func):
#     def wrapped(*args, **kwargs):
#       # Update the keyword arguments with the required instances
#       kwargs.update({name : export.instance
#                      for name, export
#                      in exports.iteritems()
#                      if name not in kwargs})
# 
#       return func(*args,
#                   **kwargs)
# 
#     wrapped.__name__ = func.__name__
# 
#     return wrapped
#   return wrapper
# 
# Path: ddserver/interface/user.py
# @property
# @require(session = 'ddserver.interface.session:SessionManager')
# def authorized(self, session):
#   if session.username:
#     return self[session.username]
# 
# Path: ddserver/interface/user.py
# def authorized_by_code():
#   ''' Checks if a valid username and authcode is passed. '''
# 
#   def wrapper(func):
#     @require(users = 'ddserver.interface.user:UserManager',
#              messages = 'ddserver.interface.message:MessageManager')
#     def wrapped(users,
#                 messages,
#                 *args,
#                 **kwargs):
#       if (bottle.request.query.username == "" or
#          bottle.request.query.authcode == ""):
#         messages.error('You have to provide username and authcode.')
#         bottle.redirect('/')
# 
#       username = bottle.request.query.username
#       authcode = bottle.request.query.authcode
# 
#       user = users[username]
# 
#       if user == None:
#         messages.error('The username does not exist.')
#         bottle.redirect('/')
# 
#       if user.authcode != authcode:
#         messages.error('The auth code you provided was invalid.')
#         bottle.redirect('/')
# 
#       # Inject the user in the wrapped function
#       return func(*args,
#                   user = user,
#                   **kwargs)
# 
#     return wrapped
#   return wrapper


import bottle
from ddserver.web import route
from ddserver.utils.deps import extend, require
from ddserver.interface.user import authorized
from ddserver.interface.user import authorized_by_code
from ddserver.interface import validation
from ddserver.interface.validation import validate
from passlib.apps import custom_app_context as pwd









@extend('ddserver.config:ConfigDeclaration')
def config_auth(config_decl):
  with config_decl.declare('auth') as s:
    s('password_min_chars',
       conv = int,
       default = 8)



@route('/user/account', method = 'GET')
@authorized()
@require(template = 'ddserver.interface.template:TemplateManager')
def get_account(user,
                template):
  ''' Display account information. '''

  return template['account.html'](data = user)



@route('/user/account', method = 'POST')

# Path: ddserver/utils/deps.py
# def extend(self, extend):
#   ''' Extends this export.
# 
#       The instance created by the wrapped factory is extended by passing the
#       created instance to the given extend function after creation.
# 
#       The extend function must accept the instance as its only argument. If
#       the function returns a value which is not None, the instance is replaced
#       with the returned value.
#   '''
# 
#   assert self.__instance is None
# 
#   self.__extends.append(extend)
# 
# def require(**requirements):
#   ''' Decorator to inject requirements into a function.
# 
#       The decorated function is called with a named argument for each
#       specified requirement containing the exported instances.
#   '''
# 
#   exports = {name : Export.load(requirement)
#              for name, requirement
#              in requirements.iteritems()}
# 
#   def wrapper(func):
#     def wrapped(*args, **kwargs):
#       # Update the keyword arguments with the required instances
#       kwargs.update({name : export.instance
#                      for name, export
#                      in exports.iteritems()
#                      if name not in kwargs})
# 
#       return func(*args,
#                   **kwargs)
# 
#     wrapped.__name__ = func.__name__
# 
#     return wrapped
#   return wrapper
# 
# Path: ddserver/interface/user.py
# @property
# @require(session = 'ddserver.interface.session:SessionManager')
# def authorized(self, session):
#   if session.username:
#     return self[session.username]
# 
# Path: ddserver/interface/user.py
# def authorized_by_code():
#   ''' Checks if a valid username and authcode is passed. '''
# 
#   def wrapper(func):
#     @require(users = 'ddserver.interface.user:UserManager',
#              messages = 'ddserver.interface.message:MessageManager')
#     def wrapped(users,
#                 messages,
#                 *args,
#                 **kwargs):
#       if (bottle.request.query.username == "" or
#          bottle.request.query.authcode == ""):
#         messages.error('You have to provide username and authcode.')
#         bottle.redirect('/')
# 
#       username = bottle.request.query.username
#       authcode = bottle.request.query.authcode
# 
#       user = users[username]
# 
#       if user == None:
#         messages.error('The username does not exist.')
#         bottle.redirect('/')
# 
#       if user.authcode != authcode:
#         messages.error('The auth code you provided was invalid.')
#         bottle.redirect('/')
# 
#       # Inject the user in the wrapped function
#       return func(*args,
#                   user = user,
#                   **kwargs)
# 
#     return wrapped
#   return wrapper


# Path: ddserver/interface/pages/user/account.py
import bottle
from ddserver.web import route
from ddserver.utils.deps import extend, require
from ddserver.interface.user import authorized
from ddserver.interface.user import authorized_by_code
from ddserver.interface import validation
from ddserver.interface.validation import validate
from passlib.apps import custom_app_context as pwd










@extend('ddserver.config:ConfigDeclaration')
def config_auth(config_decl):
  with config_decl.declare('auth') as s:
    s('password_min_chars',
       conv = int,
       default = 8)



@route('/user/account', method = 'GET')
@authorized()
@require(template = 'ddserver.interface.template:TemplateManager')
def get_account(user,
                template):
  ''' Display account information. '''

  return template['account.html'](data = user)



@route('/user/account', method = 'POST')

@authorized()