aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--web/collagen/urls.py6
-rw-r--r--web/collagen/views.py8
-rw-r--r--web/main/__init__.py (renamed from web/collagen/__init__.py)0
-rw-r--r--web/main/admin.py (renamed from web/collagen/admin.py)2
l---------web/main/models.py (renamed from web/collagen/models.py)0
-rw-r--r--web/main/urls.py16
-rw-r--r--web/main/views.py91
-rw-r--r--web/media/css/main.css35
-rw-r--r--web/settings.py4
-rw-r--r--web/templates/404.html11
-rw-r--r--web/templates/500.html2
-rw-r--r--web/templates/base.html32
-rw-r--r--web/templates/browse-categories.html20
-rw-r--r--web/templates/index.html19
-rw-r--r--web/templates/list-packages-with-file.html9
-rw-r--r--web/templates/view-content.html21
-rw-r--r--web/templates/view-package-props.html33
-rw-r--r--web/templates/view-package.html18
-rw-r--r--web/urls.py3
19 files changed, 313 insertions, 17 deletions
diff --git a/web/collagen/urls.py b/web/collagen/urls.py
deleted file mode 100644
index 5ac48ed..0000000
--- a/web/collagen/urls.py
+++ /dev/null
@@ -1,6 +0,0 @@
-from django.conf.urls.defaults import *
-
-
-urlpatterns = patterns('web.collagen.views',
- (r'^$', 'index'),
-)
diff --git a/web/collagen/views.py b/web/collagen/views.py
deleted file mode 100644
index 9c231bd..0000000
--- a/web/collagen/views.py
+++ /dev/null
@@ -1,8 +0,0 @@
-# Create your views here.
-
-from django.shortcuts import render_to_response
-from web.collagen.models import Package
-
-def index(request):
- last_pkgs = Package.objects.all().order_by('-id')[:5]
- return render_to_response('index.html', {'latest_packages': last_pkgs})
diff --git a/web/collagen/__init__.py b/web/main/__init__.py
index e69de29..e69de29 100644
--- a/web/collagen/__init__.py
+++ b/web/main/__init__.py
diff --git a/web/collagen/admin.py b/web/main/admin.py
index a45bedb..97350cb 100644
--- a/web/collagen/admin.py
+++ b/web/main/admin.py
@@ -1,4 +1,4 @@
-from web.collagen.models import *
+from web.main.models import *
from django.contrib import admin
admin.site.register(Package)
diff --git a/web/collagen/models.py b/web/main/models.py
index 92e8020..92e8020 120000
--- a/web/collagen/models.py
+++ b/web/main/models.py
diff --git a/web/main/urls.py b/web/main/urls.py
new file mode 100644
index 0000000..2aa40d9
--- /dev/null
+++ b/web/main/urls.py
@@ -0,0 +1,16 @@
+from django.conf.urls.defaults import *
+from django.conf import settings
+
+prefix = 'web.main.views.'
+
+urlpatterns = patterns('',
+ (r'^$', prefix+'index'),
+ (r'^browse$', prefix+'browse'),
+ (r'^browse/(?P<category_name>\w+-\w+)$', prefix+'browse'),
+ (r'^browse/(?P<category_name>\w+(-\w+){0,1})/(?P<pkg_name>.*)$', prefix+'browse'),
+ (r'^view/package/(?P<category_name>\w+(-\w*){0,1})/(?P<pkg_name>[a-zA-Z_-]+)-(?P<pkg_ver>[0-9_.r-]+)$', prefix+'view'),
+ (r'^view/attachment/(?P<attachment_id>\d+)$', prefix+'view_attachment'),
+ (r'^view/content/(?P<packageproperties_id>\d+)$', prefix+'view_content'),
+ (r'^search/by-path/(?P<path>.*)$', prefix+'search_by_path'),
+ (r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_DIR, 'show_indexes': True}),
+)
diff --git a/web/main/views.py b/web/main/views.py
new file mode 100644
index 0000000..a1cafe0
--- /dev/null
+++ b/web/main/views.py
@@ -0,0 +1,91 @@
+# Create your views here.
+
+from django.shortcuts import render_to_response, get_object_or_404
+from django.http import Http404,HttpResponse
+from django.utils.html import escape
+from django.core.exceptions import ObjectDoesNotExist
+
+
+from web.main.models import *
+
+def index(request):
+ last_pkgs = Package.objects.all().order_by('-id')[:5]
+ cats = PackageCategory.objects.all()
+ print cats
+ return render_to_response('index.html', {'latest_packages': last_pkgs,'categories':cats})
+
+def browse(request, category_name=None, pkg_name=None):
+ cats = PackageCategory.objects.all()
+ only_failed = False
+ if request.method == "GET" and "failed" in request.GET:
+ only_failed=True
+ if not category_name and not pkg_name:
+ if not only_failed:
+ cats = PackageCategory.objects.all()
+ else:
+ pprops = PackageProperties.objects.filter(error_code__gt=0)
+ cats = set()
+ for pprop in pprops:
+ cats.add(pprop.packageversion.category)
+ return render_to_response('browse-categories.html', {'objects':cats,'failed': only_failed})
+ cat = PackageCategory.objects.get(name=category_name)
+ if category_name and not pkg_name:
+ pversions = cat.packageversion_set.all()
+ packages = set()
+ for pv in pversions:
+ pprops = pv.packageproperties_set.filter(error_code__gt=0)
+ if len(pprops) == 0 and only_failed:
+ continue
+ packages.add(pv.package.name)
+ return render_to_response('browse-categories.html',{'objects':packages,'category':cat, 'failed': only_failed})
+
+ pkg = Package.objects.get(name=pkg_name)
+ pversions = PackageVersion.objects.filter(package=pkg, category=cat)
+
+ return render_to_response('view-package.html',{'pversions':pversions})
+
+
+def view(request, category_name, pkg_name, pkg_ver):
+ cat = PackageCategory.objects.get(name=category_name)
+ pkg = Package.objects.get(name=pkg_name)
+ pv = PackageVersion.objects.filter(package=pkg, category = cat, version = pkg_ver)
+ if not pv or len(pv) == 0:
+ raise Http404
+
+ pv = pv[0]
+ pprops = pv.packageproperties_set.all()
+ cpv = "%s/%s-%s" % (category_name, pkg_name, pkg_ver)
+ return render_to_response('view-package-props.html',{'pprops':pprops,'cpv':cpv})
+
+def view_attachment(request, attachment_id):
+ try:
+ at = Attachment.objects.get(pk=attachment_id)
+ return HttpResponse(at.content, mimetype=at.mimetype)
+ except Attachment.DoesNotExist:
+ raise Http404
+
+
+def view_content(request, packageproperties_id):
+ try:
+ pp = PackageProperties.objects.get(pk=packageproperties_id)
+ ppfs = pp.packageproperties_file_set.order_by('file')
+ return render_to_response('view-content.html', {'ppfs':ppfs})
+ except PackageProperties.DoesNotExist:
+ raise Http404
+
+
+def search_by_path(request, path):
+ if request.method == "GET" and "path" in request.GET:
+ path = request.GET["path"]
+ try:
+ file = File.objects.get(path=path)
+ ppfs = file.packageproperties_file_set.all()
+ cpvs = set()
+ for ppf in ppfs:
+ cpvs.add("%s/%s-%s" % (ppf.packageproperties.packageversion.category.name,
+ ppf.packageproperties.packageversion.package.name,
+ ppf.packageproperties.packageversion.version))
+ cpvs = sorted(cpvs)
+ except File.DoesNotExist:
+ return render_to_response('404.html', {'path':path})
+ return render_to_response('list-packages-with-file.html',{'cpvs': cpvs, 'path':path})
diff --git a/web/media/css/main.css b/web/media/css/main.css
new file mode 100644
index 0000000..81ba1d2
--- /dev/null
+++ b/web/media/css/main.css
@@ -0,0 +1,35 @@
+
+div.header {
+ background-color: black;
+ color: white;
+ font-weight: bolder;
+ font-size: x-large;
+ text-align: center;
+}
+
+div.footer {
+ background-color: black;
+ color: white;
+ font-weight: bolder;
+}
+
+div.compileinfo-odd {
+ background-color: #DDDAEC;
+}
+
+div.intro {
+ font-size: 120%;
+ font-weight: bold;
+}
+
+th {
+ background-color: #AF7BDB;
+}
+
+tr.odd {
+ background-color: #DDDAEC;
+}
+
+a:link { color: #0000ff; }
+a:visited { color: #52188c; }
+
diff --git a/web/settings.py b/web/settings.py
index abc2473..3608f13 100644
--- a/web/settings.py
+++ b/web/settings.py
@@ -72,10 +72,12 @@ TEMPLATE_DIRS = (
'/home/w0rm/Projects/GSoC/collagen/web/templates'
)
+MEDIA_DIR = "/home/w0rm/Projects/GSoC/collagen/web/media"
+
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
- 'web.collagen',
+ 'web.main',
'django.contrib.admin'
)
diff --git a/web/templates/404.html b/web/templates/404.html
new file mode 100644
index 0000000..716b7b3
--- /dev/null
+++ b/web/templates/404.html
@@ -0,0 +1,11 @@
+
+{% extends "base.html" %}
+{% block intro %}Not found<br />{% endblock %}
+
+{% block main %}
+{% if path %}
+Requested path was not found in any packages, sorry.<br />
+{% endif %}
+
+Whatever you were doing is lost. Please <a href="javascript:javascript:history.go(-1)">go back and try again</a>.
+{% endblock %}
diff --git a/web/templates/500.html b/web/templates/500.html
new file mode 100644
index 0000000..5bf115d
--- /dev/null
+++ b/web/templates/500.html
@@ -0,0 +1,2 @@
+
+Internal server error, sorry
diff --git a/web/templates/base.html b/web/templates/base.html
new file mode 100644
index 0000000..57ff056
--- /dev/null
+++ b/web/templates/base.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html>
+ <head>
+ <title>{% block title %}Collagen - browse categories{% endblock %}</title>
+ <link rel="stylesheet" href="/collagen/media/css/main.css" type="text/css" media="screen" />
+ </head>
+ <body>
+ <div class="header">
+ {% block header %}
+ Collagen - Gentoo portage tree files database
+ {% endblock %}
+ </div>
+ <br />
+ <div class="main">
+ <div class="intro">
+ {% block intro %}
+ {% endblock %}
+ </div>
+
+
+ {% block main %}
+ How did you get here?
+ {% endblock %}
+ </div>
+ <br />
+ <div class="footer">
+ {% block footer %}
+ Gentoo Linux (c) 2009
+ {% endblock %}
+ </div>
+ </body>
+</html>
diff --git a/web/templates/browse-categories.html b/web/templates/browse-categories.html
new file mode 100644
index 0000000..52ad2fe
--- /dev/null
+++ b/web/templates/browse-categories.html
@@ -0,0 +1,20 @@
+{% extends "base.html" %}
+
+{% block intro %}
+We have information about these {% if category %}packages{% else %}categories{% endif %}:
+{% endblock %}
+
+{% block main %}
+
+<ul>
+{% for obj in objects %}
+ <li>{% if category %}
+ <a href="/collagen/browse/{{category.name}}/{{ obj }}{% if failed %}?failed{% endif %}">{{ obj }}/</a>
+ {% else %}
+ <a href="/collagen/browse/{{obj.name}}{% if failed %}?failed{% endif %}">{{ obj.name }}</a>
+ {% endif %}
+ </li>
+{% endfor %}
+</ul>
+
+{% endblock %}
diff --git a/web/templates/index.html b/web/templates/index.html
new file mode 100644
index 0000000..e2985e8
--- /dev/null
+++ b/web/templates/index.html
@@ -0,0 +1,19 @@
+{% extends "base.html" %}
+
+{% block intro %}
+Collagen is here!
+{% endblock %}
+
+{% block main %}
+
+You can use this web interface in several different ways:
+<ul>
+ <li><a href="/collagen/browse">Browse packages</a></li>
+ <li><a href="/collagen/browse?failed">Browse only failed packages</a></li>
+ <li>Search packages containing certain path
+ <form method="get" action="/collagen/search/by-path">
+ <input type="text" name="path" value="" /> &nbsp;
+ <button type="submit">Submit</button>
+ </form></li>
+</ul>
+{% endblock %}
diff --git a/web/templates/list-packages-with-file.html b/web/templates/list-packages-with-file.html
new file mode 100644
index 0000000..1b368f5
--- /dev/null
+++ b/web/templates/list-packages-with-file.html
@@ -0,0 +1,9 @@
+{% extends "base.html" %}
+{% block intro %}Packages containing file {{path}}<br />{% endblock %}
+
+{% block main %}
+{% for cpv in cpvs %}
+<a href="/collagen/view/package/{{cpv}}">{{cpv}}</a> <br />
+{% endfor %}
+
+{% endblock %}
diff --git a/web/templates/view-content.html b/web/templates/view-content.html
new file mode 100644
index 0000000..eb7d291
--- /dev/null
+++ b/web/templates/view-content.html
@@ -0,0 +1,21 @@
+{% extends "base.html" %}
+
+
+{% block main %}
+
+<table>
+<tr>
+ <th>Type</th>
+ <th>Path</th>
+ <th>Hash</th>
+</tr>
+
+{% for ppf in ppfs %}
+<tr class="{% cycle odd,even %}">
+ <td>{{ppf.filetype.name}}</td>
+ <td>{{ppf.file.path}} <a href="/collagen/search/by-path/{{ppf.file.path}}" title="see list of packages containing this file">[I]</a><br /></td>
+ <td>{{ppf.hash}}</td>
+</tr>
+{% endfor %}
+</table>
+{% endblock %}
diff --git a/web/templates/view-package-props.html b/web/templates/view-package-props.html
new file mode 100644
index 0000000..16e27ea
--- /dev/null
+++ b/web/templates/view-package-props.html
@@ -0,0 +1,33 @@
+{% extends "base.html" %}
+
+{% block intro %}
+Compile information for: {{cpv}}
+{% endblock %}
+
+{% block main %}
+{% if pprops %}
+
+
+ {% for prop in pprops %}
+ <div class="compileinfo-{% cycle odd,even %}">
+ Portage profile: {{prop.profile.name}}<br />
+ Error code: {{prop.error_code}} <br />
+ Tinderbox IP: {{prop.tinderbox.ip}} <br />
+ Useflags: {% for uf in prop.useflags.all %}
+ {{uf.name}} &nbsp;
+ {% endfor %} <br />
+ Attachments:
+ {% for attachment in prop.attachment_set.all %}
+ <a href="/collagen/view/attachment/{{attachment.id}}">{{attachment.name}}</a>&nbsp;
+ {% endfor %}<br />
+ Content: <a href="/collagen/view/content/{{prop.id}}">list</a>
+ </div>
+ <br />
+ {% endfor %}
+
+
+{% else %}
+ No information available
+{% endif %}
+
+{% endblock %}
diff --git a/web/templates/view-package.html b/web/templates/view-package.html
new file mode 100644
index 0000000..847b878
--- /dev/null
+++ b/web/templates/view-package.html
@@ -0,0 +1,18 @@
+{% extends "base.html" %}
+
+{% block intro %}
+We have information about these package versions:
+{% endblock %}
+
+{% block main %}
+{% if pversions %}
+ <ul>
+ {% for pv in pversions %}
+ <li><a href="/collagen/view/package/{{pv.category.name}}/{{pv.package.name}}-{{pv.version}}">{{ pv.category.name }}/{{pv.package.name}}-{{pv.version}}</a></li>
+ {% endfor %}
+ </ul>
+{% else %}
+ <p>No information available.</p>
+{% endif %}
+
+{% endblock %}
diff --git a/web/urls.py b/web/urls.py
index 044e341..f614eed 100644
--- a/web/urls.py
+++ b/web/urls.py
@@ -1,12 +1,13 @@
from django.conf.urls.defaults import *
+
# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
# Example:
- (r'^collagen/', include('web.collagen.urls')),
+ (r'^collagen/', include('web.main.urls')),
# Uncomment the admin/doc line below and add 'django.contrib.admindocs'
# to INSTALLED_APPS to enable admin documentation: