Exemplo n.º 1
0
def add_element(request: HttpRequest, rid):
    repo = get_object_or_404(Repository.upload_queryset(request), id=rid)

    class ElementForm(forms.Form):
        package = forms.FileField(label=_('Package'))
        states = forms.ModelMultipleChoiceField(repo.archivestate_set.all(), label=_('States'))

        def clean(self):
            data_ = super().clean()
            if 'package' in self.cleaned_data:
                if not repo.get_model().is_file_valid(self.cleaned_data['package']):
                    raise ValidationError(_('This repository is unable to handle this file.'))
            return data_

    if request.method == 'POST':
        form = ElementForm(request.POST, files=request.FILES)
        if form.is_valid():
            try:
                element = generic_add_element(request, repo, form.cleaned_data['package'],
                                              [x.name for x in form.cleaned_data['states']])
                messages.info(request, _('The package %(n)s has been successfully uploaded.') % {'n': element.filename})
            except InvalidRepositoryException as e:
                messages.error(request, _('Unable to add the package to this repository: %(msg)s.') % {'msg': str(e)})
            return HttpResponseRedirect(reverse('moneta:add_element', kwargs={'rid': rid}))
    else:
        form = ElementForm()
    template_values = {'form': form, 'repo': repo, 'upload_allowed': repo.upload_allowed(request)}
    return render_to_response('moneta/add_package.html', template_values, RequestContext(request))
Exemplo n.º 2
0
def index(request: HttpRequest):
    repositories = Repository.index_queryset(request).annotate(
        package_count=Count('element'))
    if not request.user.has_perm('repository.add_repository'):
        form = None
    elif request.method == 'POST':
        form = get_repository_form()(request.POST)
        if form.is_valid():
            author = None if request.user.is_anonymous() else request.user
            repo = Repository(author=author,
                              name=form.cleaned_data['name'],
                              on_index=form.cleaned_data['on_index'],
                              archive_type=form.cleaned_data['archive_type'],
                              is_private=form.cleaned_data['is_private'])
            repo.save()
            for group in form.cleaned_data['admin_group']:
                repo.admin_group.add(group)
            for state in set(form.cleaned_data['states'].split()):
                ArchiveState(repository=repo, name=state, author=author).save()
            messages.info(request, _('Your new repository has been created.'))
            return HttpResponseRedirect(reverse('moneta:index'))
    else:
        form = get_repository_form()()
    # compute repos with admin rights
    upload_ids = {x.id for x in Repository.upload_queryset(request)}
    admin_ids = {x.id for x in Repository.admin_queryset(request)}
    template_values = {
        'repositories': repositories,
        'form': form,
        'request': request,
        'upload_ids': upload_ids,
        'admin_ids': admin_ids,
    }
    return render_to_response('moneta/index.html', template_values,
                              RequestContext(request))
Exemplo n.º 3
0
def index(request: HttpRequest):
    repositories = Repository.index_queryset(request).annotate(package_count=Count('element'))
    if not request.user.has_perm('repository.add_repository'):
        form = None
    elif request.method == 'POST':
        form = get_repository_form()(request.POST)
        if form.is_valid():
            author = None if request.user.is_anonymous() else request.user
            repo = Repository(author=author, name=form.cleaned_data['name'], on_index=form.cleaned_data['on_index'],
                              archive_type=form.cleaned_data['archive_type'],
                              is_private=form.cleaned_data['is_private'])
            repo.save()
            for group in form.cleaned_data['admin_group']:
                repo.admin_group.add(group)
            for state in set(form.cleaned_data['states'].split()):
                ArchiveState(repository=repo, name=state, author=author).save()
            messages.info(request, _('Your new repository has been created.'))
            return HttpResponseRedirect(reverse('moneta:index'))
    else:
        form = get_repository_form()()
    # compute repos with admin rights
    upload_ids = {x.id for x in Repository.upload_queryset(request)}
    admin_ids = {x.id for x in Repository.admin_queryset(request)}
    template_values = {'repositories': repositories, 'form': form, 'request': request,
                       'upload_ids': upload_ids, 'admin_ids': admin_ids, }
    return render_to_response('moneta/index.html', template_values, RequestContext(request))
Exemplo n.º 4
0
def modify_repository(request: HttpRequest, rid):
    repo = get_object_or_404(Repository.upload_queryset(request), id=rid)
    author = None if request.user.is_anonymous() else request.user

    if request.method == 'POST':
        form = RepositoryUpdateForm(request.POST)
        if form.is_valid():
            new_state_names = set(form.cleaned_data['states'].split())
            old_state_names = {x.name for x in repo.archivestate_set.all()}
            for name in new_state_names - old_state_names:  # new states
                ArchiveState(name=name, repository=repo, author=author).save()
            repo.on_index = form.cleaned_data['on_index']
            repo.is_private = form.cleaned_data['is_private']
            repo.save()
            repo.admin_group.clear()
            for group in form.cleaned_data['admin_group']:
                repo.admin_group.add(group)
            # repo.reader_group.clear()
            # for group in form.cleaned_data['reader_group']:
            #     repo.reader_group.add(group)
            removed_states = ArchiveState.objects.filter(name__in=old_state_names - new_state_names, repository=repo)
            # noinspection PyUnresolvedReferences
            Element.states.through.objects.filter(archivestate__in=removed_states).delete()
            removed_states.delete()
            messages.info(request, _('The repository %(repo)s has been modified.') % {'repo': repo.name})
            return HttpResponseRedirect(reverse('moneta:modify_repository', kwargs={'rid': rid, }))
    else:
        form = RepositoryUpdateForm(initial={'on_index': repo.on_index, 'is_private': repo.is_private,
                                             'reader_group': list(repo.reader_group.all()),
                                             'states': ' '.join([x.name for x in repo.archivestate_set.all()]),
                                             'admin_group': list(repo.admin_group.all())})
    template_values = {'form': form, 'repo': repo, 'upload_allowed': repo.upload_allowed(request)}
    return render_to_response('moneta/modify_repo.html', template_values, RequestContext(request))
Exemplo n.º 5
0
def modify_repository(request: HttpRequest, rid):
    repo = get_object_or_404(Repository.upload_queryset(request), id=rid)
    # noinspection PyUnresolvedReferences
    author = None if request.user.is_anonymous else request.user

    if request.method == 'POST':
        form = RepositoryUpdateForm(request.POST)
        if form.is_valid():
            new_state_names = set(form.cleaned_data['states'].split())
            old_state_names = {x.name for x in repo.archivestate_set.all()}
            for name in new_state_names - old_state_names:  # new states
                ArchiveState(name=name, repository=repo, author=author).save()
            repo.on_index = form.cleaned_data['on_index']
            repo.is_private = form.cleaned_data['is_private']
            repo.save()
            repo.admin_group.clear()
            for group in form.cleaned_data['admin_group']:
                repo.admin_group.add(group)
            # repo.reader_group.clear()
            # for group in form.cleaned_data['reader_group']:
            #     repo.reader_group.add(group)
            removed_states = ArchiveState.objects.filter(
                name__in=old_state_names - new_state_names, repository=repo)
            # noinspection PyUnresolvedReferences
            Element.states.through.objects.filter(
                archivestate__in=removed_states).delete()
            removed_states.delete()
            messages.info(
                request,
                _('The repository %(repo)s has been modified.') %
                {'repo': repo.name})
            return HttpResponseRedirect(
                reverse('moneta:modify_repository', kwargs={
                    'rid': rid,
                }))
    else:
        form = RepositoryUpdateForm(
            initial={
                'on_index': repo.on_index,
                'is_private': repo.is_private,
                'reader_group': list(repo.reader_group.all()),
                'states': ' '.join(
                    [x.name for x in repo.archivestate_set.all()]),
                'admin_group': list(repo.admin_group.all())
            })
    template_values = {
        'form': form,
        'repo': repo,
        'upload_allowed': repo.upload_allowed(request)
    }
    return TemplateResponse(request, 'moneta/modify_repo.html',
                            template_values)
Exemplo n.º 6
0
def delete_element(request: HttpRequest, rid, eid):
    from moneta.repository.forms import DeleteRepositoryForm

    repo = get_object_or_404(Repository.upload_queryset(request), id=rid)
    element = get_object_or_404(Element.objects.filter(repository=repo, id=eid))
    if request.method == 'POST':
        form = DeleteRepositoryForm(request.POST)
        if form.is_valid():
            element.delete()
            messages.warning(request, _('The package %(repo)s has been deleted.') % {'repo': element.full_name})
            return HttpResponseRedirect(reverse('moneta:index'))
    else:
        form = DeleteRepositoryForm()
    template_values = {'form': form, 'repo': repo, 'element': element}
    return render_to_response('moneta/delete_element.html', template_values, RequestContext(request))
Exemplo n.º 7
0
def delete_repository(request: HttpRequest, rid):
    from moneta.repository.forms import DeleteRepositoryForm

    repo = get_object_or_404(Repository.upload_queryset(request), id=rid)
    if request.method == 'POST':
        form = DeleteRepositoryForm(request.POST)
        if form.is_valid():
            for element in Element.objects.filter(repository=repo):
                element.delete()
            repo.delete()
            messages.warning(request, _('The repository %(repo)s has been deleted.') % {'repo': repo.name})
            return HttpResponseRedirect(reverse('moneta:index'))
    else:
        form = DeleteRepositoryForm()
    template_values = {'form': form, 'repo': repo}
    return TemplateResponse(request, 'moneta/delete_repo.html', template_values)
Exemplo n.º 8
0
def add_element(request: HttpRequest, rid):
    repo = get_object_or_404(Repository.upload_queryset(request), id=rid)

    class ElementForm(forms.Form):
        package = forms.FileField(label=_('Package'))
        states = forms.ModelMultipleChoiceField(repo.archivestate_set.all(),
                                                label=_('States'))

        def clean(self):
            data_ = super().clean()
            if 'package' in self.cleaned_data:
                if not repo.get_model().is_file_valid(
                        self.cleaned_data['package']):
                    raise ValidationError(
                        _('This repository is unable to handle this file.'))
            return data_

    if request.method == 'POST':
        form = ElementForm(request.POST, files=request.FILES)
        if form.is_valid():
            try:
                element = generic_add_element(
                    request, repo, form.cleaned_data['package'],
                    [x.name for x in form.cleaned_data['states']])
                messages.info(
                    request,
                    _('The package %(n)s has been successfully uploaded.') %
                    {'n': element.filename})
            except InvalidRepositoryException as e:
                messages.error(
                    request,
                    _('Unable to add the package to this repository: %(msg)s.')
                    % {'msg': str(e)})
            return HttpResponseRedirect(
                reverse('moneta:add_element', kwargs={'rid': rid}))
    else:
        form = ElementForm()
    template_values = {
        'form': form,
        'repo': repo,
        'upload_allowed': repo.upload_allowed(request)
    }
    return render_to_response('moneta/add_package.html', template_values,
                              RequestContext(request))
Exemplo n.º 9
0
def add_element_post(request: HttpRequest, rid):
    try:
        repo = Repository.upload_queryset(request).get(id=rid)
    except Repository.DoesNotExist:
        return HttpResponse(_('You cannot upload new packages to this repository'), status=403)
    if request.method != 'POST':
        return HttpResponse(_('Method not allowed'), status=405)
    validators = [RegexValidator(r'[\w\.\-\(\)/]+')]

    class ElementForm(forms.Form):
        filename = forms.CharField(label=_('Package'), max_length=255, validators=validators)
        states = forms.MultipleChoiceField(choices=[(x.name, x.name) for x in repo.archivestate_set.all()],
                                           label=_('States'))
        name = forms.CharField(label=_('Name'), max_length=255, validators=validators, required=False)
        archive = forms.CharField(label=_('Archive'), max_length=255, validators=validators, required=False)
        version = forms.CharField(label=_('Version'), max_length=255, validators=validators, required=False)

    form = ElementForm(request.GET)
    if not form.is_valid():
        return TemplateResponse(request, 'moneta/not_allowed.html', {}, status=405)

    tmp_file = tempfile.TemporaryFile(mode='w+b', dir=settings.FILE_UPLOAD_TEMP_DIR)
    c = False
    chunk = request.read(32768)
    while chunk:
        tmp_file.write(chunk)
        c = True
        chunk = request.read(32768)
    tmp_file.flush()
    tmp_file.seek(0)
    if not c:
        return HttpResponse(_('Empty file. You must POST a valid file.\n'), status=400)
    uploaded_file = UploadedFile(name=form.cleaned_data['filename'], file=tmp_file)
    try:
        element = generic_add_element(request, repo, uploaded_file, form.cleaned_data['states'],
                                      name=form.cleaned_data.get('name'), archive=form.cleaned_data.get('archive'),
                                      version=form.cleaned_data.get('version'), )
    except InvalidRepositoryException as e:
        return HttpResponse(str(e), status=400)
    finally:
        tmp_file.close()
    template_values = {'repo': repo, 'element': element}
    return HttpResponse(_('Package %(element)s successfully added to repository %(repo)s.\n') % template_values)
Exemplo n.º 10
0
def delete_repository(request: HttpRequest, rid):
    from moneta.repository.forms import DeleteRepositoryForm

    repo = get_object_or_404(Repository.upload_queryset(request), id=rid)
    if request.method == 'POST':
        form = DeleteRepositoryForm(request.POST)
        if form.is_valid():
            for element in Element.objects.filter(repository=repo):
                element.delete()
            repo.delete()
            messages.warning(
                request,
                _('The repository %(repo)s has been deleted.') %
                {'repo': repo.name})
            return HttpResponseRedirect(reverse('moneta:index'))
    else:
        form = DeleteRepositoryForm()
    template_values = {'form': form, 'repo': repo}
    return render_to_response('moneta/delete_repo.html', template_values,
                              RequestContext(request))
Exemplo n.º 11
0
def delete_element(request: HttpRequest, rid, eid):
    from moneta.repository.forms import DeleteRepositoryForm

    repo = get_object_or_404(Repository.upload_queryset(request), id=rid)
    element = get_object_or_404(Element.objects.filter(repository=repo,
                                                       id=eid))
    if request.method == 'POST':
        form = DeleteRepositoryForm(request.POST)
        if form.is_valid():
            element.delete()
            messages.warning(
                request,
                _('The package %(repo)s has been deleted.') %
                {'repo': element.full_name})
            return HttpResponseRedirect(reverse('moneta:index'))
    else:
        form = DeleteRepositoryForm()
    template_values = {'form': form, 'repo': repo, 'element': element}
    return TemplateResponse(request, 'moneta/delete_element.html',
                            template_values)
Exemplo n.º 12
0
 def force_index(self, request, rid, repo_slug):
     repo = get_object_or_404(Repository.upload_queryset(request), id=rid, archive_type=self.archive_type)
     self.generate_indexes(repo)
     return HttpResponse(_('Indexes have been successfully rebuilt.'))
Exemplo n.º 13
0
def add_element_post(request: HttpRequest, rid):
    try:
        repo = Repository.upload_queryset(request).get(id=rid)
    except Repository.DoesNotExist:
        return HttpResponse(
            _('You cannot upload new packages to this repository'), status=403)
    if request.method != 'POST':
        return HttpResponse(_('Method not allowed'), status=405)
    validators = [RegexValidator(r'[\w\.\-\(\)/]+')]

    class ElementForm(forms.Form):
        filename = forms.CharField(label=_('Package'),
                                   max_length=255,
                                   validators=validators)
        states = forms.MultipleChoiceField(
            [(x.name, x.name) for x in repo.archivestate_set.all()],
            label=_('States'))
        name = forms.CharField(label=_('Name'),
                               max_length=255,
                               validators=validators,
                               required=False)
        archive = forms.CharField(label=_('Archive'),
                                  max_length=255,
                                  validators=validators,
                                  required=False)
        version = forms.CharField(label=_('Version'),
                                  max_length=255,
                                  validators=validators,
                                  required=False)

    form = ElementForm(request.GET)
    if not form.is_valid():
        return render_to_response('moneta/not_allowed.html', status=405)

    tmp_file = tempfile.TemporaryFile(mode='w+b', dir=settings.TEMP_ROOT)
    c = False
    chunk = request.read(32768)
    while chunk:
        tmp_file.write(chunk)
        c = True
        chunk = request.read(32768)
    tmp_file.flush()
    tmp_file.seek(0)
    if not c:
        return HttpResponse(_('Empty file. You must POST a valid file.\n'),
                            status=400)
    uploaded_file = UploadedFile(name=form.cleaned_data['filename'],
                                 file=tmp_file)
    try:
        element = generic_add_element(
            request,
            repo,
            uploaded_file,
            form.cleaned_data['states'],
            name=form.cleaned_data.get('name'),
            archive=form.cleaned_data.get('archive'),
            version=form.cleaned_data.get('version'),
        )
    except InvalidRepositoryException as e:
        return HttpResponse(str(e), status=400)
    finally:
        tmp_file.close()
    template_values = {'repo': repo, 'element': element}
    return HttpResponse(
        _('Package %(element)s successfully added to repository %(repo)s.\n') %
        template_values)
Exemplo n.º 14
0
 def force_index(self, request, rid, repo_slug):
     repo = get_object_or_404(Repository.upload_queryset(request),
                              id=rid,
                              archive_type=self.archive_type)
     self.generate_indexes(repo)
     return HttpResponse(_('Indexes have been successfully rebuilt.'))