From fab19a6bfca42211e5f4e3a2949e03455a79aaa8 Mon Sep 17 00:00:00 2001
From: volpino
Date: Tue, 10 Jul 2012 16:15:06 +0200
Subject: [PATCH] euscanwww: Watch/unwatch packages, categories, maintainers,
overlays
Added a button for watch/unwatch and a dashboard with user selected
stuff only
Signed-off-by: volpino
---
euscanwww/djeuscan/managers.py | 18 +-
...dd_unique_overlayassociation_user_overl.py | 207 ++++++++++++++++++
euscanwww/djeuscan/models.py | 14 ++
euscanwww/djeuscan/templates/_base.html | 1 +
.../templates/euscan/_overlays_table.html | 18 ++
.../templates/euscan/accounts/overlays.html | 15 ++
.../djeuscan/templates/euscan/category.html | 32 ++-
euscanwww/djeuscan/templates/euscan/herd.html | 31 ++-
.../djeuscan/templates/euscan/maintainer.html | 32 ++-
.../djeuscan/templates/euscan/overlay.html | 32 ++-
.../djeuscan/templates/euscan/overlays.html | 18 +-
.../djeuscan/templates/euscan/package.html | 4 +-
euscanwww/djeuscan/templatetags/euscan.py | 8 +
euscanwww/djeuscan/tests/test_models.py | 3 +-
euscanwww/djeuscan/urls.py | 21 +-
euscanwww/djeuscan/views.py | 105 +++++++--
euscanwww/runtests.py | 7 +-
17 files changed, 507 insertions(+), 59 deletions(-)
create mode 100644 euscanwww/djeuscan/migrations/0009_auto__add_overlayassociation__add_unique_overlayassociation_user_overl.py
create mode 100644 euscanwww/djeuscan/templates/euscan/_overlays_table.html
create mode 100644 euscanwww/djeuscan/templates/euscan/accounts/overlays.html
diff --git a/euscanwww/djeuscan/managers.py b/euscanwww/djeuscan/managers.py
index 0d4c544..33d7ee8 100644
--- a/euscanwww/djeuscan/managers.py
+++ b/euscanwww/djeuscan/managers.py
@@ -52,13 +52,16 @@ class PackageMixin(object):
"""
return self.values('category').annotate(**ANNOTATE_DICT)
- def herds(self, rename=False):
+ def herds(self, ids=None, rename=False):
"""
Returns all the available herds
"""
# FIXME: optimize the query, it uses 'LEFT OUTER JOIN' instead of
# 'INNER JOIN'
- res = self.filter(herds__isnull=False)
+ if ids is not None:
+ res = self.filter(herds__id__in=ids)
+ else:
+ res = self.filter(herds__isnull=False)
res = res.values('herds__herd').annotate(**ANNOTATE_DICT)
if rename:
@@ -66,11 +69,16 @@ class PackageMixin(object):
return res
- def maintainers(self, rename=False):
+ def maintainers(self, ids=None, rename=False):
"""
Returns all the available maintainers
"""
- res = self.filter(maintainers__isnull=False).values(
+ if ids is not None:
+ res = self.filter(maintainers__id__in=ids)
+ else:
+ res = self.filter(maintainers__isnull=False)
+
+ res = res.values(
'maintainers__id', 'maintainers__name', 'maintainers__email'
)
res = res.annotate(**ANNOTATE_DICT)
@@ -90,7 +98,7 @@ class PackageMixin(object):
Returns the all available overlays
"""
res = self.values('version__overlay').exclude(version__overlay='')
- return res.distinct()
+ return [o["version__overlay"] for o in res.distinct()]
def for_overlay(self, overlay):
"""
diff --git a/euscanwww/djeuscan/migrations/0009_auto__add_overlayassociation__add_unique_overlayassociation_user_overl.py b/euscanwww/djeuscan/migrations/0009_auto__add_overlayassociation__add_unique_overlayassociation_user_overl.py
new file mode 100644
index 0000000..6ebd84c
--- /dev/null
+++ b/euscanwww/djeuscan/migrations/0009_auto__add_overlayassociation__add_unique_overlayassociation_user_overl.py
@@ -0,0 +1,207 @@
+# -*- coding: utf-8 -*-
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+ # Adding model 'OverlayAssociation'
+ db.create_table('djeuscan_overlayassociation', (
+ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+ ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])),
+ ('overlay', self.gf('django.db.models.fields.CharField')(max_length=128)),
+ ))
+ db.send_create_signal('djeuscan', ['OverlayAssociation'])
+
+ # Adding unique constraint on 'OverlayAssociation', fields ['user', 'overlay']
+ db.create_unique('djeuscan_overlayassociation', ['user_id', 'overlay'])
+
+ def backwards(self, orm):
+ # Removing unique constraint on 'OverlayAssociation', fields ['user', 'overlay']
+ db.delete_unique('djeuscan_overlayassociation', ['user_id', 'overlay'])
+
+ # Deleting model 'OverlayAssociation'
+ db.delete_table('djeuscan_overlayassociation')
+
+ models = {
+ 'auth.group': {
+ 'Meta': {'object_name': 'Group'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+ },
+ 'auth.permission': {
+ 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
+ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'auth.user': {
+ 'Meta': {'object_name': 'User'},
+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
+ },
+ 'contenttypes.contenttype': {
+ 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+ },
+ 'djeuscan.categoryassociation': {
+ 'Meta': {'unique_together': "(['user', 'category'],)", 'object_name': 'CategoryAssociation'},
+ 'category': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
+ },
+ 'djeuscan.categorylog': {
+ 'Meta': {'object_name': 'CategoryLog', '_ormbases': ['djeuscan.Log']},
+ 'category': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'log_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['djeuscan.Log']", 'unique': 'True', 'primary_key': 'True'})
+ },
+ 'djeuscan.euscanresult': {
+ 'Meta': {'object_name': 'EuscanResult'},
+ 'datetime': ('django.db.models.fields.DateTimeField', [], {}),
+ 'ebuild': ('django.db.models.fields.CharField', [], {'max_length': '256', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'package': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['djeuscan.Package']"}),
+ 'result': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'scan_time': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'})
+ },
+ 'djeuscan.herd': {
+ 'Meta': {'object_name': 'Herd'},
+ 'email': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}),
+ 'herd': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '128'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
+ },
+ 'djeuscan.herdassociation': {
+ 'Meta': {'unique_together': "(['user', 'herd'],)", 'object_name': 'HerdAssociation'},
+ 'herd': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['djeuscan.Herd']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
+ },
+ 'djeuscan.herdlog': {
+ 'Meta': {'object_name': 'HerdLog', '_ormbases': ['djeuscan.Log']},
+ 'herd': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['djeuscan.Herd']"}),
+ 'log_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['djeuscan.Log']", 'unique': 'True', 'primary_key': 'True'})
+ },
+ 'djeuscan.log': {
+ 'Meta': {'object_name': 'Log'},
+ 'datetime': ('django.db.models.fields.DateTimeField', [], {}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'n_packages_gentoo': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'n_packages_outdated': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'n_packages_overlay': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'n_versions_gentoo': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'n_versions_overlay': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'n_versions_upstream': ('django.db.models.fields.IntegerField', [], {'default': '0'})
+ },
+ 'djeuscan.maintainer': {
+ 'Meta': {'object_name': 'Maintainer'},
+ 'email': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '128'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128'})
+ },
+ 'djeuscan.maintainerassociation': {
+ 'Meta': {'unique_together': "(['user', 'maintainer'],)", 'object_name': 'MaintainerAssociation'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'maintainer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['djeuscan.Maintainer']"}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
+ },
+ 'djeuscan.maintainerlog': {
+ 'Meta': {'object_name': 'MaintainerLog', '_ormbases': ['djeuscan.Log']},
+ 'log_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['djeuscan.Log']", 'unique': 'True', 'primary_key': 'True'}),
+ 'maintainer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['djeuscan.Maintainer']"})
+ },
+ 'djeuscan.overlayassociation': {
+ 'Meta': {'unique_together': "(['user', 'overlay'],)", 'object_name': 'OverlayAssociation'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'overlay': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
+ },
+ 'djeuscan.package': {
+ 'Meta': {'unique_together': "(['category', 'name'],)", 'object_name': 'Package'},
+ 'category': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'herds': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['djeuscan.Herd']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'homepage': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'last_version_gentoo': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'last_version_gentoo'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['djeuscan.Version']"}),
+ 'last_version_overlay': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'last_version_overlay'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['djeuscan.Version']"}),
+ 'last_version_upstream': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'last_version_upstream'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['djeuscan.Version']"}),
+ 'maintainers': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['djeuscan.Maintainer']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'n_overlay': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'n_packaged': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'n_versions': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128'})
+ },
+ 'djeuscan.packageassociation': {
+ 'Meta': {'unique_together': "(['user', 'package'],)", 'object_name': 'PackageAssociation'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'package': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['djeuscan.Package']"}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
+ },
+ 'djeuscan.problemreport': {
+ 'Meta': {'object_name': 'ProblemReport'},
+ 'datetime': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'message': ('django.db.models.fields.TextField', [], {}),
+ 'package': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['djeuscan.Package']"}),
+ 'subject': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'version': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['djeuscan.Version']", 'null': 'True', 'blank': 'True'})
+ },
+ 'djeuscan.refreshpackagequery': {
+ 'Meta': {'object_name': 'RefreshPackageQuery'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'package': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['djeuscan.Package']"}),
+ 'priority': ('django.db.models.fields.IntegerField', [], {'default': '0'})
+ },
+ 'djeuscan.version': {
+ 'Meta': {'unique_together': "(['package', 'slot', 'revision', 'version', 'overlay'],)", 'object_name': 'Version'},
+ 'alive': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'db_index': 'True'}),
+ 'confidence': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'handler': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'overlay': ('django.db.models.fields.CharField', [], {'default': "'gentoo'", 'max_length': '128', 'db_index': 'True', 'blank': 'True'}),
+ 'package': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['djeuscan.Package']"}),
+ 'packaged': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'revision': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'slot': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128', 'blank': 'True'}),
+ 'urls': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'version': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'version_type': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'})
+ },
+ 'djeuscan.versionlog': {
+ 'Meta': {'object_name': 'VersionLog'},
+ 'action': ('django.db.models.fields.IntegerField', [], {}),
+ 'datetime': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'overlay': ('django.db.models.fields.CharField', [], {'default': "'gentoo'", 'max_length': '128', 'blank': 'True'}),
+ 'package': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['djeuscan.Package']"}),
+ 'packaged': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'revision': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'slot': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128', 'blank': 'True'}),
+ 'version': ('django.db.models.fields.CharField', [], {'max_length': '128'})
+ },
+ 'djeuscan.worldlog': {
+ 'Meta': {'object_name': 'WorldLog', '_ormbases': ['djeuscan.Log']},
+ 'log_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['djeuscan.Log']", 'unique': 'True', 'primary_key': 'True'})
+ }
+ }
+
+ complete_apps = ['djeuscan']
\ No newline at end of file
diff --git a/euscanwww/djeuscan/models.py b/euscanwww/djeuscan/models.py
index 9264138..c3221f2 100644
--- a/euscanwww/djeuscan/models.py
+++ b/euscanwww/djeuscan/models.py
@@ -130,6 +130,9 @@ class Version(models.Model):
handler = models.CharField(max_length=128, blank=True)
confidence = models.IntegerField(default=0)
+ ebuild_path = models.CharField(blank=True, max_length=256)
+ metadata_path = models.CharField(blank=True, max_length=256)
+
class Meta:
unique_together = ['package', 'slot', 'revision', 'version', 'overlay']
@@ -320,6 +323,17 @@ class CategoryAssociation(models.Model):
return u'[%s] %s' % (self.user, self.category)
+class OverlayAssociation(models.Model):
+ user = models.ForeignKey(User)
+ overlay = models.CharField(max_length=128, validators=[validate_name])
+
+ class Meta:
+ unique_together = ['user', 'overlay']
+
+ def __unicode__(self):
+ return u'[%s] %s' % (self.user, self.category)
+
+
class ProblemReport(models.Model):
package = models.ForeignKey(Package)
version = models.ForeignKey(Version, null=True, blank=True)
diff --git a/euscanwww/djeuscan/templates/_base.html b/euscanwww/djeuscan/templates/_base.html
index 717eb20..f8a4cc0 100644
--- a/euscanwww/djeuscan/templates/_base.html
+++ b/euscanwww/djeuscan/templates/_base.html
@@ -56,6 +56,7 @@
Herds
Maintainers
Packages
+ Overlays
Logout
{% else %}
diff --git a/euscanwww/djeuscan/templates/euscan/_overlays_table.html b/euscanwww/djeuscan/templates/euscan/_overlays_table.html
new file mode 100644
index 0000000..f1a59f6
--- /dev/null
+++ b/euscanwww/djeuscan/templates/euscan/_overlays_table.html
@@ -0,0 +1,18 @@
+{% load url from future %}
+
+
+
+ Overlay |
+
+
+ {% for overlay in overlays %}
+
+
+
+ {{ overlay }}
+
+ |
+
+ {% endfor %}
+
+
diff --git a/euscanwww/djeuscan/templates/euscan/accounts/overlays.html b/euscanwww/djeuscan/templates/euscan/accounts/overlays.html
new file mode 100644
index 0000000..589922b
--- /dev/null
+++ b/euscanwww/djeuscan/templates/euscan/accounts/overlays.html
@@ -0,0 +1,15 @@
+{% extends "euscan/_datatable.html" %}
+
+{% load euscan %}
+{% load url from future %}
+
+{% block title %}
+{{ block.super }} - Watched overlays
+{% endblock %}
+
+{% block content %}
+Watched overlays
+
+{% overlays_table overlays %}
+
+{% endblock %}
diff --git a/euscanwww/djeuscan/templates/euscan/category.html b/euscanwww/djeuscan/templates/euscan/category.html
index edfd4c5..0096af1 100644
--- a/euscanwww/djeuscan/templates/euscan/category.html
+++ b/euscanwww/djeuscan/templates/euscan/category.html
@@ -16,7 +16,18 @@
{% endblock %}
{% block content %}
-Category: {{ category }}
+
+ Category: {{ category }}
+
+ {% if user.is_authenticated %}
+
+
+ {% endif %}
+
{% packages packages %}
@@ -38,11 +49,27 @@
+
+
{% endblock %}
{% block menus %}
{{ block.super }}
-