def createdb(): """Create a new empty database with a single administrator.""" print("* Creating database schema") # Create the database schema db.create_all() print("* Adding alembic stamp") # Create alembic_version table migrations_directory = current_app.extensions['migrate'].directory config = alembic.config.Config( os.path.join(migrations_directory, 'alembic.ini')) config.set_main_option('script_location', migrations_directory) alembic.command.stamp(config, "head") # Add required groups print("* Adding 'all','administrators' and 'BC' groups") _add_group('all') _add_group('administrators') _add_group('BC') # Add educations, which must be present to create the administrator user print("* Adding educations") education_names = [ "BSc Informatica", "BSc Kunstmatige Intelligentie", "BSc Informatiekunde", "MSc Information Studies", "MSc Software Engineering", "MSc System and Network Engineering", "MSc Artificial Intelligence", "MSc Logic", "MSc Computational Science", "MSc Computer Science", "MSc Medical Informatics", "MSc Grid Computing", "Other", "Minor programmeren", "Minor Informatica", "Minor Kunstmatige Intelligentie"] db.session.bulk_save_objects(Education(name) for name in education_names) db.session.commit() # Add some default navigation print("* Adding default navigation entries") navigation_entries = [ ('via', 'via', '/via', False, [ ('Nieuws', 'News', '/news/', False, []), ('PimPy', 'PimPy', '/pimpy', False, []), ('Commissies', 'Committees', '/commissie', False, []), ('Admin', 'Admin', '/admin', False, [ ('Navigatie', 'Navigation', '/navigation', False, []), ('Formulieren', 'Forms', '/forms', False, []), ('Redirect', 'Redirect', '/redirect', False, []), ('Users', 'Users', '/users', False, []), ('Groups', 'Groups', '/groups', False, []), ('Files', 'Files', '/files', False, []) ]), ]), ('Activiteiten', 'Activities', '/activities', True, [ ('Activiteiten Archief', 'Activities archive', '/activities/archive', False, []), ('Activiteiten Overzicht', 'Activities overview', '/activities/view', False, []) ]), ('Vacatures', 'Vacancies', '/vacancies/', False, []), ('Tentamenbank', 'Examinations', '/examination', False, []), ('Samenvattingen', 'Summaries', '/summary', False, []) ] _add_navigation(navigation_entries) print("* Adding administrator user") first_name = prompt("\tFirst name") last_name = prompt("\tLast name") email_regex = re.compile("^[^@]+@[^@]+\.[^@]+$") while True: email = prompt("\tEmail") if email_regex.match(email): break print("\tInvalid email address: " + email) while True: passwd_plain = prompt_pass("\tPassword") passwd_plain_rep = prompt_pass("\tRepeat password") if passwd_plain == passwd_plain_rep: break print("\tPasswords do not match") passwd = bcrypt.hashpw(passwd_plain, bcrypt.gensalt()) admin = User( first_name=first_name, last_name=last_name, email=email, password=passwd, education_id=Education.query.first().id) admin.has_paid = True _add_user(admin, True, "A user with email '{}' already exists".format(email)) # Add admin user to administrators group admin_group = Group.query.filter_by(name='administrators').first() admin_group.add_user(admin) db.session.commit() # Grant read/write privilege to administrators group on every module db.session.bulk_save_objects( GroupPermission(module, admin_group.id, 2) for module in app.blueprints.keys()) db.session.commit() print("Done!")
def edit(user_id=None): """Create user for admins and edit for admins and users.""" if not ModuleAPI.can_write('user') and\ (current_user.is_anonymous or current_user.id != user_id): return abort(403) # Select user if user_id: user = User.query.get_or_404(user_id) else: user = User() user.avatar = UserAPI.has_avatar(user_id) if ModuleAPI.can_write('user'): form = EditUserForm(request.form, user) is_admin = True else: form = EditUserInfoForm(request.form, user) is_admin = False # Add education. educations = Education.query.all() form.education_id.choices = [(e.id, e.name) for e in educations] def edit_page(): return render_template('user/edit.htm', form=form, user=user, is_admin=is_admin) if form.validate_on_submit(): # Only new users need a unique email. query = User.query.filter(User.email == form.email.data) if user_id: query = query.filter(User.id != user_id) if query.count() > 0: flash(_('A user with this e-mail address already exist.'), 'danger') return edit_page() # Because the user model is constructed to have an ID of 0 when it is # initialized without an email adress provided, reinitialize the user # with a default string for email adress, so that it will get a unique # ID when committed to the database. if not user_id: user = User('_') group = Group.query.filter(Group.name == 'all').first() group.add_user(user) try: user.update_email(form.email.data.strip()) except HttpError as e: if e.resp.status == 404: flash(_('According to Google this email does not exist. ' 'Please use an email that does.'), 'danger') return edit_page() raise(e) user.first_name = form.first_name.data.strip() user.last_name = form.last_name.data.strip() user.locale = form.locale.data if ModuleAPI.can_write('user'): user.has_paid = form.has_paid.data user.honorary_member = form.honorary_member.data user.favourer = form.favourer.data user.disabled = form.disabled.data user.alumnus = form.alumnus.data user.student_id = form.student_id.data.strip() user.education_id = form.education_id.data user.birth_date = form.birth_date.data user.study_start = form.study_start.data user.receive_information = form.receive_information.data user.phone_nr = form.phone_nr.data.strip() user.address = form.address.data.strip() user.zip = form.zip.data.strip() user.city = form.city.data.strip() user.country = form.country.data.strip() if form.password.data != '': user.password = bcrypt.hashpw(form.password.data, bcrypt.gensalt()) db.session.add(user) db.session.add(group) db.session.commit() avatar = request.files['avatar'] if avatar: UserAPI.upload(avatar, user.id) if user_id: copernica.update_user(user) flash(_('Profile succesfully updated')) else: copernica.update_user(user, subscribe=True) flash(_('Profile succesfully created')) return redirect(url_for('user.view_single', user_id=user.id)) else: flash_form_errors(form) return edit_page()