def new_language(request, project, subproject): obj = get_subproject(request, project, subproject) if not can_add_translation(request.user, obj.project): raise PermissionDenied() form = get_new_language_form(request, obj)(obj, request.POST) if form.is_valid(): langs = form.cleaned_data['lang'] if isinstance(langs, string_types): langs = [langs] for language in Language.objects.filter(code__in=langs): if obj.new_lang == 'contact': notify_new_language(obj, language, request.user) messages.success( request, _( "A request for a new translation has been " "sent to the project's maintainers." ) ) elif obj.new_lang == 'add': obj.add_new_language(language, request) else: messages.error( request, _('Invalid language chosen!') ) return redirect(obj)
def password(request): ''' Password change / set form. ''' if appsettings.DEMO_SERVER and request.user.username == 'demo': return deny_demo(request) do_change = False if not request.user.has_usable_password(): do_change = True change_form = None elif request.method == 'POST': change_form = PasswordChangeForm(request.POST) if change_form.is_valid(): cur_password = change_form.cleaned_data['password'] do_change = request.user.check_password(cur_password) if not do_change: messages.error( request, _('You have entered an invalid password.') ) else: change_form = PasswordChangeForm() if request.method == 'POST': form = PasswordForm(request.POST) if form.is_valid() and do_change: # Clear flag forcing user to set password redirect_page = '#auth' if 'show_set_password' in request.session: del request.session['show_set_password'] redirect_page = '' request.user.set_password( form.cleaned_data['password1'] ) request.user.save() # Update session hash update_session_auth_hash(request, request.user) messages.success( request, _('Your password has been changed.') ) return redirect_profile(redirect_page) else: form = PasswordForm() return render( request, 'accounts/password.html', { 'title': _('Change password'), 'change_form': change_form, 'form': form, } )
def mail_admins_contact(request, subject, message, context, sender): ''' Sends a message to the admins, as defined by the ADMINS setting. ''' LOGGER.info( 'contact form from %s', sender, ) if not settings.ADMINS: messages.error( request, _('Message could not be sent to administrator!') ) LOGGER.error( 'ADMINS not configured, can not send message!' ) return mail = EmailMultiAlternatives( '%s%s' % (settings.EMAIL_SUBJECT_PREFIX, subject % context), message % context, to=[a[1] for a in settings.ADMINS], headers={'Reply-To': sender}, ) mail.send(fail_silently=False) messages.success( request, _('Message has been sent to administrator.') )
def comment(request, pk): ''' Adds new comment. ''' translation = get_object_or_404(Unit, pk=pk) translation.check_acl(request) form = CommentForm(request.POST) if form.is_valid(): if form.cleaned_data['scope'] == 'global': lang = None else: lang = translation.translation.language Comment.objects.add( translation, request.user, lang, form.cleaned_data['comment'] ) messages.success(request, _('Posted new comment')) else: messages.error(request, _('Failed to add comment!')) return redirect(request.POST.get('next', translation))
def lock_translation(request, project, subproject, lang): obj = get_translation(request, project, subproject, lang) if not can_lock_translation(request.user, obj.subproject.project): raise PermissionDenied() if not obj.is_user_locked(request.user): obj.create_lock(request.user, True) messages.success(request, _('Translation is now locked for you.')) return redirect(obj)
def add_user(request, project): obj, form = check_user_form(request, project) if form is not None and obj.enable_acl: obj.add_user(form.cleaned_data['user']) messages.success( request, _('User has been added to this project.') ) return redirect_param( 'project', '#acl', project=obj.slug, )
def user_remove(request): if appsettings.DEMO_SERVER and request.user.username == "demo": return deny_demo(request) if request.method == "POST": remove_user(request.user) logout(request) messages.success(request, _("Your account has been removed.")) return redirect("home") return render(request, "accounts/removal.html")
def unlock_subproject(request, project, subproject): obj = get_subproject(request, project, subproject) if not can_lock_subproject(request.user, obj.project): raise PermissionDenied() obj.do_unlock(request.user) messages.success( request, _('Component is now open for translation updates.') ) return redirect(obj)
def unlock_project(request, project): obj = get_project(request, project) if not can_lock_subproject(request.user, obj): raise PermissionDenied() for subproject in obj.subproject_set.all(): subproject.do_unlock(request.user) messages.success( request, _('Project is now open for translation updates.') ) return redirect(obj)
def execute_locked(request, obj, message, call, *args, **kwargs): """ Helper function to catch possible lock exception. """ try: result = call(*args, **kwargs) # With False the call is supposed to show errors on its own if result is None or result: messages.success(request, message) except FileLockException: messages.error( request, _('Failed to lock the repository, another operation in progress.')) return redirect_param(obj, '#repository')
def lock_project(request, project): obj = get_project(request, project) if not can_lock_subproject(request.user, obj): raise PermissionDenied() obj.commit_pending(request) for subproject in obj.subproject_set.all(): subproject.do_lock(request.user) messages.success( request, _('All components are now locked for translation updates!')) return redirect(obj)
def lock_subproject(request, project, subproject): obj = get_subproject(request, project, subproject) if not can_lock_subproject(request.user, obj.project): raise PermissionDenied() obj.commit_pending(request) obj.do_lock(request.user) messages.success( request, _('Component is now locked for translation updates!') ) return redirect(obj)
def execute_locked(request, obj, message, call, *args, **kwargs): """ Helper function to catch possible lock exception. """ try: result = call(request, *args, **kwargs) # With False the call is supposed to show errors on its own if result is None or result: messages.success(request, message) except FileLockException: messages.error( request, _('Failed to lock the repository, another operation in progress.') ) return redirect_param(obj, '#repository')
def password(request): ''' Password change / set form. ''' if appsettings.DEMO_SERVER and request.user.username == 'demo': return deny_demo(request) do_change = False if not request.user.has_usable_password(): do_change = True change_form = None elif request.method == 'POST': change_form = PasswordChangeForm(request.POST) if change_form.is_valid(): cur_password = change_form.cleaned_data['password'] do_change = request.user.check_password(cur_password) if not do_change: messages.error(request, _('You have entered an invalid password.')) else: change_form = PasswordChangeForm() if request.method == 'POST': form = PasswordForm(request.POST) if form.is_valid() and do_change: # Clear flag forcing user to set password if 'show_set_password' in request.session: del request.session['show_set_password'] request.user.set_password(form.cleaned_data['password1']) request.user.save() # Update session hash update_session_auth_hash(request, request.user) messages.success(request, _('Your password has been changed.')) return redirect('profile') else: form = PasswordForm() return render(request, 'accounts/password.html', { 'title': _('Change password'), 'change_form': change_form, 'form': form, })
def lock_project(request, project): obj = get_project(request, project) if not can_lock_subproject(request.user, obj): raise PermissionDenied() obj.commit_pending(request) for subproject in obj.subproject_set.all(): subproject.do_lock(request.user) messages.success( request, _('All components are now locked for translation updates!') ) return redirect(obj)
def user_remove(request): if appsettings.DEMO_SERVER and request.user.username == 'demo': return deny_demo(request) if request.method == 'POST': remove_user(request.user) logout(request) messages.success(request, _('Your account has been removed.')) return redirect('home') return render( request, 'accounts/removal.html', )
def show_subproject(request, project, subproject): obj = get_subproject(request, project, subproject) last_changes = Change.objects.prefetch().filter( translation__subproject=obj)[:10] new_lang_form = get_new_language_form(request, obj)(obj) if (request.method == 'POST' and can_edit_subproject(request.user, obj.project)): settings_form = SubprojectSettingsForm(request.POST, instance=obj) if settings_form.is_valid(): settings_form.save() messages.success(request, _('Settings saved')) return redirect(obj) else: messages.error( request, _('Invalid settings, please check the form for errors!')) else: settings_form = SubprojectSettingsForm(instance=obj) return render( request, 'subproject.html', { 'object': obj, 'project': obj.project, 'translations': sort_objects(obj.translation_set.enabled()), 'show_language': 1, 'reports_form': ReportsForm(), 'last_changes': last_changes, 'last_changes_url': urlencode({ 'subproject': obj.slug, 'project': obj.project.slug }), 'new_lang_form': new_lang_form, 'settings_form': settings_form, })
def password(request): """ Password change / set form. """ if appsettings.DEMO_SERVER and request.user.username == "demo": return deny_demo(request) do_change = False if not request.user.has_usable_password(): do_change = True change_form = None elif request.method == "POST": change_form = PasswordChangeForm(request.POST) if change_form.is_valid(): cur_password = change_form.cleaned_data["password"] do_change = request.user.check_password(cur_password) if not do_change: messages.error(request, _("You have entered an invalid password.")) else: change_form = PasswordChangeForm() if request.method == "POST": form = PasswordForm(request.POST) if form.is_valid() and do_change: # Clear flag forcing user to set password if "show_set_password" in request.session: del request.session["show_set_password"] request.user.set_password(form.cleaned_data["password1"]) request.user.save() # Update session hash update_session_auth_hash(request, request.user) messages.success(request, _("Your password has been changed.")) return redirect("profile") else: form = PasswordForm() return render( request, "accounts/password.html", {"title": _("Change password"), "change_form": change_form, "form": form} )
def delete_user(request, project): obj, form = check_user_form(request, project) if form is not None and obj.enable_acl: is_owner = obj.owners.filter(id=form.cleaned_data['user'].id).exists() if is_owner and obj.owners.count() <= 1: messages.error(request, _('You can not remove last owner!')) else: if is_owner: obj.owners.remove(form.cleaned_data['user']) obj.remove_user(form.cleaned_data['user']) messages.success(request, _('User has been removed from this project.')) return redirect_param( 'project', '#acl', project=obj.slug, )
def show_project(request, project): obj = get_project(request, project) dict_langs = Dictionary.objects.filter(project=obj).values_list( 'language', flat=True).distinct() if request.method == 'POST' and can_edit_project(request.user, obj): settings_form = ProjectSettingsForm(request.POST, instance=obj) if settings_form.is_valid(): settings_form.save() messages.success(request, _('Settings saved')) return redirect(obj) else: messages.error( request, _('Invalid settings, please check the form for errors!')) else: settings_form = ProjectSettingsForm(instance=obj) dicts = [] for language in Language.objects.filter(id__in=dict_langs): dicts.append({ 'language': language, 'count': Dictionary.objects.filter(language=language, project=obj).count(), }) last_changes = Change.objects.prefetch().filter( Q(translation__subproject__project=obj) | Q(dictionary__project=obj))[:10] return render( request, 'project.html', { 'object': obj, 'project': obj, 'dicts': dicts, 'last_changes': last_changes, 'last_changes_url': urlencode({'project': obj.slug}), 'add_user_form': UserManageForm(), 'settings_form': settings_form, })
def user_remove(request): if appsettings.DEMO_SERVER and request.user.username == 'demo': return deny_demo(request) if request.method == 'POST': remove_user(request.user) logout(request) messages.success( request, _('Your account has been removed.') ) return redirect('home') return render( request, 'accounts/removal.html', )
def generate_ssh_key(request): """ Generates SSH key. """ try: # Actually generate the key subprocess.check_output( [ 'ssh-keygen', '-q', '-N', '', '-C', 'Weblate', '-t', 'rsa', '-f', ssh_file(RSA_KEY) ], stderr=subprocess.STDOUT, env=get_clean_env(), ) messages.success(request, _('Created new SSH key.')) except (subprocess.CalledProcessError, OSError) as exc: messages.error( request, _('Failed to generate key: %s') % getattr(exc, 'output', str(exc)))
def mail_admins_contact(request, subject, message, context, sender): """ Sends a message to the admins, as defined by the ADMINS setting. """ LOGGER.info("contact form from %s", sender) if not settings.ADMINS: messages.error(request, _("Message could not be sent to administrator!")) LOGGER.error("ADMINS not configured, can not send message!") return mail = EmailMultiAlternatives( "%s%s" % (settings.EMAIL_SUBJECT_PREFIX, subject % context), message % context, to=[a[1] for a in settings.ADMINS], headers={"Reply-To": sender}, ) mail.send(fail_silently=False) messages.success(request, _("Message has been sent to administrator."))
def comment(request, pk): ''' Adds new comment. ''' translation = get_object_or_404(Unit, pk=pk) translation.check_acl(request) form = CommentForm(request.POST) if form.is_valid(): if form.cleaned_data['scope'] == 'global': lang = None else: lang = translation.translation.language Comment.objects.add(translation, request.user, lang, form.cleaned_data['comment']) messages.success(request, _('Posted new comment')) else: messages.error(request, _('Failed to add comment!')) return redirect(request.POST.get('next', translation))
def delete_user(request, project): obj, form = check_user_form(request, project) if form is not None and obj.enable_acl: is_owner = obj.owners.filter( id=form.cleaned_data['user'].id ).exists() if is_owner and obj.owners.count() <= 1: messages.error(request, _('You can not remove last owner!')) else: if is_owner: obj.owners.remove(form.cleaned_data['user']) obj.remove_user(form.cleaned_data['user']) messages.success( request, _('User has been removed from this project.') ) return redirect_param( 'project', '#acl', project=obj.slug, )
def show_subproject(request, project, subproject): obj = get_subproject(request, project, subproject) last_changes = Change.objects.for_component(obj)[:10] new_lang_form = get_new_language_form(request, obj)(obj) if (request.method == 'POST' and can_edit_subproject(request.user, obj.project)): settings_form = SubprojectSettingsForm(request.POST, instance=obj) if settings_form.is_valid(): settings_form.save() messages.success(request, _('Settings saved')) return redirect(obj) else: messages.error( request, _('Invalid settings, please check the form for errors!') ) else: settings_form = SubprojectSettingsForm(instance=obj) return render( request, 'subproject.html', { 'object': obj, 'project': obj.project, 'translations': sort_objects(obj.translation_set.enabled()), 'show_language': 1, 'reports_form': ReportsForm(), 'last_changes': last_changes, 'last_changes_url': urlencode( {'subproject': obj.slug, 'project': obj.project.slug} ), 'new_lang_form': new_lang_form, 'settings_form': settings_form, } )
def mail_admins_contact(request, subject, message, context, sender): ''' Sends a message to the admins, as defined by the ADMINS setting. ''' LOGGER.info( 'contact form from %s', sender, ) if not settings.ADMINS: messages.error(request, _('Message could not be sent to administrator!')) LOGGER.error('ADMINS not configured, can not send message!') return mail = EmailMultiAlternatives( '%s%s' % (settings.EMAIL_SUBJECT_PREFIX, subject % context), message % context, to=[a[1] for a in settings.ADMINS], headers={'Reply-To': sender}, ) mail.send(fail_silently=False) messages.success(request, _('Message has been sent to administrator.'))
def comment(request, pk): ''' Adds new comment. ''' unit = get_object_or_404(Unit, pk=pk) unit.check_acl(request) if not can_add_comment(request.user, unit.translation.subproject.project): raise PermissionDenied() form = CommentForm(request.POST) if form.is_valid(): if form.cleaned_data['scope'] == 'global': lang = None else: lang = unit.translation.language Comment.objects.add(unit, request.user, lang, form.cleaned_data['comment']) messages.success(request, _('Posted new comment')) else: messages.error(request, _('Failed to add comment!')) return redirect(request.POST.get('next', unit))
def generate_ssh_key(request): """ Generates SSH key. """ try: # Actually generate the key subprocess.check_output( [ 'ssh-keygen', '-q', '-N', '', '-C', 'Weblate', '-t', 'rsa', '-f', ssh_file(RSA_KEY) ], stderr=subprocess.STDOUT, env=get_clean_env(), ) messages.success(request, _('Created new SSH key.')) except (subprocess.CalledProcessError, OSError) as exc: messages.error( request, _('Failed to generate key: %s') % getattr(exc, 'output', str(exc)) )
def import_message(request, count, message_none, message_ok): if count == 0: messages.warning(request, message_none) else: messages.success(request, message_ok % count)
def show_project(request, project): obj = get_project(request, project) dict_langs = Dictionary.objects.filter( project=obj ).values_list( 'language', flat=True ).distinct() if request.method == 'POST' and can_edit_project(request.user, obj): settings_form = ProjectSettingsForm(request.POST, instance=obj) if settings_form.is_valid(): settings_form.save() messages.success(request, _('Settings saved')) return redirect(obj) else: messages.error( request, _('Invalid settings, please check the form for errors!') ) else: settings_form = ProjectSettingsForm(instance=obj) dicts = [] for language in Language.objects.filter(id__in=dict_langs): dicts.append( { 'language': language, 'count': Dictionary.objects.filter( language=language, project=obj ).count(), } ) last_changes = Change.objects.for_project(obj)[:10] language_stats = sort_unicode( get_per_language_stats(obj), lambda tup: force_text(tup[0]) ) language_stats = [ ( tup[0], translation_percent(tup[1], tup[2]), translation_percent(tup[3], tup[4]) ) for tup in language_stats ] return render( request, 'project.html', { 'object': obj, 'project': obj, 'dicts': dicts, 'last_changes': last_changes, 'last_changes_url': urlencode( {'project': obj.slug} ), 'add_user_form': UserManageForm(), 'settings_form': settings_form, 'language_stats': language_stats, } )
def user_profile(request): profile = request.user.profile if not profile.language: profile.language = get_language() profile.save() form_classes = [ ProfileForm, SubscriptionForm, SubscriptionSettingsForm, UserSettingsForm, DashboardSettingsForm, ] if request.method == 'POST': # Parse POST params forms = [form(request.POST, instance=profile) for form in form_classes] forms.append(UserForm(request.POST, instance=request.user)) if appsettings.DEMO_SERVER and request.user.username == 'demo': return deny_demo(request) if all([form.is_valid() for form in forms]): # Save changes for form in forms: form.save() # Change language set_lang(request, request.user.profile) # Redirect after saving (and possibly changing language) response = redirect_profile(request.POST.get('activetab')) # Set language cookie and activate new language (for message below) lang_code = profile.language response.set_cookie(settings.LANGUAGE_COOKIE_NAME, lang_code) translation.activate(lang_code) messages.success(request, _('Your profile has been updated.')) return response else: forms = [form(instance=profile) for form in form_classes] forms.append(UserForm(instance=request.user)) social = request.user.social_auth.all() social_names = [assoc.provider for assoc in social] all_backends = set(load_backends(BACKENDS).keys()) new_backends = [ x for x in all_backends if x == 'email' or x not in social_names ] license_projects = SubProject.objects.filter( project__in=Project.objects.all_acl(request.user)).exclude(license='') response = render( request, 'accounts/profile.html', { 'form': forms[0], 'subscriptionform': forms[1], 'subscriptionsettingsform': forms[2], 'usersettingsform': forms[3], 'dashboardsettingsform': forms[4], 'userform': forms[5], 'profile': profile, 'title': _('User profile'), 'licenses': license_projects, 'associated': social, 'new_backends': new_backends, }) response.set_cookie(settings.LANGUAGE_COOKIE_NAME, profile.language) return response
def user_profile(request): profile = request.user.profile form_classes = [ ProfileForm, SubscriptionForm, SubscriptionSettingsForm, UserSettingsForm, DashboardSettingsForm, ] if request.method == 'POST': # Parse POST params forms = [form(request.POST, instance=profile) for form in form_classes] forms.append(UserForm(request.POST, instance=request.user)) if appsettings.DEMO_SERVER and request.user.username == 'demo': return deny_demo(request) if all([form.is_valid() for form in forms]): # Save changes for form in forms: form.save() # Change language set_lang(request, request.user.profile) # Redirect after saving (and possibly changing language) response = redirect('profile') # Set language cookie and activate new language (for message below) lang_code = profile.language response.set_cookie(settings.LANGUAGE_COOKIE_NAME, lang_code) translation.activate(lang_code) messages.success(request, _('Your profile has been updated.')) return response else: forms = [form(instance=profile) for form in form_classes] forms.append(UserForm(instance=request.user)) social = request.user.social_auth.all() social_names = [assoc.provider for assoc in social] all_backends = set(load_backends(BACKENDS).keys()) new_backends = [ x for x in all_backends if x == 'email' or x not in social_names ] license_projects = SubProject.objects.filter( project__in=Project.objects.all_acl(request.user) ).exclude( license='' ) response = render( request, 'accounts/profile.html', { 'form': forms[0], 'subscriptionform': forms[1], 'subscriptionsettingsform': forms[2], 'usersettingsform': forms[3], 'dashboardsettingsform': forms[4], 'userform': forms[5], 'profile': profile, 'title': _('User profile'), 'licenses': license_projects, 'associated': social, 'new_backends': new_backends, } ) response.set_cookie( settings.LANGUAGE_COOKIE_NAME, profile.language ) return response