# Path: screenchop/config.py
# HOST = config.get('app', 'HOST')
# PORT = int(config.get('app', 'PORT'))
# DEBUG = config.getboolean('app', 'DEBUG')
# TEMP_FILE_DIR = config.get('app', 'TEMP_FILE_DIR')
# SESSION_KEY = config.get('app', 'SESSION_KEY')
# DOMAIN_URL = config.get('app', 'DOMAIN_URL')
# SHORT_DOMAIN_URL = config.get('app', 'SHORT_DOMAIN_URL')
# ADMIN_EMAIL = config.get('app', 'ADMIN_EMAIL')
# EXCEPTION_EMAIL = config.get('app', 'EXCEPTION_EMAIL').split(',')
# CACHE_TYPE = config.get('caching', 'CACHE_TYPE')
# CACHE_SERVER_ADDRESS = config.get('caching', 'CACHE_SERVER_ADDRESS').split()
# CACHE_DEFAULT_TIMEOUT = config.getint('caching', 'CACHE_DEFAULT_TIMEOUT')
# MONGO_DATABASE = config.get('mongodb', 'DATABASE')
# MONGO_HOST = config.get('mongodb', 'HOST')
# MONGO_PORT = int(config.get('mongodb', 'PORT'))
# MONGO_USER = config.get('mongodb', 'USER')
# MONGO_PASS = config.get('mongodb', 'PASS')
# BUCKET_NAME = config.get('s3', 'BUCKET_NAME')
# AWS_ACCESS_KEY_ID = config.get('s3', 'AWS_ACCESS_KEY_ID')
# AWS_SECRET_ACCESS_KEY = config.get('s3', 'AWS_SECRET_ACCESS_KEY')
# S3_THUMBS_URL = config.get('s3', 'S3_THUMBS_URL')
# S3_MEDIUM_URL = config.get('s3', 'S3_MEDIUM_URL')
# S3_FULL_URL = config.get('s3', 'S3_FULL_URL')
# S3_AVATAR_URL = config.get('s3', 'S3_AVATAR_URL')
# REGISTRATION_LEVEL = config.get('registration', 'REGISTRATION_LEVEL')
# MAX_IMAGES_PER_ROW = int(config.get('gallery', 'MAX_IMAGES_PER_ROW'))
# HOME_MAX_IMAGES = int(config.get('gallery', 'HOME_MAX_IMAGES'))
# TAGGING_ENABLED = config.getboolean('gallery', 'TAGGING_ENABLED')
# ALLOWED_FILE_TYPES = config.get('upload', 'ALLOWED_FILE_TYPES').split(',')
# THUMB_MAX_WIDTH = int(config.get('upload', 'THUMB_MAX_WIDTH'))
# THUMB_MAX_HEIGHT = int(config.get('upload', 'THUMB_MAX_HEIGHT'))
# MEDIUM_MAX_WIDTH = int(config.get('upload', 'MEDIUM_MAX_WIDTH'))
# MEDIUM_MAX_HEIGHT = int(config.get('upload', 'MEDIUM_MAX_HEIGHT'))
# GOOGLE_ANALYTICS_ACCOUNT = config.get('marketing', 'GOOGLE_ANALYTICS_ACCOUNT')
# 
# Path: screenchop/forms.py
# class RegistrationForm(Form):
#     username = TextField('Username', [
#         validators.Length(min=3, max=20),
#         validators.Required(message='Username must be between 3 and 20 characters long.')])
#     password = PasswordField('New Password', [
#         validators.Required(message='Password required'),
#         validators.EqualTo('confirm', message='Passwords must match')
#     ])
#     if config.REGISTRATION_LEVEL == 'invite':
#         invite_code = TextField('Invitation Code', [validators.Required(message='Invitation code required')])
#     else:
#         pass
#     confirm = PasswordField('Repeat Password')
#     accept_tos = BooleanField('Terms of Service', [validators.Required(message='You must agree to the Terms of Service')])
# 
# class LoginForm(Form):
#     username = TextField('Username')
#     password = PasswordField('Password')
# 
# Path: screenchop/util/invite_codes.py
# class InviteCode(object):
#     """ Class to check if a code is valid and/or to use the code """    
# 
#     def is_valid(self, code):
#         try:
#             # Query code to check if valid
#             checkCode = Invite_code.objects.get(code=code)
#             
#             # If valid, return True, if not, False
#             if checkCode.valid == False:
#                 return False
#             
#             return True
#         
#         # Exception = False. Usually because query is not found
#         except:
#             return False
#     
#     def use_code(self, code, user):
#         """ Code to use the code, timestamp with user """
#         code = Invite_code.objects.get(code=code)
#         code.valid = False
#         code.date_used = strftime("%Y-%m-%d_%H-%M-%S")
#         code.used_by = user
#         code.save()
#         return True


import sys, traceback
from functools import wraps
from flask import Flask
from flask import request, redirect, url_for, session, flash
from flask import render_template, jsonify
from flaskext.bcrypt import check_password_hash, generate_password_hash
from screenchop.models import *
from screenchop import config
from screenchop.forms import RegistrationForm, LoginForm
from screenchop.util.invite_codes import InviteCode
    if request.method == 'POST' and form.validate():
    
        # Code to support if invite registration mode is enabled.
        if config.REGISTRATION_LEVEL == 'invite':
        
            c = InviteCode()

            # Check if invite code is valid
            if c.is_valid(form.invite_code.data) == False: 
                error = {"code": ["Invitation code invalid"]}
                return jsonify(errors=error)
        else:
            pass
            
        # Check or create if user does not exist
        #user, created = User.objects.get_or_create(username__exact=form.username.data)
        try:
            user = User.objects.get(username__iexact=form.username.data)
            created = False 
        except:
            user = User(username=form.username.data)
            created = True
        
        # if created == True, then create a password, save and login session
        if created:
            # Set password and save
            user.password = generate_password_hash(form.password.data)
            user.save()

            # If invite-mode on, use invite code

# Path: screenchop/config.py
# HOST = config.get('app', 'HOST')
# PORT = int(config.get('app', 'PORT'))
# DEBUG = config.getboolean('app', 'DEBUG')
# TEMP_FILE_DIR = config.get('app', 'TEMP_FILE_DIR')
# SESSION_KEY = config.get('app', 'SESSION_KEY')
# DOMAIN_URL = config.get('app', 'DOMAIN_URL')
# SHORT_DOMAIN_URL = config.get('app', 'SHORT_DOMAIN_URL')
# ADMIN_EMAIL = config.get('app', 'ADMIN_EMAIL')
# EXCEPTION_EMAIL = config.get('app', 'EXCEPTION_EMAIL').split(',')
# CACHE_TYPE = config.get('caching', 'CACHE_TYPE')
# CACHE_SERVER_ADDRESS = config.get('caching', 'CACHE_SERVER_ADDRESS').split()
# CACHE_DEFAULT_TIMEOUT = config.getint('caching', 'CACHE_DEFAULT_TIMEOUT')
# MONGO_DATABASE = config.get('mongodb', 'DATABASE')
# MONGO_HOST = config.get('mongodb', 'HOST')
# MONGO_PORT = int(config.get('mongodb', 'PORT'))
# MONGO_USER = config.get('mongodb', 'USER')
# MONGO_PASS = config.get('mongodb', 'PASS')
# BUCKET_NAME = config.get('s3', 'BUCKET_NAME')
# AWS_ACCESS_KEY_ID = config.get('s3', 'AWS_ACCESS_KEY_ID')
# AWS_SECRET_ACCESS_KEY = config.get('s3', 'AWS_SECRET_ACCESS_KEY')
# S3_THUMBS_URL = config.get('s3', 'S3_THUMBS_URL')
# S3_MEDIUM_URL = config.get('s3', 'S3_MEDIUM_URL')
# S3_FULL_URL = config.get('s3', 'S3_FULL_URL')
# S3_AVATAR_URL = config.get('s3', 'S3_AVATAR_URL')
# REGISTRATION_LEVEL = config.get('registration', 'REGISTRATION_LEVEL')
# MAX_IMAGES_PER_ROW = int(config.get('gallery', 'MAX_IMAGES_PER_ROW'))
# HOME_MAX_IMAGES = int(config.get('gallery', 'HOME_MAX_IMAGES'))
# TAGGING_ENABLED = config.getboolean('gallery', 'TAGGING_ENABLED')
# ALLOWED_FILE_TYPES = config.get('upload', 'ALLOWED_FILE_TYPES').split(',')
# THUMB_MAX_WIDTH = int(config.get('upload', 'THUMB_MAX_WIDTH'))
# THUMB_MAX_HEIGHT = int(config.get('upload', 'THUMB_MAX_HEIGHT'))
# MEDIUM_MAX_WIDTH = int(config.get('upload', 'MEDIUM_MAX_WIDTH'))
# MEDIUM_MAX_HEIGHT = int(config.get('upload', 'MEDIUM_MAX_HEIGHT'))
# GOOGLE_ANALYTICS_ACCOUNT = config.get('marketing', 'GOOGLE_ANALYTICS_ACCOUNT')
# 
# Path: screenchop/forms.py
# class RegistrationForm(Form):
#     username = TextField('Username', [
#         validators.Length(min=3, max=20),
#         validators.Required(message='Username must be between 3 and 20 characters long.')])
#     password = PasswordField('New Password', [
#         validators.Required(message='Password required'),
#         validators.EqualTo('confirm', message='Passwords must match')
#     ])
#     if config.REGISTRATION_LEVEL == 'invite':
#         invite_code = TextField('Invitation Code', [validators.Required(message='Invitation code required')])
#     else:
#         pass
#     confirm = PasswordField('Repeat Password')
#     accept_tos = BooleanField('Terms of Service', [validators.Required(message='You must agree to the Terms of Service')])
# 
# class LoginForm(Form):
#     username = TextField('Username')
#     password = PasswordField('Password')
# 
# Path: screenchop/util/invite_codes.py
# class InviteCode(object):
#     """ Class to check if a code is valid and/or to use the code """    
# 
#     def is_valid(self, code):
#         try:
#             # Query code to check if valid
#             checkCode = Invite_code.objects.get(code=code)
#             
#             # If valid, return True, if not, False
#             if checkCode.valid == False:
#                 return False
#             
#             return True
#         
#         # Exception = False. Usually because query is not found
#         except:
#             return False
#     
#     def use_code(self, code, user):
#         """ Code to use the code, timestamp with user """
#         code = Invite_code.objects.get(code=code)
#         code.valid = False
#         code.date_used = strftime("%Y-%m-%d_%H-%M-%S")
#         code.used_by = user
#         code.save()
#         return True


# Path: screenchop/sessions.py
import sys, traceback
from functools import wraps
from flask import Flask
from flask import request, redirect, url_for, session, flash
from flask import render_template, jsonify
from flaskext.bcrypt import check_password_hash, generate_password_hash
from screenchop.models import *
from screenchop import config
from screenchop.forms import RegistrationForm, LoginForm
from screenchop.util.invite_codes import InviteCode

    if request.method == 'POST' and form.validate():
    
        # Code to support if invite registration mode is enabled.
        if config.REGISTRATION_LEVEL == 'invite':
        
            c = InviteCode()

            # Check if invite code is valid
            if c.is_valid(form.invite_code.data) == False: 
                error = {"code": ["Invitation code invalid"]}
                return jsonify(errors=error)
        else:
            pass
            
        # Check or create if user does not exist
        #user, created = User.objects.get_or_create(username__exact=form.username.data)
        try:
            user = User.objects.get(username__iexact=form.username.data)
            created = False 
        except:
            user = User(username=form.username.data)
            created = True
        
        # if created == True, then create a password, save and login session
        if created:
            # Set password and save
            user.password = generate_password_hash(form.password.data)
            user.save()

            # If invite-mode on, use invite code

            if config.REGISTRATION_LEVEL == 'invite':