Пример #1
0
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',
	})
Пример #2
0
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',
            })
Пример #3
0
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)
Пример #4
0
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()
Пример #5
0
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()
Пример #6
0
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()
Пример #7
0
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,
	})
Пример #8
0
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()
Пример #9
0
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()
Пример #10
0
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()
Пример #11
0
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',
	})
Пример #12
0
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',
		})
Пример #13
0
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,
        })
Пример #14
0
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,
		})
Пример #15
0
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',
		})
Пример #16
0
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)))
Пример #17
0
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"
        })
Пример #18
0
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,
	})
Пример #19
0
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,
    })
Пример #20
0
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',
            })
Пример #21
0
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,
		}
	)
Пример #22
0
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',
        })
Пример #23
0
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,
            })
Пример #24
0
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',
    })
Пример #25
0
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"
		}
	)
Пример #26
0
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,
        })
Пример #27
0
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()