def permissions(request, title): document = get_object_or_error(MinutesDocument, request.user, ['minutes.change_minutesdocument'], url_title=title) permissionFS = formset_factory(form=PermissionForm, extra=0) groups = Group.objects.all() initial_data = [] for group in groups: group_permissions = get_perms(group, document) data = { "change_permission": "change_minutesdocument" in group_permissions, "delete_permission": "delete_minutesdocument" in group_permissions, "view_permission": MinutesDocument.VIEW_PERMISSION_NAME in group_permissions, "group_name": group.name, } initial_data.append(data) formset = permissionFS(request.POST or None, initial=initial_data) if request.POST and formset.is_valid(): for form in formset: form.save(document) messages.success(request, _("Permissions have been changed successfully.")) return HttpResponseRedirect(reverse('minutes:permissions', args=[document.url_title])) return render(request, 'minutes_permissions.html', { 'document': document, 'formset': formset, 'active_page': 'permissions', })
def attachments(request, title): document = get_object_or_error( InformationDocument, request.user, ['information_pages.change_informationdocument'], url_title=title) success, form = handle_attachment(request, document) if success: messages.success(request, _("File has been uploaded successfully!")) return HttpResponseRedirect( reverse("information_pages:attachments", args=[document.url_title])) else: return render( request, "information_pages_attachments.html", { 'document': document, 'edit_url': reverse('information_pages:attachments', args=[document.url_title]), 'form': form, 'attachments': document.attachments.all().order_by('index'), 'active_page': 'attachments', })
def view(request, title): poll = get_object_or_error(Poll, request.user, ['polls.view_poll'], url_title=title) if poll.end_date < datetime.date.today() or poll.participants.filter(id=request.user.pk).exists(): return results(request, poll, title) else: if not request.user.has_perm('polls.vote_poll', poll): return results(request, poll, title) return vote(request, poll, title)
def autosave(request, title): document = None try: document = get_object_or_error(MinutesDocument, request.user, ['minutes.change_minutesdocument'], url_title=title) except Document.DoesNotExist: pass handle_autosave(request, document) return HttpResponse()
def autosave(request, title): document = None try: document = get_object_or_error(InformationDocument, request.user, ['information_pages.change_informationdocument'], url_title=title) except Document.DoesNotExist: pass handle_autosave(request, document) return HttpResponse()
def revert(request): if not request.is_ajax() or not request.POST: raise Http404 version_id = request.POST["id"] document_url_title = request.POST["url_title"] document = get_object_or_error(Document, request.user, ["change_document"], url_title=document_url_title) versions = reversion.get_for_object(document) # find the we want to revert to revert_version = None for version in versions: if version.pk == int(version_id): revert_version = version break if revert_version is None: # user supplied version_id that does not exist return HttpResponseBadRequest("Could not find document") try: revert_version.revision.revert(delete=True) except RevertError: return HttpResponseServerError("Could not revert the version") fields = revert_version.field_dict document_class = ContentType.objects.get_for_id(fields.pop("polymorphic_ctype")).model_class() # Remove all references to parent objects, rename ForeignKeyFields, extract ManyToManyFields. new_fields = fields.copy() many_to_many_fields = {} for key in fields.keys(): if "_ptr" in key: del new_fields[key] continue if hasattr(document_class, key): field = getattr(document_class, key).field if isinstance(field, models.ManyToManyField): many_to_many_fields[key] = fields[key] else: new_fields[field.attname] = fields[key] del new_fields[key] reverted_document = document_class(**new_fields) with transaction.atomic(), reversion.create_revision(): reverted_document.save() # Restore ManyToManyFields for key in many_to_many_fields.keys(): getattr(reverted_document, key).clear() getattr(reverted_document, key).add(*many_to_many_fields[key]) reversion.set_user(request.user) reversion.set_comment( _('reverted to revision "{revision_comment}"'.format(revision_comment=revert_version.revision.comment)) ) return HttpResponse()
def versions(request, title): # get all versions of the document document = get_object_or_error(MinutesDocument, request.user, ['minutes.change_minutesdocument'], url_title=title) document_versions = prepare_versions(document) return render(request, 'minutes_versions.html', { 'active_page': 'versions', 'versions': document_versions, 'document': document, })
def revert(request): if not request.is_ajax() or not request.POST: raise Http404 version_id = request.POST['id'] document_url_title = request.POST['url_title'] document = get_object_or_error(Document, request.user, ['change_document'], url_title=document_url_title) versions = reversion.get_for_object(document) # find the we want to revert to revert_version = None for version in versions: if version.pk == int(version_id): revert_version = version break if revert_version is None: # user supplied version_id that does not exist return HttpResponseBadRequest('Could not find document') try: revert_version.revision.revert(delete=False) except RevertError: return HttpResponseServerError('Could not revert the version') fields = revert_version.field_dict document_class = ContentType.objects.get_for_id(fields.pop('polymorphic_ctype')).model_class() # Remove all references to parent objects, rename ForeignKeyFields, extract ManyToManyFields. new_fields = fields.copy() many_to_many_fields = {} for key in fields.keys(): if "_ptr" in key: del new_fields[key] continue if hasattr(document_class, key): field = getattr(document_class, key).field if isinstance(field, models.ManyToManyField): many_to_many_fields[key] = fields[key] else: new_fields[field.attname] = fields[key] del new_fields[key] reverted_document = document_class(**new_fields) with transaction.atomic(), reversion.create_revision(): reverted_document.save() # Restore ManyToManyFields for key in many_to_many_fields.keys(): getattr(reverted_document, key).clear() getattr(reverted_document, key).add(*many_to_many_fields[key]) reversion.set_user(request.user) reversion.set_comment( _('reverted to revision \"{revision_comment}\"'.format(revision_comment=revert_version.revision.comment))) return HttpResponse()
def autosave(request, title): document = None try: document = get_object_or_error( InformationDocument, request.user, ['information_pages.change_informationdocument'], url_title=title) except Document.DoesNotExist: pass handle_autosave(request, document) return HttpResponse()
def view(request, title): document = get_object_or_error(MinutesDocument, request.user, [MinutesDocument.get_view_permission()], url_title=title) md = markdown.Markdown(safe_mode='escape', extensions=[TocExtension(baselevel=2)]) text = md.convert(document.text) return render(request, 'minutes_base.html', { 'document': document, 'text': text, 'toc': md.toc, 'attachments': document.attachments.all(), 'active_page': 'view', })
def edit(request, title): document = get_object_or_error(MinutesDocument, request.user, ['minutes.change_minutesdocument'], url_title=title) success, form = handle_edit(request, document) if success: messages.success(request, _("Successfully saved changes")) return HttpResponseRedirect(reverse('minutes:edit', args=[document.url_title])) else: return render(request, "minutes_edit.html", { 'document': document, 'edit_url': reverse('minutes:edit', args=[document.url_title]), 'form': form, 'active_page': 'edit', })
def versions(request, title): # get all versions of the document document = get_object_or_error( InformationDocument, request.user, ['information_pages.change_informationdocument'], url_title=title) document_versions = prepare_versions(document) return render( request, 'information_pages_versions.html', { 'active_page': 'versions', 'versions': document_versions, 'document': document, })
def edit(request, title, new_autosaved_pages=[]): document = get_object_or_error(InformationDocument, request.user, ['information_pages.change_informationdocument'], url_title=title) success, form = handle_edit(request, document) if success: messages.success(request, _("Successfully saved changes")) return HttpResponseRedirect(reverse('information_pages:view_information', args=[document.url_title])) else: return render(request, "information_pages_edit.html", { 'document': document, 'form': form, 'active_page': 'edit', 'creation': (len(reversion.get_for_object(document)) == 0), 'new_autosaved_pages' : new_autosaved_pages, })
def attachments(request, title): document = get_object_or_error(MinutesDocument, request.user, ['minutes.change_minutesdocument'], url_title=title) success, form = handle_attachment(request, document) if success: messages.success(request, _("File has been uploaded successfully!")) return HttpResponseRedirect(reverse("minutes:attachments", args=[document.url_title])) else: return render(request, "minutes_attachments.html", { 'document': document, 'edit_url': reverse('minutes:attachments', args=[document.url_title]), 'form': form, 'attachments': document.attachments.all(), 'active_page': 'attachments', })
def get_delete_cascade(request, title): document = get_object_or_error(Document, request.user, ['change_document'], url_title=title) collector = NestedObjects(using=DEFAULT_DB_ALIAS) collector.collect([document]) delete_cascade = collector.nested() # remove all subclasses of current document from the list because that does not add much helpful information simplified_delete_cascade = [] for cascade_item in delete_cascade: if issubclass(type(document), type(cascade_item)) and not type(document) == type(cascade_item): continue simplified_delete_cascade.append(cascade_item) return HttpResponse(json.dumps(delete_cascade_to_json(simplified_delete_cascade)))
def vote(request, poll_id): poll = get_object_or_error(Poll, request.user, ['polls.view_poll', 'polls.change_poll'], id=poll_id) if poll.start_date > datetime.date.today(): # poll is not open raise Http404 if poll.end_date < datetime.date.today() or poll.participants.filter( id=request.user.pk).exists(): messages.info( request, _("You can not vote for polls that are already finished, or that you have already voted for!" )) return HttpResponseRedirect(reverse('polls:results', args=[poll_id])) if request.method == 'POST': choices = request.POST.getlist('choice') if len(choices) == 0: messages.error(request, _("You must select one Choice at least!")) return HttpResponseRedirect(reverse('polls:vote', args=[poll_id])) if len(choices) > poll.max_allowed_number_of_answers: messages.error( request, _("You can only select up to {} options!").format( poll.max_allowed_number_of_answers)) return HttpResponseRedirect(reverse('polls:vote', args=[poll_id])) for choice_id in choices: choice = poll.choices.get(id=choice_id) choice.votes += 1 choice.save() poll.participants.add(request.user) messages.success(request, _("We've received your vote!")) return HttpResponseRedirect(reverse('polls:results', args=[poll_id])) return render( request, 'polls_vote.html', { "poll": poll, "widget": "checkbox" if poll.max_allowed_number_of_answers != 1 else "radio" })
def view_information(request, title): document = get_object_or_error(InformationDocument, request.user, [InformationDocument.get_view_permission()], url_title=title) md = markdown.Markdown(safe_mode='escape', extensions=[TocExtension(baselevel=2)]) text = md.convert(document.text) anonymous_rights = get_anonymous_user().has_perm(InformationDocument.VIEW_PERMISSION_NAME, document) edit_rights = request.user.has_perm("change_informationdocument", document) permission_warning = edit_rights and not anonymous_rights return render(request, 'information_pages_base.html', { 'document': document, 'text': text, 'toc': md.toc, 'attachments': document.attachments.all().order_by('index'), 'active_page': 'view', 'permission_warning' : permission_warning, })
def results(request, poll_id): poll = get_object_or_error(Poll, request.user, ['polls.view_poll'], id=poll_id) if poll.start_date > datetime.date.today(): # poll is not open raise Http404 if not poll.participants.filter(id=request.user.pk).exists( ) and poll.end_date > datetime.date.today(): messages.info(request, _("You have to vote before you can see the results!")) return HttpResponseRedirect(reverse('polls:vote', args=[poll.id])) return render(request, 'polls_results.html', { "poll": poll, })
def edit(request, title): document = get_object_or_error(MinutesDocument, request.user, ['minutes.change_minutesdocument'], url_title=title) success, form = handle_edit(request, document) if success: messages.success(request, _("Successfully saved changes")) return HttpResponseRedirect( reverse('minutes:view', args=[document.url_title])) else: return render( request, "minutes_edit.html", { 'document': document, 'edit_url': reverse('minutes:edit', args=[document.url_title]), 'form': form, 'active_page': 'edit', })
def results(request, poll_id): poll = get_object_or_error(Poll, request.user, ['polls.view_poll'], id=poll_id) if poll.start_date > datetime.date.today(): # poll is not open raise Http404 if not poll.participants.filter(id=request.user.pk).exists() and poll.end_date > datetime.date.today(): messages.info(request, _("You have to vote before you can see the results!")) return HttpResponseRedirect(reverse('polls:vote', args=[poll.id])) return render( request, 'polls_results.html', { "poll": poll, } )
def view(request, title): document = get_object_or_error(MinutesDocument, request.user, [MinutesDocument.get_view_permission()], url_title=title) md = markdown.Markdown(safe_mode='escape', extensions=[TocExtension(baselevel=2)]) text = md.convert(document.text) return render( request, 'minutes_base.html', { 'document': document, 'text': text, 'toc': md.toc, 'attachments': document.attachments.all().order_by('index'), 'active_page': 'view', })
def edit(request, title, new_autosaved_pages=[]): document = get_object_or_error( InformationDocument, request.user, ['information_pages.change_informationdocument'], url_title=title) success, form = handle_edit(request, document) if success: messages.success(request, _("Successfully saved changes")) return HttpResponseRedirect( reverse('information_pages:view_information', args=[document.url_title])) else: return render( request, "information_pages_edit.html", { 'document': document, 'form': form, 'active_page': 'edit', 'creation': (len(reversion.get_for_object(document)) == 0), 'new_autosaved_pages': new_autosaved_pages, })
def permissions(request, title): document = get_object_or_error( InformationDocument, request.user, ['information_pages.change_informationdocument'], url_title=title) permissionFS = formset_factory(form=PermissionForm, extra=0) groups = Group.objects.all() initial_data = [] for group in groups: group_permissions = get_perms(group, document) data = { "change_permission": "change_informationdocument" in group_permissions, "delete_permission": "delete_informationdocument" in group_permissions, "view_permission": InformationDocument.VIEW_PERMISSION_NAME in group_permissions, "group_name": group.name, } initial_data.append(data) formset = permissionFS(request.POST or None, initial=initial_data) if request.POST and formset.is_valid(): for form in formset: form.save(document) messages.success(request, _("Permissions have been changed successfully.")) return HttpResponseRedirect( reverse('information_pages:permissions', args=[document.url_title])) return render(request, 'information_pages_permissions.html', { 'document': document, 'formset': formset, 'active_page': 'permissions', })
def vote(request, poll_id): poll = get_object_or_error(Poll, request.user, ['polls.view_poll', 'polls.change_poll'], id=poll_id) if poll.start_date > datetime.date.today(): # poll is not open raise Http404 if poll.end_date < datetime.date.today() or poll.participants.filter(id=request.user.pk).exists(): messages.info(request, _("You can not vote for polls that are already finished, or that you have already voted for!")) return HttpResponseRedirect(reverse('polls:results', args=[poll_id])) if request.method == 'POST': choices = request.POST.getlist('choice') if len(choices) == 0: messages.error(request, _("You must select one Choice at least!")) return HttpResponseRedirect(reverse('polls:vote', args=[poll_id])) if len(choices) > poll.max_allowed_number_of_answers: messages.error(request, _("You can only select up to {} options!").format(poll.max_allowed_number_of_answers)) return HttpResponseRedirect(reverse('polls:vote', args=[poll_id])) for choice_id in choices: choice = poll.choices.get(id=choice_id) choice.votes += 1 choice.save() poll.participants.add(request.user) messages.success(request, _("We've received your vote!")) return HttpResponseRedirect(reverse('polls:results', args=[poll_id])) return render( request, 'polls_vote.html', { "poll": poll, "widget": "checkbox" if poll.max_allowed_number_of_answers != 1 else "radio" } )
def view_information(request, title): document = get_object_or_error(InformationDocument, request.user, [InformationDocument.get_view_permission()], url_title=title) md = markdown.Markdown(safe_mode='escape', extensions=[TocExtension(baselevel=2)]) text = md.convert(document.text) anonymous_rights = get_anonymous_user().has_perm( InformationDocument.VIEW_PERMISSION_NAME, document) edit_rights = request.user.has_perm("change_informationdocument", document) permission_warning = edit_rights and not anonymous_rights return render( request, 'information_pages_base.html', { 'document': document, 'text': text, 'toc': md.toc, 'attachments': document.attachments.all().order_by('index'), 'active_page': 'view', 'permission_warning': permission_warning, })
def delete_document(request, title): document = get_object_or_error(Document, request.user, ['change_document'], url_title=title) document.delete() messages.success(request, _("Successfully deleted document: {}".format(document.title))) return HttpResponse()