def xr_search(request, rpc_args, self, rid, repo_slug, state_slug=None): repo = get_object_or_404(Repository.reader_queryset(request), id=rid, archive_type=self.model) state = get_object_or_404(ArchiveState, repository=repo, name=state_slug) if state_slug else None global_and = len(rpc_args) == 0 or rpc_args[1] != 'or' if len(rpc_args) == 0 or not isinstance(rpc_args[0], dict): raise PermissionDenied filters = None for query_name, attr_name in (('name', 'archive'), ('version', 'version'), ('home_page', 'official_link'), ('description', 'long_description'),): if query_name in rpc_args[0]: value = rpc_args[0][query_name] if isinstance(value, list): if value: value = value[0] else: value = '' value = value.replace('-', '').replace('_', '') sub_query = Q(**{attr_name + '__icontains': value}) if filters is None: filters = sub_query elif global_and: filters = filters and sub_query else: filters = filters or sub_query query = Element.objects.filter(repository=repo) if state: query = query.filter(states=state) if filters is not None: query = query.filter(filters) res = [{'name': x.archive, 'version': x.version, 'summary': x.long_description, '_pypi_ordering': 1.0} for x in query] return res
def get_providers_by_version(self, request, rid, state_slug, archive): repo = get_object_or_404(Repository.reader_queryset(request), id=rid, archive_type=self.archive_type) base_query = Element.objects.filter(repository=repo, archive=archive) if state_slug: state = get_object_or_404(ArchiveState, repository=repo, name=state_slug) base_query = base_query.filter(states=state) versions = {} for element in base_query: metadata = json.loads(element.extra_data) versions.setdefault(element.version, []).append({ 'name': metadata['provider'], 'url': '%s%s' % (settings.SERVER_NAME, element.get_direct_link()), 'checksum_type': 'sha1', 'checksum': element.sha1}) result = {'name': archive, 'description': _('This box contains %(name)s') % {'name': archive}, 'versions': [{'version': k, 'status': 'active', 'providers': v} for (k, v) in versions.items()]} return result # Vagrant.configure(2) do |config| # # config.vm.box = "{$relativePathInfo|escape}" # config.vm.box_url = '<a href="{$CATALOG_URI|escape}{$pathInfo|escape}">{$CATALOG_URI|escape}{$pathInfo|escape}</a>' # # # Whatever other config stuff you want to do # end
def index(self, request, rid, repo_slug=None, state_slug=''): repo = get_object_or_404(Repository.reader_queryset(request), id=rid, archive_type=self.archive_type) base_query = Element.objects.filter(repository=repo) if state_slug: state = get_object_or_404(ArchiveState, repository=repo, name=state_slug) base_query = base_query.filter(states=state) base_query = base_query.order_by('archive', 'version') element_infos = [] for element in base_query: if not element.extra_data: continue provider = json.loads(element.extra_data)['provider'] element_infos.append( (element.name, reverse('vagrant:get_box', kwargs={'rid': rid, 'repo_slug': repo.slug, 'eid': element.id, 'provider': provider, 'archive': element.archive, 'version': element.version}), element.sha1) ) states = [state for state in ArchiveState.objects.filter(repository=repo).order_by('name')] tab_infos = [(reverse('vagrant:index', kwargs={'rid': repo.id, 'state_slug': ''}), ArchiveState(name=_('All states'), slug='all-states'), states, ''), ] tab_infos += [(reverse('vagrant:index', kwargs={'rid': repo.id, 'state_slug': state.slug}), state, [state], state.slug) for state in states] # list of (relative URL, name, list of states, state_slug) template_values = {'repo': repo, 'states': states, 'upload_allowed': repo.upload_allowed(request), 'state_slug': state_slug, 'elements': element_infos, 'index_url': reverse(moneta_url(repo, 'index'), kwargs={'rid': repo.id, }), 'tab_infos': tab_infos, 'admin_allowed': repo.admin_allowed(request), } return render_to_response(self.index_html, template_values, RequestContext(request))
def index(self, request, rid, repo_slug=None, state_slug=None): repo = get_object_or_404(Repository.reader_queryset(request), id=rid, archive_type=self.archive_type) states = list( ArchiveState.objects.filter(repository=repo).order_by('name')) template_values = { 'repo': repo, 'states': states, 'upload_allowed': repo.upload_allowed(request), 'admin_allowed': repo.admin_allowed(request), } view_name = moneta_url(repo, 'index') tab_infos = [ (reverse(view_name, kwargs={ 'rid': repo.id, 'repo_slug': repo.slug }), states, ArchiveState(name=_('All states'), slug='all-states')), ] for state in states: tab_infos.append((reverse(view_name, kwargs={ 'rid': repo.id, 'repo_slug': repo.slug, 'state_slug': state.slug }), [state], state)) template_values['tab_infos'] = tab_infos return render_to_response('repositories/ruby/index.html', template_values, RequestContext(request))
def index(self, request, rid): repo = get_object_or_404(Repository.reader_queryset(request), id=rid, archive_type=self.archive_type) states = [ state for state in ArchiveState.objects.filter( repository=repo).order_by('name') ] tab_infos = [ (states, ArchiveState(name=_('All states'), slug='all-states')), ] tab_infos += [([state], state) for state in states] template_values = { 'repo': repo, 'states': states, 'upload_allowed': repo.upload_allowed(request), 'index_url': reverse(moneta_url(repo, 'index'), kwargs={ 'rid': repo.id, }), 'tab_infos': tab_infos, 'admin_allowed': repo.admin_allowed(request), } return render_to_response(self.index_html, template_values, RequestContext(request))
def index_file(self, request, rid, filename, mimetype): repo = get_object_or_404(Repository.reader_queryset(request), id=rid, archive_type=self.archive_type) uid = self.storage_uid % repo.id key = storage(settings.STORAGE_CACHE).uid_to_key(uid) return sendpath(settings.STORAGE_CACHE, key, filename, mimetype)
def folder_index(self, request, rid, repo_slug, state_slug, folder): """ Return a HttpResponse :param request: HttpRequest :raise: """ repo = get_object_or_404(Repository.reader_queryset(request), id=rid, archive_type=self.archive_type) state = get_object_or_404(ArchiveState, repository=repo, slug=state_slug) q = Element.objects.filter(repository__id=rid, archive__startswith=folder, states=state) element_query = q.select_related()[0:100] element_count = q.count() template_values = { 'repo': repo, 'state': state_slug, 'element_count': element_count, 'elements': element_query, 'folder': folder, 'upload_allowed': repo.upload_allowed(request), } return render_to_response('repositories/aptitude/folder_index.html', template_values, RequestContext(request))
def browse_repository(self, request: HttpRequest, rid, repo_slug, query_string='', state_slug=None) -> HttpResponse: repo = get_object_or_404(Repository.reader_queryset(request), id=rid, archive_type=self.archive_type) result = self.browse_repo_inner(rid, query_string, state_slug=state_slug) if isinstance(result, str): # sha1/sha256/md5 return HttpResponse(result) elif isinstance(result, Element): return get_file(request, eid=result.pk, element=result) assert isinstance(result, dict) new_query_string = '' bread_crumbs = [(_('Root'), self.get_browse_url(repo, new_query_string, state_slug=state_slug))] while len(result) == 1 and isinstance(result, dict): path_component, result = result.popitem() new_query_string += path_component + '/' bread_crumbs.append((path_component, self.get_browse_url(repo, new_query_string, state_slug=state_slug))) if isinstance(result, set): url_list = [] for elt in result: new_gavf_elt_filename = new_query_string + elt.filename elt_url = self.get_browse_url(repo, new_gavf_elt_filename, state_slug=state_slug) url_list += [(new_gavf_elt_filename, elt_url, elt.id), (new_gavf_elt_filename + '.sha1', elt_url + '.sha1', None), (new_gavf_elt_filename + '.sha256', elt_url + '.sha256', None), (new_gavf_elt_filename + '.md5', elt_url + '.md5', None), ] else: assert isinstance(result, dict) url_list = [(new_query_string + key, self.get_browse_url(repo, new_query_string + key, state_slug=state_slug), None) for key in result] template_values = {'repo': repo, 'upload_allowed': repo.upload_allowed(request), 'repo_slug': repo_slug, 'admin': True, 'paths': url_list, 'request_path': new_query_string, 'state_slug': state_slug, 'bread_crumbs': bread_crumbs, } status_code = 200 if url_list else 404 return TemplateResponse(request, 'repositories/maven3/browse.html', template_values, status=status_code)
def index(self, request, rid): repo = get_object_or_404(Repository.reader_queryset(request), id=rid, archive_type=self.archive_type) states = list( ArchiveState.objects.filter(repository=repo).order_by('name')) template_values = { 'repo': repo, 'states': states, 'upload_allowed': repo.upload_allowed(request), 'admin_allowed': repo.admin_allowed(request), } state_infos = [] template_values['state_slug'] = None request_context = RequestContext(request) viewname = moneta_url(repo, 'browse') url = reverse(viewname, kwargs={ 'rid': repo.id, 'repo_slug': repo.slug, }) state_infos.append(('all-packages', url, _('All states'), states)) for state in states: template_values['state_slug'] = state.slug url = reverse(viewname, kwargs={ 'rid': repo.id, 'repo_slug': repo.slug, 'state_slug': state.slug }) state_infos.append((state.slug, url, state.name, [state])) template_values['state_infos'] = state_infos return render_to_response('repositories/flat_files/index.html', template_values, request_context)
def index(self, request, rid): repo = get_object_or_404(Repository.reader_queryset(request), id=rid, archive_type=self.archive_type) states = list( ArchiveState.objects.filter(repository=repo).order_by('name')) template_values = { 'repo': repo, 'states': states, 'upload_allowed': repo.upload_allowed(request), 'admin_allowed': repo.admin_allowed(request), } state_infos = [] template_values['state_slug'] = None request_context = RequestContext(request) setting_str = render_to_string( 'repositories/maven3/maven_settings.xml', template_values, request_context) state_infos.append( ('all-packages', str(setting_str), _('All states'), states)) for state in states: template_values['state_slug'] = state.slug setting_str = render_to_string( 'repositories/maven3/maven_settings.xml', template_values, request_context) state_infos.append( (state.slug, str(setting_str), state.name, [state])) template_values['state_infos'] = state_infos return render_to_response('repositories/maven3/index.html', template_values, request_context)
def quick_gem_specs(self, request, rid, repo_slug, state_slug=None, filename=None, compression=''): name, sep, version = filename.rpartition('-') if sep != '-': raise Http404 # noinspection PyUnusedLocal repo_slug = repo_slug repo = get_object_or_404(Repository.reader_queryset(request), id=rid, archive_type=self.archive_type) base_query = Element.objects.filter(repository=repo) if state_slug: state = get_object_or_404(ArchiveState, repository=repo, name=state_slug) base_query = base_query.filter(states=state) element = get_object_or_404(base_query, name=name, version=version) content = self.marshal_data(element) if compression == '.rz': content = zlib.compress(content) return HttpResponse(content, content_type='application/gzip')
def gpg_key(self, request, rid, repo_slug=None, slug=None): get_object_or_404(Repository.reader_queryset(request), id=rid, archive_type=self.archive_type) signature = GPGSigner().export_key() # noinspection PyUnusedLocal repo_slug, slug = slug, repo_slug return HttpResponse(signature, content_type="text/plain")
def index(self, request, rid): repo = get_object_or_404(Repository.reader_queryset(request), id=rid, archive_type=self.archive_type) states = [state for state in ArchiveState.objects.filter(repository=repo).order_by('name')] tab_infos = [(states, ArchiveState(name=_('All states'), slug='all-states')), ] tab_infos += [([state], state) for state in states] template_values = {'repo': repo, 'states': states, 'upload_allowed': repo.upload_allowed(request), 'index_url': reverse(moneta_url(repo, 'index'), kwargs={'rid': repo.id, }), 'tab_infos': tab_infos, 'admin_allowed': repo.admin_allowed(request), } return TemplateResponse(request, self.index_html, template_values)
def plugin_index(self, request: HttpRequest, rid, repo_slug, state_slug=None): # noinspection PyUnusedLocal repo_slug = repo_slug repo = get_object_or_404(Repository.reader_queryset(request), id=rid, archive_type=self.archive_type) base_query = Element.objects.filter(repository=repo) if state_slug: state = get_object_or_404(ArchiveState, repository=repo, name=state_slug) base_query = base_query.filter(states=state) return TemplateResponse(request, 'repositories/jetbrains/updatePlugins.xml', {'elements': base_query}, content_type='application/xml')
def download(self, request, rid, repo_slug, state_slug=None, filename=None): # noinspection PyUnusedLocal repo_slug = repo_slug repo = get_object_or_404(Repository.reader_queryset(request), id=rid, archive_type=self.archive_type) base_query = Element.objects.filter(repository=repo) if state_slug: state = get_object_or_404(ArchiveState, repository=repo, name=state_slug) base_query = base_query.filter(states=state) element = get_object_or_404(base_query, filename=filename) from moneta.views import get_file return get_file(request, element.pk)
def specs(self, request, rid, repo_slug, state_slug=None, filename='specs.4.8.gz'): # noinspection PyUnusedLocal repo_slug = repo_slug repo = get_object_or_404(Repository.reader_queryset(request), id=rid, archive_type=self.archive_type) if state_slug: filename = 'specs/%(slug)s/%(filename)s' % {'slug': state_slug, 'filename': filename, } else: filename = 'specs/%(filename)s' % {'filename': filename, } uid = self.storage_uid % repo.pk key = storage(settings.STORAGE_CACHE).uid_to_key(uid) return sendpath(settings.STORAGE_CACHE, key, filename, 'application/gzip')
def search_package(request: HttpRequest, rid): repo = get_object_or_404(Repository.reader_queryset(request), id=rid) repo_states = list(ArchiveState.objects.filter(repository=repo)) class ElementSearchForm(forms.Form): search = forms.CharField(label=_('Search'), help_text=_('Type your search'), max_length=200, required=False) states = forms.ModelMultipleChoiceField( label=_('Selected states'), required=False, initial=repo_states, queryset=ArchiveState.objects.filter(repository=repo), ) states.help_text = '' if request.GET.get('search') is not None: form = ElementSearchForm(request.GET) else: form = ElementSearchForm() query = Element.objects.filter(repository=repo) search_pattern = '' if form.is_valid(): search_pattern = form.cleaned_data['search'] if search_pattern: query = query.filter(full_name__icontains=search_pattern) if form.cleaned_data['states']: query = query.filter( states__in=form.cleaned_data['states']).distinct() else: query = query.filter(states__in=repo_states).distinct() paginator = Paginator(query.order_by('full_name'), 25) page = request.GET.get('page') try: elements = paginator.page(page) except PageNotAnInteger: # If page is not an integer, deliver first page. elements = paginator.page(1) except EmptyPage: # If page is out of range (e.g. 9999), deliver last page of results. elements = paginator.page(paginator.num_pages) template_values = { 'elements': elements, 'repo': repo, 'pattern': search_pattern, 'form': form, 'upload_allowed': repo.upload_allowed(request) } return render_to_response('moneta/search_repo.html', template_values, RequestContext(request))
def xr_package_releases(request, rpc_args, self, rid, repo_slug, state_slug=None): if len(rpc_args) == 0: raise PermissionDenied repo = get_object_or_404(Repository.reader_queryset(request), id=rid, archive_type=self.model) if state_slug: state = get_object_or_404(ArchiveState, repository=repo, name=state_slug) query = Element.objects.filter(repository=repo, states=state, archive=rpc_args[0]) else: query = Element.objects.filter(repository=repo, archive=rpc_args[0]) versions = [LooseVersion(x.version) for x in query] versions.sort() return [str(x) for x in versions]
def gem_specs(self, request, rid, repo_slug, state_slug=None, filename=None): name, sep, version = filename.rpartition('-') if sep != '-': raise Http404 # noinspection PyUnusedLocal repo_slug = repo_slug repo = get_object_or_404(Repository.reader_queryset(request), id=rid, archive_type=self.archive_type) base_query = Element.objects.filter(repository=repo) if state_slug: state = get_object_or_404(ArchiveState, repository=repo, name=state_slug) base_query = base_query.filter(states=state) element = get_object_or_404(base_query, name=name, version=version) return HttpResponse(self.yaml_data(element), content_type='text/yaml')
def repodata_file(self, request, rid, repo_slug, state_slug, arch, filename, compression): if filename not in ('comps.xml', 'primary.xml', 'other.xml', 'filelists.xml', 'repomd.xml', ): return HttpResponse(_('File not found'), status=404) if compression and filename == 'repomd.xml': return HttpResponse(_('File not found'), status=404) # noinspection PyUnusedLocal repo_slug = repo_slug filename = self.index_filename(state_slug, arch, filename + compression) mimetype = 'text/xml' repo = get_object_or_404(Repository.reader_queryset(request), id=rid, archive_type=self.archive_type) uid = self.storage_uid % repo.id key = storage(settings.STORAGE_CACHE).uid_to_key(uid) return sendpath(settings.STORAGE_CACHE, key, filename, mimetype)
def get_box(self, request: HttpRequest, rid, repo_slug, eid, archive, version, provider): repo = get_object_or_404(Repository.reader_queryset(request), id=rid, archive_type=self.archive_type) elements = list(Element.objects.filter(repository=repo, pk=eid)[0:1]) if not elements: return JsonResponse({ 'errors': [ 'Not found', ], }) return get_file(request, eid, element=elements[0])
def get_file(self, request, rid, repo_slug, state_slug, folder, filename): """ Return a HttpResponse :param request: HttpRequest :raise: """ repo = get_object_or_404(Repository.reader_queryset(request), id=rid, archive_type=self.archive_type) q = Element.objects.filter(repository__id=rid, filename=filename)[0:1] q = list(q) if len(q) == 0: raise Http404 element = q[0] return get_file(request, element.id, compression=None, path='', element=element, name=None)
def simple(self, request, rid, repo_slug, state_slug=None, search_pattern=''): search_pattern = search_pattern.replace('-', '').replace('_', '') repo = get_object_or_404(Repository.reader_queryset(request), id=rid, archive_type=self.archive_type) base_query = Element.objects.filter(repository=repo) if state_slug: state = get_object_or_404(ArchiveState, repository=repo, name=state_slug) base_query = base_query.filter(states=state) if search_pattern: base_query = base_query.filter(archive__iexact=search_pattern) view_name = moneta_url(repo, 'get_file') elements = [(x.filename, x.md5, reverse(view_name, kwargs={'eid': x.id, })) for x in base_query[0:1000]] template_values = {'elements': elements, 'rid': rid, } return TemplateResponse(request, 'repositories/pypi/simple.html', template_values)
def get_box(self, request: HttpRequest, rid, repo_slug, eid, archive, version, provider): # noinspection PyUnusedLocal repo_slug = repo_slug # noinspection PyUnusedLocal archive = archive # noinspection PyUnusedLocal provider = provider # noinspection PyUnusedLocal version = version repo = get_object_or_404(Repository.reader_queryset(request), id=rid, archive_type=self.archive_type) elements = list(Element.objects.filter(repository=repo, pk=eid)[0:1]) if not elements: return JsonResponse({'errors': ['Not found', ], }) return get_file(request, eid, element=elements[0])
def xr_list_packages(request, rpc_args, self, rid, repo_slug, state_slug=None): repo = get_object_or_404(Repository.reader_queryset(request), id=rid, archive_type=self.model) if state_slug: state = get_object_or_404(ArchiveState, repository=repo, name=state_slug) query = Element.objects.filter(repository=repo, states=state).order_by('name') else: query = Element.objects.filter(repository=repo).order_by('name') results = [] prev = None for value in query: if value.name != prev: results.append(value.name) prev = value.name return results
def folder_index(self, request, rid, repo_slug, state_slug, folder): """ Return a HttpResponse :param request: HttpRequest :raise: """ repo = get_object_or_404(Repository.reader_queryset(request), id=rid, archive_type=self.archive_type) state = get_object_or_404(ArchiveState, repository=repo, slug=state_slug) q = Element.objects.filter(repository__id=rid, archive__startswith=folder, states=state) element_query = q.select_related()[0:100] element_count = q.count() template_values = {'repo': repo, 'state': state_slug, 'element_count': element_count, 'elements': element_query, 'folder': folder, 'upload_allowed': repo.upload_allowed(request), } return render_to_response('repositories/aptitude/folder_index.html', template_values, RequestContext(request))
def index(self, request, rid): repo = get_object_or_404(Repository.reader_queryset(request), id=rid, archive_type=self.archive_type) states = list(ArchiveState.objects.filter(repository=repo).order_by('name')) template_values = {'repo': repo, 'states': states, 'upload_allowed': repo.upload_allowed(request), 'admin_allowed': repo.admin_allowed(request), } view_name = moneta_url(repo, 'simple') tab_infos = [ (reverse(view_name, kwargs={'rid': repo.id, 'repo_slug': repo.slug}), states, ArchiveState(name=_('All states'), slug='all-states')), ] for state in states: tab_infos.append((reverse(view_name, kwargs={'rid': repo.id, 'repo_slug': repo.slug, 'state_slug': state.slug}), [state], state)) template_values['tab_infos'] = tab_infos return TemplateResponse(request, 'repositories/pypi/index.html', template_values)
def index(self, request, rid): repo = get_object_or_404(Repository.reader_queryset(request), id=rid, archive_type=self.archive_type) states = list(ArchiveState.objects.filter(repository=repo).order_by('name')) template_values = {'repo': repo, 'states': states, 'upload_allowed': repo.upload_allowed(request), 'admin_allowed': repo.admin_allowed(request), } state_infos = [] template_values['state_slug'] = None request_context = RequestContext(request) setting_str = render_to_string('repositories/maven3/maven_settings.xml', template_values, request_context) state_infos.append(('all-packages', str(setting_str), _('All states'), states)) for state in states: template_values['state_slug'] = state.slug setting_str = render_to_string('repositories/maven3/maven_settings.xml', template_values, request_context) state_infos.append((state.slug, str(setting_str), state.name, [state])) template_values['state_infos'] = state_infos return TemplateResponse(request, 'repositories/maven3/index.html', template_values)
def index(self, request, rid): repo = get_object_or_404(Repository.reader_queryset(request), id=rid, archive_type=self.archive_type) states = list(ArchiveState.objects.filter(repository=repo).order_by('name')) template_values = {'repo': repo, 'states': states, 'upload_allowed': repo.upload_allowed(request), 'admin_allowed': repo.admin_allowed(request), } state_infos = [] template_values['state_slug'] = None viewname = moneta_url(repo, 'browse') url = reverse(viewname, kwargs={'rid': repo.id, 'repo_slug': repo.slug, }) state_infos.append(('all-packages', url, _('All states'), states)) for state in states: template_values['state_slug'] = state.slug url = reverse(viewname, kwargs={'rid': repo.id, 'repo_slug': repo.slug, 'state_slug': state.slug}) state_infos.append((state.slug, url, state.name, [state])) template_values['state_infos'] = state_infos return TemplateResponse(request, 'repositories/flat_files/index.html', template_values)
def get_providers_by_version(self, request, rid, state_slug, archive): repo = get_object_or_404(Repository.reader_queryset(request), id=rid, archive_type=self.archive_type) base_query = Element.objects.filter(repository=repo, archive=archive) if state_slug: state = get_object_or_404(ArchiveState, repository=repo, name=state_slug) base_query = base_query.filter(states=state) versions = {} for element in base_query: metadata = json.loads(element.extra_data) versions.setdefault(element.version, []).append({ 'name': metadata['provider'], 'url': '%s%s' % (settings.SERVER_NAME, element.get_direct_link()), 'checksum_type': 'sha1', 'checksum': element.sha1 }) result = { 'name': archive, 'description': _('This box contains %(name)s') % { 'name': archive }, 'versions': [{ 'version': k, 'status': 'active', 'providers': v } for (k, v) in versions.items()] } return result # Vagrant.configure(2) do |config| # # config.vm.box = "{$relativePathInfo|escape}" # config.vm.box_url = '<a href="{$CATALOG_URI|escape}{$pathInfo|escape}">{$CATALOG_URI|escape}{$pathInfo|escape}</a>' # # # Whatever other config stuff you want to do # end
def xr_user_packages(request, rpc_args, self, rid, repo_slug, state_slug=None): if len(rpc_args) == 0: raise PermissionDenied author = str(rpc_args[0]).lower() repo = get_object_or_404(Repository.reader_queryset(request), id=rid, archive_type=self.model) if state_slug: state = get_object_or_404(ArchiveState, repository=repo, name=state_slug) query = Element.objects.filter(repository=repo, state=state).filter(author__name__icontains=author) \ .order_by('name') else: query = Element.objects.filter(repository=repo).filter(author__name__icontains=author).order_by('name') results = [] prev = None for value in query: if value.name != prev: results.append(('Owner', value.name)) prev = value.name return results
def get_providers_by_version(self, request, rid, state_slug, archive): repo = get_object_or_404(Repository.reader_queryset(request), id=rid, archive_type=self.archive_type) base_query = Element.objects.filter(repository=repo, archive=archive) if state_slug: state = get_object_or_404(ArchiveState, repository=repo, name=state_slug) base_query = base_query.filter(states=state) versions = {} for element in base_query: metadata = json.loads(element.extra_data) versions.setdefault(element.version, []).append({ 'name': metadata['provider'], 'url': '%s%s' % (settings.SERVER_BASE_URL[:-1], element.get_direct_link()), 'checksum_type': 'sha1', 'checksum': element.sha1}) result = {'name': archive, 'description': _('This box contains %(name)s') % {'name': archive}, 'versions': [{'version': k, 'status': 'active', 'providers': v} for (k, v) in versions.items()]} return result
def compare_states(request: HttpRequest, rid): repo = get_object_or_404(Repository.reader_queryset(request), id=rid) states = ArchiveState.objects.filter(repository=repo) operators = {'<': lambda x, y: x < y, '≤': lambda x, y: x <= y, '=': lambda x, y: x == y, '≥': lambda x, y: x >= y, '>': lambda x, y: x > y} class CompareForm(forms.Form): state_left = forms.ModelChoiceField(states, label=_('Left state')) operator = forms.ChoiceField([(x, x) for x in operators], label=_('Assert operator')) state_right = forms.ModelChoiceField(states, label=_('Right state')) template_values = {'repo': repo, 'upload_allowed': repo.upload_allowed(request)} if request.method == 'POST': form = CompareForm(request.POST) if form.is_valid(): state_left = form.cleaned_data['state_left'] state_right = form.cleaned_data['state_right'] operator = operators[form.cleaned_data['operator']] left_elements = Element.objects.filter(repository=repo, states=state_left) right_elements = Element.objects.filter(repository=repo, states=state_right) left_dict = {} right_dict = {} for element in left_elements: left_dict.setdefault(element.archive, (LooseVersion(element.version), []))[1].append(element) for element in right_elements: right_dict.setdefault(element.archive, (LooseVersion(element.version), []))[1].append(element) only_left, only_right = {}, {} left_keys, right_keys = set(left_dict.keys()), set(right_dict.keys()) for key in left_keys - right_keys: only_left[key] = left_dict[key] for key in right_keys - left_keys: only_right[key] = right_dict[key] invalid_values = [] for key in left_keys.intersection(right_keys): if not operator(left_dict[key][0], right_dict[key][0]): invalid_values.append((key, left_dict[key], right_dict[key])) invalid_values.sort(key=lambda x: x[0]) template_values.update({'only_left': only_left, 'only_right': only_right, 'invalid_values': invalid_values, 'state_left': state_left, 'state_right': state_right}) template_values['all_valid'] = bool(not only_left and not only_right and not invalid_values) else: form = CompareForm() template_values['form'] = form return render_to_response('moneta/compare_states.html', template_values, RequestContext(request))
def index(self, request, rid): repo = get_object_or_404(Repository.reader_queryset(request), id=rid, archive_type=self.archive_type) states = [ state for state in ArchiveState.objects.filter( repository=repo).order_by('name') ] tab_infos = [ (reverse('repository:jetbrains:plugin_index', kwargs={ 'rid': repo.id, 'repo_slug': repo.slug }), ArchiveState(name=_('All states'), slug='all-states'), states), ] tab_infos += [(reverse('repository:jetbrains:plugin_index', kwargs={ 'rid': repo.id, 'repo_slug': repo.slug, 'state_slug': state.slug }), state, [state]) for state in states] template_values = { 'repo': repo, 'states': states, 'upload_allowed': repo.upload_allowed(request), 'index_url': reverse(moneta_url(repo, 'index'), kwargs={ 'rid': repo.id, }), 'tab_infos': tab_infos, 'admin_allowed': repo.admin_allowed(request), } return TemplateResponse(request, self.index_html, template_values)
def search_package(request: HttpRequest, rid): repo = get_object_or_404(Repository.reader_queryset(request), id=rid) repo_states = list(ArchiveState.objects.filter(repository=repo)) class ElementSearchForm(forms.Form): search = forms.CharField(label=_('Search'), help_text=_('Type your search'), max_length=200, required=False) states = forms.ModelMultipleChoiceField(label=_('Selected states'), required=False, initial=repo_states, queryset=ArchiveState.objects.filter(repository=repo), ) states.help_text = '' if request.GET.get('search') is not None: form = ElementSearchForm(request.GET) else: form = ElementSearchForm() query = Element.objects.filter(repository=repo) search_pattern = '' if form.is_valid(): search_pattern = form.cleaned_data['search'] if search_pattern: query = query.filter(full_name__icontains=search_pattern) if form.cleaned_data['states']: query = query.filter(states__in=form.cleaned_data['states']).distinct() else: query = query.filter(states__in=repo_states).distinct() paginator = Paginator(query.order_by('full_name'), 25) page = request.GET.get('page') try: elements = paginator.page(page) except PageNotAnInteger: # If page is not an integer, deliver first page. elements = paginator.page(1) except EmptyPage: # If page is out of range (e.g. 9999), deliver last page of results. elements = paginator.page(paginator.num_pages) template_values = {'elements': elements, 'repo': repo, 'pattern': search_pattern, 'form': form, 'upload_allowed': repo.upload_allowed(request)} return render_to_response('moneta/search_repo.html', template_values, RequestContext(request))
def xr_release_data(request, rpc_args, self, rid, repo_slug, state_slug=None): if len(rpc_args) != 2: raise PermissionDenied name = rpc_args[0] version = rpc_args[1] repo = get_object_or_404(Repository.reader_queryset(request), id=rid, archive_type=self.model) if state_slug: stat = get_object_or_404(ArchiveState, repository=repo, name=state_slug) query = list(Element.objects.filter(repository=repo, state=stat).filter(archive=name, version=version)[0:1]) else: query = list(Element.objects.filter(repository=repo).filter(archive=name, version=version)[0:1]) if not query: return {} element = query[0] result = {} for query_name, attr_name in (('name', 'archive'), ('version', 'version'), ('home_page', 'official_link'), ('description', 'long_description'), ('author', 'author')): result[query_name] = str(getattr(element, attr_name)) for k in ('author_email', 'maintainer', 'maintainer_email', 'license', 'summary', 'keywords', 'platform', 'download_url'): result[k] = '' return result
def xr_release_urls(request, rpc_args, self, rid, repo_slug, state_slug=None): if len(rpc_args) != 2: raise PermissionDenied name = rpc_args[0] version = rpc_args[1] repo = get_object_or_404(Repository.reader_queryset(request), id=rid, archive_type=self.model) if state_slug: state = get_object_or_404(ArchiveState, repository=repo, name=state_slug) query = Element.objects.filter(repository=repo, state=state).filter(archive=name, version=version) else: query = Element.objects.filter(repository=repo).filter(archive=name, version=version) results = [] # noinspection PyUnresolvedReferences base = request.build_absolute_uri('/')[:-1] for element in query: view_name = moneta_url(repo, 'get_file') package_url = base + reverse(view_name, kwargs={'eid': element.id, }) results.append({'url': package_url, 'packagetype': 'sdist', 'filename': element.filename, 'size': element.filesize, 'downloads': 0, 'comment_text': element.long_description, 'md5_dist': element.md5, 'has_sig': False, 'python_version': 'source', }) return results
def get_providers_by_version(self, request, rid, state_slug, archive): repo = get_object_or_404(Repository.reader_queryset(request), id=rid, archive_type=self.archive_type) base_query = Element.objects.filter(repository=repo, archive=archive) if state_slug: state = get_object_or_404(ArchiveState, repository=repo, name=state_slug) base_query = base_query.filter(states=state) versions = {} for element in base_query: metadata = json.loads(element.extra_data) versions.setdefault(element.version, []).append({ 'name': metadata['provider'], 'url': '%s%s' % (settings.SERVER_BASE_URL[:-1], element.get_direct_link()), 'checksum_type': 'sha1', 'checksum': element.sha1 }) result = { 'name': archive, 'description': _('This box contains %(name)s') % { 'name': archive }, 'versions': [{ 'version': k, 'status': 'active', 'providers': v } for (k, v) in versions.items()] } return result
def specs(self, request, rid, repo_slug, state_slug=None, filename='specs.4.8.gz'): # noinspection PyUnusedLocal repo_slug = repo_slug repo = get_object_or_404(Repository.reader_queryset(request), id=rid, archive_type=self.archive_type) if state_slug: filename = 'specs/%(slug)s/%(filename)s' % { 'slug': state_slug, 'filename': filename, } else: filename = 'specs/%(filename)s' % { 'filename': filename, } uid = self.storage_uid % repo.pk key = storage(settings.STORAGE_CACHE).uid_to_key(uid) return sendpath(settings.STORAGE_CACHE, key, filename, 'application/gzip')
def gpg_key(self, request, rid, repo_slug, slug2): get_object_or_404(Repository.reader_queryset(request), id=rid, archive_type=self.archive_type) signature = GPGSigner().export_key() return HttpResponse(signature, content_type="text/plain")
def compare_states(request: HttpRequest, rid): repo = get_object_or_404(Repository.reader_queryset(request), id=rid) states = ArchiveState.objects.filter(repository=repo) operators = { '<': lambda x, y: x < y, '≤': lambda x, y: x <= y, '=': lambda x, y: x == y, '≥': lambda x, y: x >= y, '>': lambda x, y: x > y } class CompareForm(forms.Form): state_left = forms.ModelChoiceField(states, label=_('Left state')) operator = forms.ChoiceField([(x, x) for x in operators], label=_('Assert operator')) state_right = forms.ModelChoiceField(states, label=_('Right state')) template_values = { 'repo': repo, 'upload_allowed': repo.upload_allowed(request) } if request.method == 'POST': form = CompareForm(request.POST) if form.is_valid(): state_left = form.cleaned_data['state_left'] state_right = form.cleaned_data['state_right'] operator = operators[form.cleaned_data['operator']] left_elements = Element.objects.filter(repository=repo, states=state_left) right_elements = Element.objects.filter(repository=repo, states=state_right) left_dict = {} right_dict = {} for element in left_elements: left_dict.setdefault( element.archive, (LooseVersion(element.version), []))[1].append(element) for element in right_elements: right_dict.setdefault( element.archive, (LooseVersion(element.version), []))[1].append(element) only_left, only_right = {}, {} left_keys, right_keys = set(left_dict.keys()), set( right_dict.keys()) for key in left_keys - right_keys: only_left[key] = left_dict[key] for key in right_keys - left_keys: only_right[key] = right_dict[key] invalid_values = [] for key in left_keys.intersection(right_keys): if not operator(left_dict[key][0], right_dict[key][0]): invalid_values.append( (key, left_dict[key], right_dict[key])) invalid_values.sort(key=lambda x: x[0]) template_values.update({ 'only_left': only_left, 'only_right': only_right, 'invalid_values': invalid_values, 'state_left': state_left, 'state_right': state_right }) template_values['all_valid'] = bool(not only_left and not only_right and not invalid_values) else: form = CompareForm() template_values['form'] = form return render_to_response('moneta/compare_states.html', template_values, RequestContext(request))
def index(self, request, rid, repo_slug=None, state_slug=''): repo = get_object_or_404(Repository.reader_queryset(request), id=rid, archive_type=self.archive_type) base_query = Element.objects.filter(repository=repo) if state_slug: state = get_object_or_404(ArchiveState, repository=repo, name=state_slug) base_query = base_query.filter(states=state) base_query = base_query.order_by('archive', 'version') element_infos = [] for element in base_query: if not element.extra_data: continue provider = json.loads(element.extra_data)['provider'] element_infos.append((element.name, reverse('repository:vagrant:get_box', kwargs={ 'rid': rid, 'repo_slug': repo.slug, 'eid': element.id, 'provider': provider, 'archive': element.archive, 'version': element.version }), element.sha1)) states = [ state for state in ArchiveState.objects.filter( repository=repo).order_by('name') ] tab_infos = [] # list of (relative URL, name, list of states, state_slug) tab_infos += [(reverse('repository:vagrant:index', kwargs={ 'rid': repo.id, 'state_slug': state.slug }), state, [state], state.slug) for state in states] tab_infos += [ (reverse('repository:vagrant:index', kwargs={ 'rid': repo.id, 'state_slug': '' }), ArchiveState(name=_('All boxes'), slug='all-states'), states, ''), ] template_values = { 'repo': repo, 'states': states, 'upload_allowed': repo.upload_allowed(request), 'state_slug': state_slug, 'elements': element_infos, 'index_url': reverse(moneta_url(repo, 'index'), kwargs={ 'rid': repo.id, }), 'tab_infos': tab_infos, 'admin_allowed': repo.admin_allowed(request), } return TemplateResponse(request, self.index_html, template_values)