SVN: packages-ng: . README __init__.py manage.py packages packages/__init__.py packages/models.py pa...

patrys patrys at pld-linux.org
Mon Jun 16 16:55:40 CEST 2008


Author: patrys
Date: Mon Jun 16 16:55:40 2008
New Revision: 9805

Added:
   packages-ng/
   packages-ng/README
   packages-ng/__init__.py
   packages-ng/manage.py   (contents, props changed)
   packages-ng/packages/
   packages-ng/packages/__init__.py
   packages-ng/packages/models.py
   packages-ng/packages/templates/
   packages-ng/packages/templates/details.html
   packages-ng/packages/templates/group.html
   packages-ng/packages/templates/index.html
   packages-ng/packages/templates/provides.html
   packages-ng/packages/templates/search.html
   packages-ng/packages/templates/source.html
   packages-ng/packages/urls.py
   packages-ng/packages/views.py
   packages-ng/settings.py
   packages-ng/svn-commit.tmp
   packages-ng/urls.py
Log:
- new code for package.pld-linux.org


Added: packages-ng/README
==============================================================================
--- (empty file)
+++ packages-ng/README	Mon Jun 16 16:55:40 2008
@@ -0,0 +1,9 @@
+This is a Django application designed to mimick Debian's packages.debian.org.
+
+It works by loading primary.sqlite generated by createrepo.
+
+Before running, make sure you run createrepo -d and uncompress the resulting primary.sqlite.bz2 file.
+
+The app itself requires a trunk checkout of Django itself available in the python path. It was designed to run as a FastCGI server but you can test it locally by running ./manage runserver and pointing your browser to localhost:8000.
+
+Make sure settings.py has the correct path to the sqlite file.

Added: packages-ng/__init__.py
==============================================================================

Added: packages-ng/manage.py
==============================================================================
--- (empty file)
+++ packages-ng/manage.py	Mon Jun 16 16:55:40 2008
@@ -0,0 +1,11 @@
+#!/usr/bin/env python
+from django.core.management import execute_manager
+try:
+    import settings # Assumed to be in the same directory.
+except ImportError:
+    import sys
+    sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__)
+    sys.exit(1)
+
+if __name__ == "__main__":
+    execute_manager(settings)

Added: packages-ng/packages/__init__.py
==============================================================================

Added: packages-ng/packages/models.py
==============================================================================
--- (empty file)
+++ packages-ng/packages/models.py	Mon Jun 16 16:55:40 2008
@@ -0,0 +1,142 @@
+# This is an auto-generated Django model module.
+# You'll have to do the following manually to clean this up:
+#	 * Rearrange models' order
+#	 * Make sure each model has one field with primary_key=True
+# Feel free to rename the models, but don't rename db_table values or field names.
+#
+# Also note: You'll have to insert the output of 'django-admin.py sqlcustom [appname]'
+# into your database.
+
+from django.db import models
+
+def flags_format(self):
+	if self.flags == 'EQ':
+		return '='
+	elif self.flags == 'LT':
+		return '<'
+	elif self.flags == 'LE':
+		return '<='
+	elif self.flags == 'GT':
+		return '>'
+	elif self.flags == 'GE':
+		return '>='
+	return self.flags
+
+def version_format(self):
+	res = u''
+	if self.flags:
+		res += '%s ' % self.flags_format()
+		if self.epoch:
+			res += '%s:' % self.epoch
+		res += self.version
+		if self.release:
+			res += '-%s' % self.release
+	return res
+
+def header_format(self):
+	res = self.name + u' ' + self.version_format()
+	return res
+
+class Package(models.Model):
+	pkgkey = models.IntegerField(primary_key = True)
+	pkgid = models.TextField(blank=True)
+	name = models.TextField(blank=True)
+	arch = models.TextField(blank=True)
+	version = models.TextField(blank=True)
+	epoch = models.TextField(blank=True)
+	release = models.TextField(blank=True)
+	summary = models.TextField(blank=True)
+	description = models.TextField(blank=True)
+	url = models.TextField(blank=True)
+	time_file = models.IntegerField(null=True, blank=True)
+	time_build = models.IntegerField(null=True, blank=True)
+	rpm_license = models.TextField(blank=True)
+	rpm_vendor = models.TextField(blank=True)
+	rpm_group = models.TextField(blank=True)
+	rpm_buildhost = models.TextField(blank=True)
+	rpm_sourcerpm = models.TextField(blank=True)
+	rpm_header_start = models.IntegerField(null=True, blank=True)
+	rpm_header_end = models.IntegerField(null=True, blank=True)
+	rpm_packager = models.TextField(blank=True)
+	size_package = models.IntegerField(null=True, blank=True)
+	size_installed = models.IntegerField(null=True, blank=True)
+	size_archive = models.IntegerField(null=True, blank=True)
+	location_href = models.TextField(blank=True)
+	location_base = models.TextField(blank=True)
+	checksum_type = models.TextField(blank=True)
+	class Meta:
+		db_table = u'packages'
+		ordering = ['name', '-epoch', '-version', '-release', 'arch']
+	def __unicode__(self):
+		return u'%s-%s:%s-%s.%s' % (self.name, self.epoch, self.version, self.release, self.arch)
+
+class Conflict(models.Model):
+	name = models.CharField(blank=True, max_length = 255, primary_key = True)
+	flags = models.TextField(blank=True)
+	epoch = models.TextField(blank=True)
+	version = models.TextField(blank=True)
+	release = models.TextField(blank=True)
+	package = models.ForeignKey(Package, db_column = 'pkgkey')
+	class Meta:
+		db_table = u'conflicts'
+		ordering = ['name', ]
+		unique_together = ['name', 'flags', 'epoch', 'version', 'release', 'package']
+	flags_format = flags_format
+	version_format = version_format
+	__unicode__ = header_format
+
+class File(models.Model):
+	name = models.TextField(blank=True)
+	type = models.TextField(blank=True)
+	package = models.ForeignKey(Package, db_column = 'pkgkey')
+	class Meta:
+		db_table = u'files'
+	def __unicode__(self):
+		return u'%s %s' % (self.name, self.type)
+
+class Obsolete(models.Model):
+	name = models.CharField(blank=True, max_length = 255, primary_key = True)
+	flags = models.TextField(blank=True)
+	epoch = models.TextField(blank=True)
+	version = models.TextField(blank=True)
+	release = models.TextField(blank=True)
+	package = models.ForeignKey(Package, db_column = 'pkgkey')
+	class Meta:
+		db_table = u'obsoletes'
+		ordering = ['name', ]
+		unique_together = ['name', 'flags', 'epoch', 'version', 'release', 'package']
+	flags_format = flags_format
+	version_format = version_format
+	__unicode__ = header_format
+
+class Provide(models.Model):
+	name = models.CharField(blank=True, max_length = 255, primary_key = True)
+	flags = models.CharField(blank=True, max_length = 32)
+	epoch = models.CharField(blank=True, max_length = 255)
+	version = models.CharField(blank=True, max_length = 255)
+	release = models.CharField(blank=True, max_length = 255)
+	package = models.ForeignKey(Package, db_column = 'pkgkey')
+	class Meta:
+		db_table = u'provides'
+		ordering = ['name', ]
+		unique_together = ['name', 'flags', 'epoch', 'version', 'release', 'package']
+	flags_format = flags_format
+	version_format = version_format
+	__unicode__ = header_format
+
+class Require(models.Model):
+	name = models.CharField(blank=True, max_length = 255, primary_key = True)
+	flags = models.TextField(blank=True)
+	epoch = models.TextField(blank=True)
+	version = models.TextField(blank=True)
+	release = models.TextField(blank=True)
+	package = models.ForeignKey(Package, db_column = 'pkgkey')
+	pre = models.BooleanField(null=True, blank=True)
+	class Meta:
+		db_table = u'requires'
+		ordering = ['name', ]
+		unique_together = ['name', 'flags', 'epoch', 'version', 'release', 'package']
+	flags_format = flags_format
+	version_format = version_format
+	__unicode__ = header_format
+

Added: packages-ng/packages/templates/details.html
==============================================================================
--- (empty file)
+++ packages-ng/packages/templates/details.html	Mon Jun 16 16:55:40 2008
@@ -0,0 +1,41 @@
+<h2>Package: {{ package.name }} ({{ package.epoch }}:{{ package.version }}-{{ package.release }}.{{ package.arch }})</h2>
+
+<h3>{{ package.summary }}</h3>
+<p>{{ package.description }}</p>
+
+<p>Source package: <a href="{% url packages.views.browse_source package.rpm_sourcerpm %}">{{ package.rpm_sourcerpm }}</a></p>
+
+<p>Group: <a href="{% url packages.views.browse_group package.rpm_group %}">{{ package.rpm_group }}</a></p>
+
+<h3>Provides:</h3>
+
+<ul>
+{% for provide in package.provide_set.all %}
+	<li>{{ provide.name }}{% if provide.version_format %} ({{ provide.version_format }}){% endif %}</li>
+{% endfor %}
+</ul>
+
+<h3>Dependencies:</h3>
+
+<ul>
+{% for require in package.require_set.all %}
+	<li><a href="{% url packages.views.browse_provides require.name %}">{{ require.name }}</a>{% if require.version_format %} ({{ require.version_format }}){% endif %}</li>
+{% endfor %}
+</ul>
+
+<h3>Conflicts:</h3>
+
+<ul>
+{% for conflict in package.conflict_set.all %}
+	<li>{{ conflict.name }}{% if conflict.version_format %} ({{ conflict.version_format }}){% endif %}</li>
+{% endfor %}
+</ul>
+
+<h3>Obsoletes:</h3>
+
+<ul>
+{% for obsolete in package.obsolete_set.all %}
+	<li>{{ obsolete.name }}{% if obsolete.version_format %} ({{ obsolete.version_format }}){% endif %}</li>
+{% endfor %}
+</ul>
+

Added: packages-ng/packages/templates/group.html
==============================================================================
--- (empty file)
+++ packages-ng/packages/templates/group.html	Mon Jun 16 16:55:40 2008
@@ -0,0 +1,8 @@
+<h2>Packages in {{ group }}:</h2>
+
+<dl>
+{% for package in packages %}
+	<dt><a href="{% url packages.views.details package.arch,package.name,package.epoch,package.version,package.release %}">{{ package }}</a></dt>
+	<dd>{{ package.summary }}</dd>
+{% endfor %}
+</dl>

Added: packages-ng/packages/templates/index.html
==============================================================================
--- (empty file)
+++ packages-ng/packages/templates/index.html	Mon Jun 16 16:55:40 2008
@@ -0,0 +1,15 @@
+<h2>Search for packages:</h2>
+
+<form action="{% url packages.views.search %}" method="get">
+	{{ form.as_p }}
+	<p><input type="submit" value="search" /></p>
+</form>
+
+<h2>Browse by group:</h2>
+
+<ul>
+{% for group in groups %}
+	<li><a href="{% url packages.views.browse_group group %}">{{ group }}</a></li>
+{% endfor %}
+</ul>
+

Added: packages-ng/packages/templates/provides.html
==============================================================================
--- (empty file)
+++ packages-ng/packages/templates/provides.html	Mon Jun 16 16:55:40 2008
@@ -0,0 +1,8 @@
+<h2>Packages providing {{ provide }}:</h2>
+
+<dl>
+{% for package in packages %}
+	<dt><a href="{% url packages.views.details package.arch,package.name,package.epoch,package.version,package.release %}">{{ package }}</a></dt>
+	<dd>{{ package.summary }}</dd>
+{% endfor %}
+</dl>

Added: packages-ng/packages/templates/search.html
==============================================================================
--- (empty file)
+++ packages-ng/packages/templates/search.html	Mon Jun 16 16:55:40 2008
@@ -0,0 +1,15 @@
+<h2>Search for packages:</h2>
+
+<form action="{% url packages.views.search %}" method="get">
+	{{ form.as_p }}
+	<p><input type="submit" value="search" /></p>
+</form>
+
+{% if packages %}
+<dl>
+{% for package in packages %}
+	<dt><a href="{% url packages.views.details package.arch,package.name,package.epoch,package.version,package.release %}">{{ package }}</a></dt>
+	<dd>{{ package.summary }}</dd>
+{% endfor %}
+</dl>
+{% endif %}

Added: packages-ng/packages/templates/source.html
==============================================================================
--- (empty file)
+++ packages-ng/packages/templates/source.html	Mon Jun 16 16:55:40 2008
@@ -0,0 +1,8 @@
+<h2>Packages built from {{ source }}:</h2>
+
+<dl>
+{% for package in packages %}
+	<dt><a href="{% url packages.views.details package.arch,package.name,package.epoch,package.version,package.release %}">{{ package }}</a></dt>
+	<dd>{{ package.summary }}</dd>
+{% endfor %}
+</dl>

Added: packages-ng/packages/urls.py
==============================================================================
--- (empty file)
+++ packages-ng/packages/urls.py	Mon Jun 16 16:55:40 2008
@@ -0,0 +1,10 @@
+from django.conf.urls.defaults import *
+
+urlpatterns = patterns('',
+	(r'^$', 'packages.views.index'),
+	(r'^by-group/(?P<group>.+)/$', 'packages.views.browse_group'),
+	(r'^by-provide/(?P<provide>.+)/$', 'packages.views.browse_provides'),
+	(r'^by-package/(?P<arch>.+)/(?P<name>.+)/(?P<epoch>.+)/(?P<version>.+)/(?P<release>.+)/$', 'packages.views.details'),
+	(r'^by-source/(?P<source>.+)/$', 'packages.views.browse_source'),
+	(r'^search/$', 'packages.views.search'),
+)

Added: packages-ng/packages/views.py
==============================================================================
--- (empty file)
+++ packages-ng/packages/views.py	Mon Jun 16 16:55:40 2008
@@ -0,0 +1,36 @@
+from django.shortcuts import get_list_or_404, get_object_or_404
+from django.views.generic.simple import direct_to_template
+import django.newforms as forms
+from models import Package
+
+class PkSearchForm(forms.Form):
+	query = forms.CharField(u'Query')
+
+def index(request):
+	form = PkSearchForm()
+	groups = [x['rpm_group'] for x in Package.objects.order_by('rpm_group').values('rpm_group').distinct()]
+	return direct_to_template(request, 'index.html', {'form': form, 'groups': groups})
+
+def search(request):
+	form = PkSearchForm(request.GET)
+	if form.is_valid():
+		packages = Package.objects.filter(name__icontains = form.cleaned_data['query'])
+		return direct_to_template(request, 'search.html', {'form': form, 'packages': packages})
+	else:
+		return direct_to_template(request, 'search.html', {'form': form})
+
+def browse_group(request, group):
+	packages = get_list_or_404(Package.objects, rpm_group = group)
+	return direct_to_template(request, 'group.html', {'packages': packages, 'group': group})
+
+def browse_provides(request, provide):
+	packages = get_list_or_404(Package.objects, provide__name = provide)
+	return direct_to_template(request, 'provides.html', {'packages': packages, 'provide': provide})
+
+def browse_source(request, source):
+	packages = get_list_or_404(Package.objects, rpm_sourcerpm = source)
+	return direct_to_template(request, 'source.html', {'packages': packages, 'source': source})
+
+def details(request, arch, name, epoch, version, release):
+	package = get_object_or_404(Package.objects, name = name, epoch = epoch, version = version, release = release, arch = arch)
+	return direct_to_template(request, 'details.html', {'package': package})

Added: packages-ng/settings.py
==============================================================================
--- (empty file)
+++ packages-ng/settings.py	Mon Jun 16 16:55:40 2008
@@ -0,0 +1,86 @@
+import os.path
+
+DEBUG = True
+TEMPLATE_DEBUG = DEBUG
+
+ADMINS = (
+     ('Patryk Zawadzki', 'patrys at gmail.com'),
+)
+
+MANAGERS = ADMINS
+
+DATABASE_ENGINE = 'sqlite3'           # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
+DATABASE_NAME = 'primary.sqlite'             # Or path to database file if using sqlite3.
+DATABASE_USER = ''             # Not used with sqlite3.
+DATABASE_PASSWORD = ''         # Not used with sqlite3.
+DATABASE_HOST = ''             # Set to empty string for localhost. Not used with sqlite3.
+DATABASE_PORT = ''             # Set to empty string for default. Not used with sqlite3.
+
+# Local time zone for this installation. Choices can be found here:
+# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
+# although not all choices may be avilable on all operating systems.
+# If running in a Windows environment this must be set to the same as your
+# system time zone.
+TIME_ZONE = 'Europe/Warsaw'
+
+# Language code for this installation. All choices can be found here:
+# http://www.i18nguy.com/unicode/language-identifiers.html
+LANGUAGE_CODE = 'en-us'
+
+SITE_ID = 1
+
+# If you set this to False, Django will make some optimizations so as not
+# to load the internationalization machinery.
+USE_I18N = True
+
+SITE_ROOT = os.path.abspath(os.path.split(__file__)[0])
+
+# Absolute path to the directory that holds media.
+# Example: "/home/media/media.lawrence.com/"
+MEDIA_ROOT = os.path.join(SITE_ROOT, 'webroot/')
+
+# URL that handles the media served from MEDIA_ROOT. Make sure to use a
+# trailing slash if there is a path component (optional in other cases).
+# Examples: "http://media.lawrence.com", "http://example.com/media/"
+MEDIA_URL = '/media/'
+
+# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
+# trailing slash.
+# Examples: "http://foo.com/media/", "/media/".
+ADMIN_MEDIA_PREFIX = '/admin_media/'
+
+# Make this unique, and don't share it with anybody.
+SECRET_KEY = ''
+
+# List of callables that know how to import templates from various sources.
+TEMPLATE_LOADERS = (
+    'django.template.loaders.filesystem.load_template_source',
+    'django.template.loaders.app_directories.load_template_source',
+)
+
+MIDDLEWARE_CLASSES = (
+    'django.middleware.common.CommonMiddleware',
+    'django.contrib.sessions.middleware.SessionMiddleware',
+    'django.contrib.auth.middleware.AuthenticationMiddleware',
+    'django.middleware.doc.XViewMiddleware',
+)
+
+ROOT_URLCONF = 'urls'
+
+TEMPLATE_DIRS = (
+)
+
+INSTALLED_APPS = (
+    'django.contrib.auth',
+    'django.contrib.contenttypes',
+    'django.contrib.sessions',
+    'packages',
+)
+
+TEMPLATE_CONTEXT_PROCESSORS = (
+    "django.core.context_processors.auth",
+    "django.core.context_processors.debug",
+    "django.core.context_processors.i18n",
+    "django.core.context_processors.media",
+)
+

Added: packages-ng/svn-commit.tmp
==============================================================================
--- (empty file)
+++ packages-ng/svn-commit.tmp	Mon Jun 16 16:55:40 2008
@@ -0,0 +1,4 @@
+- initial import
+--Ta linia i następne zostaną zignorowane--
+
+A    .

Added: packages-ng/urls.py
==============================================================================
--- (empty file)
+++ packages-ng/urls.py	Mon Jun 16 16:55:40 2008
@@ -0,0 +1,10 @@
+from django.conf.urls.defaults import *
+
+urlpatterns = patterns('',
+    # Example:
+    # (r'^pldpackages/', include('pldpackages.foo.urls')),
+
+    # Uncomment this for admin:
+#     (r'^admin/', include('django.contrib.admin.urls')),
+	(r'^', include('packages.urls')),
+)


More information about the pld-cvs-commit mailing list