def admin_redirects() -> Any: if not flask.session.get('admin'): return unauthorized() oldname = '' metapackages: List[Any] = [] metapackagedata: Dict[str, Any] = {} if flask.request.method == 'POST': oldname = flask.request.form.get('oldname', '') newname = flask.request.form.get('newname') if oldname and newname: if flask.request.form.get('action') == 'remove': get_db().remove_project_redirect(oldname, newname) flask.flash('Redirect removed succesfully', 'success') else: get_db().add_project_redirect(oldname, newname, True) flask.flash('Redirect added succesfully', 'success') if oldname: newnames = get_db().get_project_redirects(oldname) metapackages = get_db().get_metapackages(newnames) packages = get_db().get_metapackages_packages(newnames, fields=['family', 'effname', 'version', 'versionclass', 'flags']) metapackagedata = packages_to_summary_items(packages) return flask.render_template( 'admin-redirects.html', oldname=oldname, metapackages=metapackages, metapackagedata=metapackagedata, )
def project_related(name: str) -> Any: metapackage = get_db().get_metapackage(name) if not metapackage or metapackage['num_repos'] == 0: return handle_nonexisting_project(name, metapackage) metapackages = get_db().get_metapackage_related_metapackages( name, limit=config['METAPACKAGES_PER_PAGE']) metapackagedata = packages_to_summary_items( PackageDataSummarizable(**item) for item in get_db().get_metapackages_packages( list(metapackages.keys()), summarizable=True)) too_many_warning = None if len(metapackagedata) == config['METAPACKAGES_PER_PAGE']: too_many_warning = config['METAPACKAGES_PER_PAGE'] return (flask.render_template('project-related.html', name=name, metapackage=metapackage, metapackages=metapackages, metapackagedata=metapackagedata, too_many_warning=too_many_warning), 200 if metapackages else 404)
def project_related(name: str) -> Any: metapackage = get_db().get_metapackage(name) if not metapackage or metapackage['num_repos'] == 0: return handle_nonexisting_project(name, metapackage) metapackages = get_db().get_metapackage_related_metapackages(name, limit=config['METAPACKAGES_PER_PAGE']) packages = get_db().get_metapackages_packages(list(metapackages.keys()), fields=['family', 'effname', 'version', 'versionclass', 'flags']) metapackagedata = packages_to_summary_items(packages) too_many_warning = None if len(metapackagedata) == config['METAPACKAGES_PER_PAGE']: too_many_warning = config['METAPACKAGES_PER_PAGE'] return ( flask.render_template( 'project-related.html', name=name, metapackage=metapackage, metapackages=metapackages, metapackagedata=metapackagedata, too_many_warning=too_many_warning ), 200 if metapackages else 404 )
def projects(bound: Optional[str] = None) -> Response: # process search filterinfo = MetapackagesFilterInfo() filterinfo.parse_flask_args() request = filterinfo.get_request() request.set_bound(bound) # get packages def get_packages( request: MetapackageRequest ) -> Tuple[Dict[str, Dict[str, Any]], List[PackageDataSummarizable]]: metapackages = get_db().query_metapackages( **request.__dict__, limit=config['METAPACKAGES_PER_PAGE'], ) packages = [ PackageDataSummarizable(**item) for item in get_db().get_metapackages_packages( list(metapackages.keys()), summarizable=True) ] return metapackages, packages metapackages, packages = get_packages(request) # on empty result, fallback to show first, last set of results if not packages: request = filterinfo.get_request() if bound and bound.startswith('..'): request.require_name_to(None) metapackages, packages = get_packages(request) firstname, lastname = get_packages_name_range(packages) metapackagedata = packages_to_summary_items(packages, filterinfo.get_repo(), filterinfo.get_maintainer()) return flask.render_template('projects.html', firstname=firstname, lastname=lastname, search=filterinfo.get_dict(), advanced=filterinfo.is_advanced(), metapackages=metapackages, metapackagedata=metapackagedata, repo=filterinfo.get_repo(), maintainer=filterinfo.get_maintainer())
def metapackages(bound=None): # process search filterinfo = MetapackagesFilterInfo() filterinfo.ParseFlaskArgs() request = filterinfo.GetRequest() request.Bound(bound) # get packages def get_packages(request): metapackages = get_db().query_metapackages( **request.__dict__, limit=config['METAPACKAGES_PER_PAGE'], ) packages = get_db().get_metapackages_packages( list(metapackages.keys()), fields=[ 'repo', 'family', 'effname', 'version', 'versionclass', 'maintainers', 'flags' ]) return metapackages, packages metapackages, packages = get_packages(request) # on empty result, fallback to show first, last set of results if not packages: request = filterinfo.GetRequest() if bound and bound.startswith('..'): request.NameTo(None) metapackages, packages = get_packages(request) firstname, lastname = get_packages_name_range(packages) metapackagedata = packages_to_summary_items(packages, filterinfo.GetRepo(), filterinfo.GetMaintainer()) return flask.render_template('metapackages.html', firstname=firstname, lastname=lastname, search=filterinfo.GetDict(), advanced=filterinfo.IsAdvanced(), metapackages=metapackages, metapackagedata=metapackagedata, repo=filterinfo.GetRepo(), maintainer=filterinfo.GetMaintainer())
def handle_nonexisting_project(name: str, metapackage: Dict[str, Any]) -> Any: # we don't show anything to user when REDIRECTS_PER_PAGE is reached as # number of redirect targets is natually limited and we don't expect it to be reached redirects = get_db().get_project_redirects(name, limit=config['REDIRECTS_PER_PAGE']) if len(redirects) == 1: # single redirect - follow it right away flask.flash('You were redirected from project {}, which is not known by Repology'.format(name), 'info') return flask.redirect(flask.url_for(flask.request.endpoint, name=redirects[0]), 301) metapackages: List[Any] = [] metapackagedata: Dict[str, Any] = {} if redirects: # show redirects metapackages = get_db().get_metapackages(redirects) packages = get_db().get_metapackages_packages(redirects, fields=['family', 'effname', 'version', 'versionclass', 'flags']) metapackagedata = packages_to_summary_items(packages) if not metapackage: return ( flask.render_template( 'project-404.html', name=name, metapackages=metapackages, metapackagedata=metapackagedata ), 404 ) else: has_history, has_reports = get_db().project_has_history_or_reports(name) return ( flask.render_template( 'project-410.html', name=name, metapackage=metapackage, metapackages=metapackages, metapackagedata=metapackagedata, has_history=has_history, has_reports=has_reports ), 404 )
def project_related(name: str) -> Any: metapackages = get_db().get_metapackage_related_metapackages(name, limit=config['METAPACKAGES_PER_PAGE']) packages = get_db().get_metapackages_packages(list(metapackages.keys()), fields=['family', 'effname', 'version', 'versionclass', 'flags']) metapackagedata = packages_to_summary_items(packages) too_many_warning = None if len(metapackagedata) == config['METAPACKAGES_PER_PAGE']: too_many_warning = config['METAPACKAGES_PER_PAGE'] return flask.render_template( 'project-related.html', metapackage=get_db().get_metapackage(name), name=name, metapackages=metapackages, metapackagedata=metapackagedata, too_many_warning=too_many_warning )
def handle_nonexisting_project(name: str, metapackage: Dict[str, Any]) -> Any: # we don't show anything to user when REDIRECTS_PER_PAGE is reached as # number of redirect targets is natually limited and we don't expect it to be reached redirects = get_db().get_project_redirects( name, limit=config['REDIRECTS_PER_PAGE']) if len(redirects) == 1: # single redirect - follow it right away flask.flash( f'You were redirected from {name}, which was moved or merged here', 'info') return flask.redirect( flask.url_for(flask.request.endpoint, name=redirects[0]), 301) metapackages: List[Any] = [] metapackagedata: Dict[str, Any] = {} if redirects: # show redirects metapackages = get_db().get_metapackages(redirects) metapackagedata = packages_to_summary_items( PackageDataSummarizable(**item) for item in get_db().get_metapackages_packages(redirects, summarizable=True)) if not metapackage: return (flask.render_template('project-404.html', name=name, metapackages=metapackages, metapackagedata=metapackagedata), 404) else: has_history, has_reports = get_db().project_has_history_or_reports( name) return (flask.render_template('project-410.html', name=name, metapackage=metapackage, metapackages=metapackages, metapackagedata=metapackagedata, has_history=has_history, has_reports=has_reports), 404)
def index() -> Any: top_by_total = Top() top_by_nonunique = Top() top_by_newest = Top() top_by_pnewest = Top() top_by_maintainers = Top() top_by_problematic = Top() # not used right now top_by_ppm = Top(reverse=True) for repo in get_db().get_active_repositories(): metadata = repometadata[repo['name']] if metadata['type'] != 'repository': continue top_by_total.add(metadata['statsgroup'], repo['name'], repo['num_metapackages']) top_by_nonunique.add( metadata['statsgroup'], repo['name'], repo['num_metapackages'] - repo['num_metapackages_unique']) top_by_newest.add(metadata['statsgroup'], repo['name'], repo['num_metapackages_newest']) top_by_maintainers.add(metadata['statsgroup'], repo['name'], repo['num_maintainers']) top_by_problematic.add( metadata['statsgroup'], repo['name'], safe_percent(repo['num_metapackages_problematic'], repo['num_metapackages'])) if repo['num_metapackages'] > 1000: top_by_pnewest.add( metadata['statsgroup'], repo['name'], safe_percent(repo['num_metapackages_newest'], repo['num_metapackages_comparable'])) if repo['num_maintainers'] > 0: top_by_ppm.add( metadata['statsgroup'], repo['name'], repo['num_metapackages'] / repo['num_maintainers']) important_packages = [ 'apache24', 'awesome', 'bash', 'binutils', 'bison', 'blender', 'boost', 'bzip2', 'chromium', 'claws-mail', 'cmake', 'cppcheck', 'cups', 'curl', 'darktable', 'dia', 'djvulibre', 'dosbox', 'dovecot', 'doxygen', 'dvd+rw-tools', 'emacs', 'exim', 'ffmpeg', 'firefox', 'flex', 'fluxbox', 'freecad', 'freetype', 'gcc', 'gdb', 'geeqie', 'gimp', 'git', 'gnupg', 'go', 'graphviz', 'grub', 'icewm', 'imagemagick', 'inkscape', 'irssi', 'kodi', 'lame', 'lftp', 'libreoffice', 'libressl', 'lighttpd', 'links', 'llvm', 'mariadb', 'maxima', 'mc', 'memcached', 'mercurial', 'mesa', 'mplayer', 'mutt', 'mysql', 'nginx', 'nmap', 'octave', 'openbox', 'openssh', 'openssl', 'openttf', 'openvpn', 'p7zip', 'perl', 'pidgin', 'postfix', 'postgresql', 'privoxy', 'procmail', 'python3', 'qemu', 'rdesktop', 'redis', 'rrdtool', 'rsync', 'rtorrent', 'rxvt-unicode', 'samba', 'sane-backends', 'scons', 'screen', 'scribus', 'scummvm', 'sdl2', 'smartmontools', 'sqlite3', 'squid', 'subversion', 'sudo', 'sumversion', 'thunderbird', 'tigervnc', 'tmux', 'tor', 'valgrind', 'vim', 'virtualbox', 'vlc', 'vsftpd', 'wayland', 'wesnoth', 'wget', 'wine', 'wireshark', 'xorg-server', 'youtube-dl', 'zsh', ] metapackages = get_db().get_metapackages(important_packages) metapackagedata = packages_to_summary_items( PackageDataSummarizable(**item) for item in get_db().get_metapackages_packages(important_packages, summarizable=True)) top_size = 10 return flask.render_template( 'index.html', top_by_total=top_by_total.get(top_size), top_by_nonunique=top_by_nonunique.get(top_size), top_by_newest=top_by_newest.get(top_size), top_by_pnewest=top_by_pnewest.get(top_size), top_by_maintainers=top_by_maintainers.get(top_size), top_by_ppm=top_by_ppm.get(top_size), metapackages=metapackages, metapackagedata=metapackagedata)
def index(): repostats = [ repo for repo in get_db().get_active_repositories() if repometadata[repo['name']]['type'] == 'repository' ] top_repos = { 'by_total': [{ 'name': repo['name'], 'value': repo['num_metapackages'], } for repo in sorted( repostats, key=lambda repo: repo['num_metapackages'], reverse=True) ][:10], 'by_nonunique': [{ 'name': repo['name'], 'value': repo['num_metapackages'] - repo['num_metapackages_unique'], } for repo in sorted(repostats, key=lambda repo: repo['num_metapackages'] - repo[ 'num_metapackages_unique'], reverse=True)][:10], 'by_newest': [{ 'name': repo['name'], 'value': repo['num_metapackages_newest'], } for repo in sorted(repostats, key=lambda repo: repo['num_metapackages_newest'], reverse=True)][:10], 'by_pnewest': [{ 'name': repo['name'], 'value': '{:.2f}%'.format( safe_percent(repo['num_metapackages_newest'], repo['num_metapackages_comparable'])), } for repo in sorted( repostats, key=lambda repo: safe_percent(repo['num_metapackages_newest'], repo['num_metapackages_comparable']), reverse=True) if repo['num_metapackages'] > 1000][:8] } important_packages = [ 'apache24', 'awesome', 'bash', 'binutils', 'bison', 'blender', 'boost', 'bzip2', 'chromium', 'claws-mail', 'cmake', 'cppcheck', 'cups', 'curl', 'darktable', 'dia', 'djvulibre', 'dosbox', 'dovecot', 'doxygen', 'dvd+rw-tools', 'emacs', 'exim', 'ffmpeg', 'firefox', 'flex', 'fluxbox', 'freecad', 'freetype', 'gcc', 'gdb', 'geeqie', 'gimp', 'git', 'gnupg', 'go', 'graphviz', 'grub', 'icewm', 'imagemagick', 'inkscape', 'irssi', 'kodi', 'lame', 'lftp', 'libreoffice', 'libressl', 'lighttpd', 'links', 'llvm', 'mariadb', 'maxima', 'mc', 'memcached', 'mercurial', 'mesa', 'mplayer', 'mutt', 'mysql', 'nginx', 'nmap', 'octave', 'openbox', 'openssh', 'openssl', 'openttf', 'openvpn', 'p7zip', 'perl', 'pidgin', 'postfix', 'postgresql', 'privoxy', 'procmail', 'python3', 'qemu', 'rdesktop', 'redis', 'rrdtool', 'rsync', 'rtorrent', 'rxvt-unicode', 'samba', 'sane-backends', 'scons', 'screen', 'scribus', 'scummvm', 'sdl2', 'smartmontools', 'sqlite3', 'squid', 'subversion', 'sudo', 'sumversion', 'thunderbird', 'tigervnc', 'tmux', 'tor', 'valgrind', 'vim', 'virtualbox', 'vlc', 'vsftpd', 'wayland', 'wesnoth', 'wget', 'wine', 'wireshark', 'xorg-server', 'youtube-dl', 'zsh', ] metapackages = get_db().get_metapackages(important_packages) packages = get_db().get_metapackages_packages( important_packages, fields=['family', 'effname', 'version', 'versionclass', 'flags']) metapackagedata = packages_to_summary_items(packages) return flask.render_template('index.html', top_repos=top_repos, metapackages=metapackages, metapackagedata=metapackagedata)