From: Mark Holmquist Date: Sun, 11 Nov 2012 00:59:37 +0000 (-0800) Subject: Add a license preference field X-Git-Url: https://vcs.fsf.org/?a=commitdiff_plain;h=dc4dfbde350fdd9eac50448e42f2c8b209dd6ea8;p=mediagoblin.git Add a license preference field This feature is absolutely necessary. Now a user can simply define their default license and quickly go through a form, as opposed to stopping to click on the select and choosing the same option over and over again. Also added DB migration for the field, so that's working now, too. Rebased by Sebastian and made the default value to be unicode. Reviewed-by: Sebastian Spaeth --- diff --git a/mediagoblin/db/migrations.py b/mediagoblin/db/migrations.py index 80ec5269..3f43c789 100644 --- a/mediagoblin/db/migrations.py +++ b/mediagoblin/db/migrations.py @@ -184,3 +184,15 @@ def fix_CollectionItem_v0_constraint(db_conn): pass db_conn.commit() + + +@RegisterMigration(8, MIGRATIONS) +def add_license_preference(db): + metadata = MetaData(bind=db.bind) + + user_table = Table('core__users', metadata, autoload=True, + autoload_with=db.bind) + + col = Column('license_preference', Unicode, default=u'') + col.create(user_table) + db.commit() diff --git a/mediagoblin/db/models.py b/mediagoblin/db/models.py index 782bf869..7e2cc7d2 100644 --- a/mediagoblin/db/models.py +++ b/mediagoblin/db/models.py @@ -63,6 +63,7 @@ class User(Base, UserMixin): # Intented to be nullable=False, but migrations would not work for it # set to nullable=True implicitly. wants_comment_notification = Column(Boolean, default=True) + license_preference = Column(Unicode) verification_key = Column(Unicode) is_admin = Column(Boolean, default=False, nullable=False) url = Column(Unicode) diff --git a/mediagoblin/edit/forms.py b/mediagoblin/edit/forms.py index 293c3bb2..2673967b 100644 --- a/mediagoblin/edit/forms.py +++ b/mediagoblin/edit/forms.py @@ -65,8 +65,19 @@ class EditAccountForm(wtforms.Form): "Enter your old password to prove you own this account.")) new_password = wtforms.PasswordField( _('New password'), - [wtforms.validators.Length(min=6, max=30)], + [ + wtforms.validators.Optional(), + wtforms.validators.Length(min=6, max=30) + ], id="password") + license_preference = wtforms.SelectField( + _('License preference'), + [ + wtforms.validators.Optional(), + wtforms.validators.AnyOf([lic[0] for lic in licenses_as_choices()]), + ], + choices=licenses_as_choices(), + description=_('This will be your default license on upload forms.')) wants_comment_notification = wtforms.BooleanField( label=_("Email me when others comment on my media")) diff --git a/mediagoblin/edit/views.py b/mediagoblin/edit/views.py index c656c63f..88af22d8 100644 --- a/mediagoblin/edit/views.py +++ b/mediagoblin/edit/views.py @@ -219,45 +219,42 @@ def edit_profile(request, url_user=None): def edit_account(request): user = request.user form = forms.EditAccountForm(request.form, - wants_comment_notification=user.get('wants_comment_notification')) + wants_comment_notification=user.get('wants_comment_notification'), + license_preference=user.get('license_preference')) if request.method == 'POST': form_validated = form.validate() - #if the user has not filled in the new or old password fields - if not form.new_password.data and not form.old_password.data: - if form.wants_comment_notification.validate(form): - user.wants_comment_notification = \ - form.wants_comment_notification.data - user.save() - messages.add_message(request, - messages.SUCCESS, - _("Account settings saved")) - return redirect(request, - 'mediagoblin.user_pages.user_home', - user=user.username) - - #so the user has filled in one or both of the password fields - else: - if form_validated: - password_matches = auth_lib.bcrypt_check_password( - form.old_password.data, - user.pw_hash) - if password_matches: - #the entire form validates and the password matches - user.pw_hash = auth_lib.bcrypt_gen_password_hash( - form.new_password.data) - user.wants_comment_notification = \ - form.wants_comment_notification.data - user.save() - messages.add_message(request, - messages.SUCCESS, - _("Account settings saved")) - return redirect(request, - 'mediagoblin.user_pages.user_home', - user=user.username) - else: - form.old_password.errors.append(_('Wrong password')) + if form_validated and \ + form.wants_comment_notification.validate(form): + user.wants_comment_notification = \ + form.wants_comment_notification.data + + if form_validated and \ + form.new_password.data or form.old_password.data: + password_matches = auth_lib.bcrypt_check_password( + form.old_password.data, + user.pw_hash) + if password_matches: + #the entire form validates and the password matches + user.pw_hash = auth_lib.bcrypt_gen_password_hash( + form.new_password.data) + else: + form.old_password.errors.append(_('Wrong password')) + + if form_validated and \ + form.license_preference.validate(form): + user.license_preference = \ + form.license_preference.data + + if form_validated and not form.errors: + user.save() + messages.add_message(request, + messages.SUCCESS, + _("Account settings saved")) + return redirect(request, + 'mediagoblin.user_pages.user_home', + user=user.username) return render_to_response( request, diff --git a/mediagoblin/submit/views.py b/mediagoblin/submit/views.py index 2d609b31..38adf85f 100644 --- a/mediagoblin/submit/views.py +++ b/mediagoblin/submit/views.py @@ -41,7 +41,8 @@ def submit_start(request): """ First view for submitting a file. """ - submit_form = submit_forms.SubmitStartForm(request.form) + submit_form = submit_forms.SubmitStartForm(request.form, + license=request.user.get('license_preference')) if request.method == 'POST' and submit_form.validate(): if not ('file' in request.files diff --git a/mediagoblin/templates/mediagoblin/edit/edit_account.html b/mediagoblin/templates/mediagoblin/edit/edit_account.html index cfeb7281..89f559af 100644 --- a/mediagoblin/templates/mediagoblin/edit/edit_account.html +++ b/mediagoblin/templates/mediagoblin/edit/edit_account.html @@ -47,6 +47,10 @@

{{ form.wants_comment_notification }} {{ form.wants_comment_notification.label }}

+
+

{{ form.license_preference }} + {{ form.license_preference.label }}

+
{{ csrf_token }}