def change_access(request, project): obj = get_project(request, project) if not request.user.has_perm('billing:project.permissions', obj): raise PermissionDenied() form = ProjectAccessForm(request.POST, instance=obj) if not form.is_valid(): for error in form.errors: for message in form.errors[error]: messages.error(request, message) else: form.save() Change.objects.create( project=obj, action=Change.ACTION_ACCESS_EDIT, user=request.user, details={'access_control': obj.access_control}, ) messages.success( request, _('Project access control has been changed.') ) return redirect( 'manage-access', project=obj.slug, )
def post(self, request, **kwargs): component = self.get_component(kwargs) if not can_add_screenshot(request.user, component.project): raise PermissionDenied() self._add_form = ScreenshotForm(request.POST, request.FILES) if self._add_form.is_valid(): obj = Screenshot.objects.create( component=component, **self._add_form.cleaned_data ) try_add_source(request, obj) messages.success( request, _( 'Screenshot has been uploaded, ' 'you can now assign it to source strings.' ) ) return redirect(obj) else: messages.error( request, _('Failed to upload screenshot, please fix errors below.') ) return self.get(request, **kwargs)
def comment(request, pk): """Add new comment.""" unit = get_object_or_404(Unit, pk=pk) request.user.check_access(unit.translation.component.project) if not request.user.has_perm('comment.add', unit.translation): 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_next(request.POST.get('next'), unit)
def user_remove(request): is_confirmation = 'remove_confirm' in request.session if is_confirmation: if request.method == 'POST': remove_user(request.user, request) rotate_token(request) logout(request) messages.success( request, _('Your account has been removed.') ) return redirect('home') confirm_form = EmptyConfirmForm(request) elif request.method == 'POST': confirm_form = PasswordConfirmForm(request, request.POST) if confirm_form.is_valid(): store_userid(request, remove=True) request.GET = {'email': request.user.email} return social_complete(request, 'email') else: confirm_form = PasswordConfirmForm(request) return render( request, 'accounts/removal.html', { 'confirm_form': confirm_form, 'is_confirmation': is_confirmation, } )
def mail_admins_contact(request, subject, message, context, sender, to): """Send a message to the admins, as defined by the ADMINS setting.""" LOGGER.info( 'contact form from %s', sender, ) if not to and settings.ADMINS: to = [a[1] for a in settings.ADMINS] elif 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( '{0}{1}'.format(settings.EMAIL_SUBJECT_PREFIX, subject % context), message % context, to=to, headers={'Reply-To': sender}, ) mail.send(fail_silently=False) messages.success( request, _('Message has been sent to administrator.') )
def add_user(request, project): """Add user to a project.""" obj, form = check_user_form(request, project, True) if form is not None: try: user = form.cleaned_data['user'] obj.add_user(user) Change.objects.create( project=obj, action=Change.ACTION_ADD_USER, user=request.user, details={'username': user.username}, ) messages.success( request, _('User has been added to this project.') ) except Group.DoesNotExist: messages.error( request, _('Failed to find group to add a user!') ) return redirect( 'manage-access', project=obj.slug, )
def delete_user(request, project): """Remove user from a project.""" obj, form = check_user_form(request, project, True) if form is not None: owners = User.objects.all_admins(obj) user = form.cleaned_data['user'] is_owner = owners.filter(pk=user.pk).exists() if is_owner and owners.count() <= 1: messages.error(request, _('You can not remove last owner!')) else: obj.remove_user(user) Change.objects.create( project=obj, action=Change.ACTION_REMOVE_USER, user=request.user, details={'username': user.username}, ) messages.success( request, _('User has been removed from this project.') ) return redirect( 'manage-access', project=obj.slug, )
def change_component(request, project, component): obj = get_component(request, project, component) if not request.user.has_perm('component.edit', obj): raise Http404() if request.method == 'POST': form = ComponentSettingsForm(request.POST, instance=obj) if form.is_valid(): form.save() messages.success(request, _('Settings saved')) return redirect( 'settings', project=obj.project.slug, component=obj.slug ) else: messages.error( request, _('Invalid settings, please check the form for errors!') ) else: form = ComponentSettingsForm(instance=obj) return render( request, 'component-settings.html', { 'project': obj.project, 'object': obj, 'form': form, } )
def save(self, request, delete_session=False): notify_account_activity( self.user, request, 'password', password=self.user.password ) # Change the password password = self.cleaned_data["new_password1"] self.user.set_password(password) self.user.save(update_fields=['password']) # Updating the password logs out all other sessions for the user # except the current one. update_session_auth_hash(request, self.user) # Change key for current session request.session.cycle_key() # Invalidate password reset codes invalidate_reset_codes(self.user) if delete_session: request.session.flush() messages.success( request, _('Your password has been changed.') )
def post(self, request, **kwargs): component = self.get_component() if not request.user.has_perm('screenshot.add', component): raise PermissionDenied() self._add_form = ScreenshotForm(request.POST, request.FILES) if self._add_form.is_valid(): obj = Screenshot.objects.create( component=component, user=request.user, **self._add_form.cleaned_data ) request.user.profile.uploaded += 1 request.user.profile.save(update_fields=['uploaded']) try_add_source(request, obj) messages.success( request, _( 'Screenshot has been uploaded, ' 'you can now assign it to source strings.' ) ) return redirect(obj) messages.error( request, _('Failed to upload screenshot, please fix errors below.') ) return self.get(request, **kwargs)
def remove_source(request, pk): obj = get_screenshot(request, pk) obj.sources.remove(request.POST['source']) messages.success(request, _('Source has been removed.')) return redirect(obj)
def form_valid(self, form): if not check_perm(self.request.user, 'memory.edit', self.objects): raise PermissionDenied() import_memory.delay(self.objects['project'].pk) messages.success( self.request, _('Import of strings scheduled.') ) return super(ImportView, self).form_valid(form)
def form_valid(self, form): if not check_perm(self.request.user, 'memory.delete', self.objects): raise PermissionDenied() memory = TranslationMemory() memory.delete(**self.objects) messages.success( self.request, _('Entries deleted.') ) return super(DeleteView, self).form_valid(form)
def new_language(request, project, component): obj = get_component(request, project, component) form_class = get_new_language_form(request, obj) can_add = obj.can_add_new_language(request) if request.method == 'POST': form = form_class(obj, request.POST) if form.is_valid(): langs = form.cleaned_data['lang'] kwargs = { 'user': request.user, 'author': request.user, 'component': obj, 'details': {}, } for language in Language.objects.filter(code__in=langs): kwargs['details']['language'] = language.code if can_add: obj.add_new_language(language, request) Change.objects.create( action=Change.ACTION_ADDED_LANGUAGE, **kwargs ) elif obj.new_lang == 'contact': Change.objects.create( action=Change.ACTION_REQUESTED_LANGUAGE, **kwargs ) messages.success( request, _( "A request for a new translation has been " "sent to the project's maintainers." ) ) return redirect(obj) messages.error( request, _('Please fix errors in the form.') ) else: form = form_class(obj) return render( request, 'new-language.html', { 'object': obj, 'project': obj.project, 'form': form, 'can_add': can_add, } )
def add_user(request, project): """Add user to a project.""" obj, form = check_user_form(request, project, True) if form is not None: obj.add_user(form.cleaned_data['user']) messages.success( request, _('User has been added to this project.') ) return redirect( 'manage-access', project=obj.slug, )
def unlock_component(request, project, component): obj = get_component(request, project, component) if not request.user.has_perm('component.lock', obj): raise PermissionDenied() obj.do_lock(request.user, False) messages.success( request, _('Component is now open for translation updates.') ) return redirect_param(obj, '#repository')
def form_valid(self, form): if not check_perm(self.request.user, 'memory.edit', self.objects): raise PermissionDenied() try: TranslationMemory.import_file( self.request, form.cleaned_data['file'], **self.objects ) messages.success( self.request, _('File processed, the entries will appear shortly.') ) except MemoryImportError as error: messages.error(self.request, force_text(error)) return super(UploadView, self).form_valid(form)
def remove_translation(request, project, component, lang): obj = get_translation(request, project, component, lang) if not request.user.has_perm('translation.delete', obj): raise PermissionDenied() form = DeleteForm(obj, request.POST) if not form.is_valid(): show_form_errors(request, form) return redirect_param(obj, '#delete') obj.remove(request.user) messages.success(request, _('Translation has been removed.')) return redirect(obj.component)
def lock_project(request, project): obj = get_project(request, project) if not request.user.has_perm('component.lock', obj): raise PermissionDenied() for component in obj.component_set.all(): component.do_lock(request.user) messages.success( request, _('All components are now locked for translation updates!') ) return redirect_param(obj, '#repository')
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 Timeout as error: messages.error( request, _('Failed to lock the repository, another operation is in progress.') ) report_error(error, request) return redirect_param(obj, '#repository')
def password(request): """Password change / set form.""" do_change = False if request.method == 'POST': change_form = PasswordConfirmForm(request, request.POST) do_change = change_form.is_valid() else: change_form = PasswordConfirmForm(request) if request.method == 'POST': form = SetPasswordForm(request.user, 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 = '' # Change the password user = form.save() # Updating the password logs out all other sessions for the user # except the current one. update_session_auth_hash(request, user) # Change key for current session request.session.cycle_key() messages.success( request, _('Your password has been changed.') ) notify_account_activity(request.user, request, 'password') return redirect_profile(redirect_page) else: form = SetPasswordForm(request.user) return render( request, 'accounts/password.html', { 'title': _('Change password'), 'change_form': change_form, 'form': form, } )
def delete_screenshot(request, pk): obj = get_object_or_404(Screenshot, pk=pk) request.user.check_access(obj.component.project) if not request.user.has_perm('screenshot.delete', obj.component): raise PermissionDenied() kwargs = { 'project': obj.component.project.slug, 'component': obj.component.slug, } obj.delete() messages.success(request, _('Screenshot %s has been deleted.') % obj.name) return redirect('screenshots', **kwargs)
def delete_user(request, project): """Remove user from a project.""" obj, form = check_user_form(request, project, True) if form is not None: owners = obj.all_users('@Administration') is_owner = owners.filter(pk=form.cleaned_data['user'].pk).exists() if is_owner and owners.count() <= 1: messages.error(request, _('You can not remove last owner!')) else: obj.remove_user(form.cleaned_data['user']) messages.success( request, _('User has been removed from this project.') ) return redirect( 'manage-access', project=obj.slug, )
def add_user(request, project): """Add user to a project.""" obj, form = check_user_form(request, project, True) if form is not None: try: user = form.cleaned_data["user"] obj.add_user(user) Change.objects.create( project=obj, action=Change.ACTION_ADD_USER, user=request.user, details={"username": user.username}, ) messages.success(request, _("User has been added to this project.")) except Group.DoesNotExist: messages.error(request, _("Failed to find group to add a user!")) return redirect("manage-access", project=obj.slug)
def new_unit(request, project, component, lang): translation = get_translation(request, project, component, lang) if not request.user.has_perm('unit.add', translation): raise PermissionDenied() form = NewUnitForm(request.user, request.POST) if not form.is_valid(): show_form_errors(request, form) else: key = form.cleaned_data['key'] value = form.cleaned_data['value'][0] if translation.unit_set.filter(context=key).exists(): messages.error( request, _('Translation with this key seem to already exist!')) else: translation.new_unit(request, key, value) messages.success(request, _('New string has been added.')) return redirect(translation)
def subscribe(request): if "onetime" in request.POST: component = Component.objects.get(pk=request.POST["component"]) request.user.check_access_component(component) subscription = Subscription( user=request.user, notification=request.POST["onetime"], scope=SCOPE_COMPONENT, frequency=FREQ_INSTANT, project=component.project, component=component, onetime=True, ) try: subscription.full_clean() subscription.save() except ValidationError: pass messages.success(request, _("Notification settings adjusted.")) return redirect_profile("#notifications")
def save(self, request, delete_session=False): AuditLog.objects.create( self.user, request, "password", password=self.user.password ) # Change the password password = self.cleaned_data["new_password1"] self.user.set_password(password) self.user.save(update_fields=["password"]) # Updating the password logs out all other sessions for the user # except the current one and change key for current session cycle_session_keys(request, self.user) # Invalidate password reset codes invalidate_reset_codes(self.user) if delete_session: request.session.flush() messages.success(request, _("Your password has been changed."))
def remove_project(request, project): obj = get_project(request, project) if not request.user.has_perm('project.edit', obj): raise PermissionDenied() form = DeleteForm(obj, request.POST) if not form.is_valid(): show_form_errors(request, form) return redirect_param(obj, '#delete') Change.objects.create(action=Change.ACTION_REMOVE_PROJECT, target=obj.slug, user=request.user, author=request.user) obj.delete() messages.success(request, _('Project has been removed.')) return redirect('home')
def remove_component(request, project, component): obj = get_component(request, project, component) if not request.user.has_perm('component.edit', obj): raise PermissionDenied() form = DeleteForm(obj, request.POST) if not form.is_valid(): show_form_errors(request, form) return redirect_param(obj, '#delete') obj.delete() messages.success(request, _('Translation component has been removed.')) Change.objects.create(project=obj.project, action=Change.ACTION_REMOVE_COMPONENT, target=obj.slug, user=request.user, author=request.user) return redirect(obj.project)
def invite_user(request, project): """Invite user to a project.""" obj, form = check_user_form(request, project, True, form_class=InviteUserForm) if form is not None: try: user = form.save() obj.add_user(user) Change.objects.create( project=obj, action=Change.ACTION_INVITE_USER, user=request.user, details={'username': user.username}, ) send_invitation(request, obj, user) messages.success(request, _('User has been invited to this project.')) except Group.DoesNotExist: messages.error(request, _('Failed to find group to add a user!')) return redirect('manage-access', project=obj.slug)
def user_remove(request): if settings.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 activate(request): form = ActivateForm(request.POST) if form.is_valid(): support = SupportStatus(**form.cleaned_data) try: support.refresh() support.save() messages.success(request, _("Activation completed.")) except Exception: report_error() messages.error( request, _( "Could not activate your installation. " "Please ensure your activation token is correct." ), ) else: show_form_errors(request, form) return redirect("manage")
def unsubscribe(request): if "i" in request.GET: signer = TimestampSigner() try: subscription = Subscription.objects.get( pk=int(signer.unsign(request.GET["i"], max_age=24 * 3600)) ) subscription.frequency = FREQ_NONE subscription.save(update_fields=["frequency"]) messages.success(request, _("Notification settings adjusted.")) except (BadSignature, SignatureExpired, Subscription.DoesNotExist): messages.error( request, _( "The notification change link is no longer valid, " "please sign in to configure notifications." ), ) return redirect_profile("#notifications")
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 new_language(request, project, component): obj = get_component(request, project, component) form_class = get_new_language_form(request, obj) can_add = obj.can_add_new_language(request) if request.method == 'POST': form = form_class(obj, request.POST) if form.is_valid(): langs = form.cleaned_data['lang'] kwargs = { 'user': request.user, 'author': request.user, 'component': obj, 'details': {}, } for language in Language.objects.filter(code__in=langs): kwargs['details']['language'] = language.code if can_add: obj.add_new_language(language, request) Change.objects.create(action=Change.ACTION_ADDED_LANGUAGE, **kwargs) elif obj.new_lang == 'contact': Change.objects.create( action=Change.ACTION_REQUESTED_LANGUAGE, **kwargs) messages.success( request, _("A request for a new translation has been " "sent to the project's maintainers.")) return redirect(obj) messages.error(request, _('Please fix errors in the form.')) else: form = form_class(obj) return render(request, 'new-language.html', { 'object': obj, 'project': obj.project, 'form': form, 'can_add': can_add, })
def password(request): """Password change / set form.""" do_change = False if request.method == 'POST': change_form = PasswordConfirmForm(request, request.POST) do_change = change_form.is_valid() else: change_form = PasswordConfirmForm(request) if request.method == 'POST': form = SetPasswordForm(request.user, 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 = '' # Change the password user = form.save() # Updating the password logs out all other sessions for the user # except the current one. update_session_auth_hash(request, user) # Change key for current session request.session.cycle_key() messages.success(request, _('Your password has been changed.')) notify_account_activity(request.user, request, 'password') return redirect_profile(redirect_page) else: form = SetPasswordForm(request.user) return render(request, 'accounts/password.html', { 'title': _('Change password'), 'change_form': change_form, 'form': form, })
def show_language(request, lang): try: obj = Language.objects.get(code=lang) except Language.DoesNotExist: obj = Language.objects.fuzzy_get(lang) if isinstance(obj, Language): return redirect(obj) raise Http404("No Language matches the given query.") if request.method == "POST" and request.user.has_perm("language.edit"): if obj.translation_set.exists(): messages.error( request, _("Remove all translations using this language first.") ) else: obj.delete() messages.success(request, _("Language %s removed.") % obj) return redirect("languages") last_changes = Change.objects.last_changes(request.user).filter(language=obj)[:10] projects = request.user.allowed_projects dicts = projects.filter(glossary__term__language=obj).distinct() projects = prefetch_project_flags( prefetch_stats(projects.filter(component__translation__language=obj).distinct()) ) projects = [ProjectLanguage(project, obj) for project in projects] ProjectLanguageStats.prefetch_many([project.stats for project in projects]) return render( request, "language.html", { "allow_index": True, "object": obj, "last_changes": last_changes, "last_changes_url": urlencode({"lang": obj.code}), "dicts": dicts, "projects": projects, }, )
def remove_project(request, project): obj = get_project(request, project) if not request.user.has_perm('project.edit', obj): raise PermissionDenied() form = DeleteForm(obj, request.POST) if not form.is_valid(): show_form_errors(request, form) return redirect_param(obj, '#delete') project_removal.delay(obj.pk) messages.success(request, _('Project was scheduled for removal.')) Change.objects.create( action=Change.ACTION_REMOVE_PROJECT, target=obj.slug, user=request.user, author=request.user ) return redirect('home')
def delete_user(request, project): """Remove user from a project.""" obj, form = check_user_form(request, project, True) if form is not None: owners = User.objects.all_admins(obj) user = form.cleaned_data["user"] is_owner = owners.filter(pk=user.pk).exists() if is_owner and owners.count() <= 1: messages.error(request, _("You can not remove last owner!")) else: obj.remove_user(user) Change.objects.create( project=obj, action=Change.ACTION_REMOVE_USER, user=request.user, details={"username": user.username}, ) messages.success(request, _("User has been removed from this project.")) return redirect("manage-access", project=obj.slug)
def users(request): invite_form = InviteUserForm() if request.method == "POST": if "email" in request.POST: invite_form = InviteUserForm(request.POST) if invite_form.is_valid(): invite_form.save(request) messages.success(request, _("User has been invited to this project.")) return redirect("manage-users") return render( request, "manage/users.html", { "menu_items": MENU, "menu_page": "users", "invite_form": invite_form }, )
def user_remove(request): if request.method == 'POST': confirm_form = PasswordConfirmForm(request, request.POST) if confirm_form.is_valid(): remove_user(request.user) logout(request) messages.success( request, _('Your account has been removed.') ) return redirect('home') else: confirm_form = PasswordConfirmForm(request) return render( request, 'accounts/removal.html', { 'confirm_form': confirm_form, } )
def mail_admins_contact(request, subject, message, context, sender, to): """Send a message to the admins, as defined by the ADMINS setting.""" LOGGER.info('contact form from %s', sender) if not to and settings.ADMINS: to = [a[1] for a in settings.ADMINS] elif 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( '{0}{1}'.format(settings.EMAIL_SUBJECT_PREFIX, subject % context), message % context, to=to, headers={'Reply-To': sender}, ) mail.send(fail_silently=False) messages.success(request, _('Message has been sent to administrator.'))
def comment(request, pk): """Add new comment.""" unit = get_object_or_404(Unit, pk=pk) request.user.check_access(unit.translation.component.project) if not request.user.has_perm('comment.add', unit.translation): 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_next(request.POST.get('next'), unit)
def change_access(request, project): obj = get_project(request, project) if not can_edit_access_control(request.user, obj): raise PermissionDenied() form = ProjectAccessForm(request.POST, instance=obj) if not form.is_valid(): for error in form.errors: for message in form.errors[error]: messages.error(request, message) else: form.save() messages.success(request, _('Project access control has been changed.')) return redirect( 'manage-access', project=obj.slug, )
def save(self, request, delete_session=False): notify_account_activity(self.user, request, 'password', password=self.user.password) # Change the password password = self.cleaned_data["new_password1"] self.user.set_password(password) self.user.save(update_fields=['password']) if delete_session: request.session.flush() else: # Updating the password logs out all other sessions for the user # except the current one. update_session_auth_hash(request, self.user) # Change key for current session request.session.cycle_key() messages.success(request, _('Your password has been changed.'))
def post(self, request, **kwargs): component = self.get_component() if not request.user.has_perm("screenshot.add", component): raise PermissionDenied() self._add_form = ScreenshotForm(component, request.POST, request.FILES) if self._add_form.is_valid(): obj = Screenshot.objects.create(user=request.user, **self._add_form.cleaned_data) request.user.profile.increase_count("uploaded") try_add_source(request, obj) messages.success( request, _("Screenshot has been uploaded, " "you can now assign it to source strings."), ) return redirect(obj) messages.error( request, _("Failed to upload screenshot, please fix errors below.")) return self.get(request, **kwargs)
def change_component(request, project, component): obj = get_component(request, project, component) if not request.user.has_perm("component.edit", obj): raise Http404() if request.method == "POST": form = ComponentSettingsForm(request, request.POST, instance=obj) if form.is_valid(): form.save() messages.success(request, _("Settings saved")) return redirect("settings", project=obj.project.slug, component=obj.slug) else: messages.error( request, _("Invalid settings, please check the form for errors!")) # Get a fresh copy of object, otherwise it will use unsaved changes # from the failed form obj = Component.objects.get(pk=obj.pk) else: form = ComponentSettingsForm(request, instance=obj) if obj.repo_needs_merge(): messages.warning( request, _("The repository is outdated, you might not get " "expected results until you update it."), ) return render( request, "component-settings.html", { "project": obj.project, "object": obj, "form": form }, )
def show_language(request, lang): try: obj = Language.objects.get(code=lang) except Language.DoesNotExist: obj = Language.objects.fuzzy_get(lang) if isinstance(obj, Language): return redirect(obj) raise Http404('No Language matches the given query.') if request.method == 'POST' and request.user.has_perm('language.edit'): if obj.translation_set.exists(): messages.error( request, _('Remove all translations using this language first.')) else: obj.delete() messages.success(request, _('Language %s removed.') % obj) return redirect('languages') last_changes = Change.objects.last_changes( request.user).filter(translation__language=obj)[:10] projects = request.user.allowed_projects dicts = projects.filter(dictionary__language=obj).distinct() projects = projects.filter(component__translation__language=obj).distinct() for project in projects: project.language_stats = project.stats.get_single_language_stats(obj) return render( request, 'language.html', { 'allow_index': True, 'object': obj, 'last_changes': last_changes, 'last_changes_url': urlencode({'lang': obj.code}), 'dicts': dicts, 'projects': projects, }, )
def handle_payment(self, request): try: payment = Payment.objects.select_for_update().get( uuid=request.GET["payment"], customer__user_id=request.user.id, customer__origin=get_origin(), ) except (Payment.DoesNotExist, ValidationError): messages.error(request, _("No matching payment found.")) return redirect("create-billing") if payment.state in (Payment.ACCEPTED, Payment.PROCESSED): if payment.state == Payment.ACCEPTED: handle_received_payment(payment) messages.success( request, _("Thank you for purchasing a hosting plan, it is now active.") ) return redirect("billing") if payment.state in (Payment.PENDING, Payment.PROCESSED): messages.info( request, _("Thank you for purchasing a hosting plan, the payment for it is " "pending and will be processed in the background."), ) return redirect("billing") if payment.state == Payment.NEW: return HttpResponseRedirect(payment.get_payment_url()) if payment.state == Payment.REJECTED: messages.error( request, _("The payment was rejected: {}").format( payment.details.get("reject_reason", _("Unknown reason"))), ) return redirect("create-billing")
def new_language(request, project, component): obj = get_component(request, project, component) form_class = get_new_language_form(request, obj) if request.method == 'POST': form = form_class(obj, request.POST) if form.is_valid(): langs = form.cleaned_data['lang'] 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) return redirect(obj) else: messages.error( request, _('Please fix errors in the form.') ) else: form = form_class(obj) return render( request, 'new-language.html', { 'object': obj, 'project': obj.project, 'form': form, } )
def user_remove(request): if request.method == 'POST': confirm_form = PasswordConfirmForm(request, request.POST) if confirm_form.is_valid(): session_ratelimit_reset(request) remove_user(request.user, request) logout(request) messages.success( request, _('Your account has been removed.') ) return redirect('home') else: confirm_form = PasswordConfirmForm(request) return render( request, 'accounts/removal.html', { 'confirm_form': confirm_form, } )
def generate_ssh_key(request): """Generate 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 generate_ssh_key(request): """Generate SSH key.""" keyfile = ssh_file(RSA_KEY) pubkeyfile = ssh_file(RSA_KEY_PUB) try: # Actually generate the key subprocess.run( [ "ssh-keygen", "-q", "-b", "4096", "-N", "", "-C", "Weblate", "-t", "rsa", "-f", keyfile, ], universal_newlines=True, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=get_clean_env(), ) except (subprocess.CalledProcessError, OSError) as exc: messages.error( request, _("Failed to generate key: %s") % getattr(exc, "output", str(exc))) return # Fix key permissions os.chmod(keyfile, stat.S_IWUSR | stat.S_IRUSR) os.chmod(pubkeyfile, stat.S_IWUSR | stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH) messages.success(request, _("Created new SSH key."))
def remove_component(request, project, component): obj = get_component(request, project, component) if not request.user.has_perm('component.edit', obj): raise PermissionDenied() form = DeleteForm(obj, request.POST) if not form.is_valid(): show_form_errors(request, form) return redirect_param(obj, '#delete') obj.delete() messages.success(request, _('Translation component has been removed.')) Change.objects.create( project=obj.project, action=Change.ACTION_REMOVE_COMPONENT, target=obj.slug, user=request.user, author=request.user ) return redirect(obj.project)
def post(self, request, **kwargs): component = self.get_component() if not request.user.has_perm('screenshot.add', component): raise PermissionDenied() self._add_form = ScreenshotForm(request.POST, request.FILES) if self._add_form.is_valid(): obj = Screenshot.objects.create(component=component, user=request.user, **self._add_form.cleaned_data) request.user.profile.uploaded += 1 request.user.profile.save(update_fields=['uploaded']) try_add_source(request, obj) messages.success( request, _('Screenshot has been uploaded, ' 'you can now assign it to source strings.')) return redirect(obj) messages.error( request, _('Failed to upload screenshot, please fix errors below.')) return self.get(request, **kwargs)
def tools(request): email_form = TestMailForm(initial={"email": request.user.email}) announce_form = AnnouncementForm() if request.method == "POST": if "email" in request.POST: email_form = TestMailForm(request.POST) if email_form.is_valid(): try: send_test_mail(**email_form.cleaned_data) messages.success(request, _("Test e-mail sent.")) except Exception as error: report_error() messages.error(request, _("Could not send test e-mail: %s") % error) if "sentry" in request.POST: try: raise Exception("Test exception") except Exception: report_error() if "message" in request.POST: announce_form = AnnouncementForm(request.POST) if announce_form.is_valid(): Announcement.objects.create( user=request.user, **announce_form.cleaned_data ) return render( request, "manage/tools.html", { "menu_items": MENU, "menu_page": "tools", "email_form": email_form, "announce_form": announce_form, }, )
def invite_user(request, project): """Invite user to a project.""" obj, form = check_user_form(request, project, True, form_class=InviteUserForm) if form is not None: try: user = form.save() obj.add_user(user) Change.objects.create( project=obj, action=Change.ACTION_INVITE_USER, user=request.user, details={'username': user.username}, ) fake = HttpRequest() fake.user = get_anonymous() fake.method = 'POST' fake.session = create_session() fake.session['invitation_context'] = { 'from_user': request.user.full_name, 'project_name': obj.name, } fake.POST['email'] = form.cleaned_data['email'] fake.META = request.META store_userid(fake, invite=True) complete(fake, 'email') messages.success(request, _('User has been invited to this project.')) except Group.DoesNotExist: messages.error(request, _('Failed to find group to add a user!')) return redirect( 'manage-access', project=obj.slug, )
def new_unit(request, project, component, lang): translation = get_translation(request, project, component, lang) if not request.user.has_perm('unit.add', translation): raise PermissionDenied() form = NewUnitForm(request.user, request.POST) if not form.is_valid(): show_form_errors(request, form) else: key = form.cleaned_data['key'] value = form.cleaned_data['value'][0] if translation.unit_set.filter(context=key).exists(): messages.error( request, _('Translation with this key seem to already exist!') ) else: translation.new_unit(request, key, value) messages.success( request, _('New string has been added.') ) return redirect(translation)
def user_profile(request): profile = request.user.profile if not request.user.is_demo and not profile.language: profile.language = get_language() profile.save(update_fields=['language']) form_classes = [ ProfileForm, SubscriptionForm, SubscriptionSettingsForm, UserSettingsForm, DashboardSettingsForm, ] all_backends = set(load_backends(social_django.utils.BACKENDS).keys()) 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 request.user.is_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)) if not request.user.has_usable_password() and 'email' in all_backends: messages.warning( request, render_to_string('accounts/password-warning.html') ) social = request.user.social_auth.all() social_names = [assoc.provider for assoc in social] new_backends = [ x for x in all_backends if x == 'email' or x not in social_names ] license_projects = Component.objects.filter( project__in=request.user.allowed_projects ).exclude( license='' ) result = render( request, 'accounts/profile.html', { 'languagesform': 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, 'managed_projects': request.user.owned_projects, 'auditlog': request.user.auditlog_set.all()[:20], } ) result.set_cookie( settings.LANGUAGE_COOKIE_NAME, profile.language ) return result