From 0e29ce68fc0aa899a7e02954943642381d9531e5 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Mon, 23 Dec 2013 12:03:14 -0600 Subject: A few more tweaks to the URL details template Signed-off-by: Dan McGee --- templates/mirrors/url_details.html | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'templates') diff --git a/templates/mirrors/url_details.html b/templates/mirrors/url_details.html index 0b9d2916..54960a0d 100644 --- a/templates/mirrors/url_details.html +++ b/templates/mirrors/url_details.html @@ -15,7 +15,7 @@

URL Details: {{ url.url }}

- + @@ -42,6 +42,14 @@

URL Details: {{ url.url }}

+ + + + + + + + {% endif %}
URL:{{ url.url }}{% if url.protocol.is_download %}{{ url.url }}{% else %}{{ url.url }}{% endif %}
Protocol: Created: {{ url.created }}
First Check:{{ url.logs.earliest.check_time }}
Last Check:{{ url.logs.latest.check_time }}
-- cgit v1.2.3-54-g00ecf From 67a0c0ac088ed2d48fc785f13097557ed6ad25cf Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Thu, 9 Jan 2014 08:40:34 -0600 Subject: Remove remaining references to release file_size field Signed-off-by: Dan McGee --- feeds.py | 5 ++++- templates/public/download.html | 2 +- templates/releng/release_list.html | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) (limited to 'templates') diff --git a/feeds.py b/feeds.py index 678bebcf..ecdb7d9a 100644 --- a/feeds.py +++ b/feeds.py @@ -194,7 +194,10 @@ def item_enclosure_url(self, item): return "%s://%s/%s.torrent" % (proto, domain, item.iso_url()) def item_enclosure_length(self, item): - return item.file_size or "" + if item.torrent_data: + torrent = item.torrent() + return torrent['file_length'] or "" + return "" item_enclosure_mime_type = 'application/x-bittorrent' diff --git a/templates/public/download.html b/templates/public/download.html index 71da1c17..00db9bed 100644 --- a/templates/public/download.html +++ b/templates/public/download.html @@ -27,7 +27,7 @@

Release Info

    {% if release.version %}
  • Current Release: {{ release.version }}
  • {% endif %} {% if release.kernel_version %}
  • Included Kernel: {{ release.kernel_version }}
  • {% endif %} - {% if release.file_size %}
  • ISO Size: {{ release.file_size|filesizeformat }}
  • {% endif %} + {% if release.torrent_data %}
  • ISO Size: {{ release.torrent.file_length|filesizeformat }}
  • {% endif %}
  • Installation Guide
  • Resources:
      diff --git a/templates/releng/release_list.html b/templates/releng/release_list.html index f7e90377..be257f9e 100644 --- a/templates/releng/release_list.html +++ b/templates/releng/release_list.html @@ -34,7 +34,7 @@

      Releases

      {% if item.available %}Torrent{% endif %} {% if item.available %}Magnet{% endif %} - {% if item.file_size %}{{ item.file_size|filesizeformat }}{% endif %} + {% if item.torrent_data %}{{ item.torrent.file_length|filesizeformat }}{% endif %} {% endfor %} -- cgit v1.2.3-54-g00ecf From b47b4e73b856b34afa07b1d72367dba4a7c6c005 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Tue, 7 Jan 2014 14:16:00 -0600 Subject: Remove release fields we can pull from the torrent This makes entering new releases a bit less cumbersome as we don't really need to enter either the file size or the torrent infohash. Signed-off-by: Dan McGee --- ...orrent_infohash__del_field_release_file_size.py | 118 +++++++++++++++++++++ releng/models.py | 10 +- templates/releng/release_detail.html | 6 +- 3 files changed, 125 insertions(+), 9 deletions(-) create mode 100644 releng/migrations/0008_auto__del_field_release_torrent_infohash__del_field_release_file_size.py (limited to 'templates') diff --git a/releng/migrations/0008_auto__del_field_release_torrent_infohash__del_field_release_file_size.py b/releng/migrations/0008_auto__del_field_release_torrent_infohash__del_field_release_file_size.py new file mode 100644 index 00000000..4a80fd8e --- /dev/null +++ b/releng/migrations/0008_auto__del_field_release_torrent_infohash__del_field_release_file_size.py @@ -0,0 +1,118 @@ +# -*- coding: utf-8 -*- +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + db.delete_column(u'releng_release', 'torrent_infohash') + db.delete_column(u'releng_release', 'file_size') + + def backwards(self, orm): + db.add_column(u'releng_release', 'torrent_infohash', + self.gf('django.db.models.fields.CharField')(default='', max_length=40, blank=True), + keep_default=False) + db.add_column(u'releng_release', 'file_size', + self.gf('main.fields.PositiveBigIntegerField')(null=True, blank=True), + keep_default=False) + + models = { + u'releng.architecture': { + 'Meta': {'object_name': 'Architecture'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}) + }, + u'releng.bootloader': { + 'Meta': {'object_name': 'Bootloader'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}) + }, + u'releng.boottype': { + 'Meta': {'object_name': 'BootType'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}) + }, + u'releng.clockchoice': { + 'Meta': {'object_name': 'ClockChoice'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}) + }, + u'releng.filesystem': { + 'Meta': {'object_name': 'Filesystem'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}) + }, + u'releng.hardwaretype': { + 'Meta': {'object_name': 'HardwareType'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}) + }, + u'releng.installtype': { + 'Meta': {'object_name': 'InstallType'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}) + }, + u'releng.iso': { + 'Meta': {'object_name': 'Iso'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'removed': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}) + }, + u'releng.isotype': { + 'Meta': {'object_name': 'IsoType'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}) + }, + u'releng.module': { + 'Meta': {'object_name': 'Module'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}) + }, + u'releng.release': { + 'Meta': {'ordering': "('-release_date', '-version')", 'object_name': 'Release'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'info': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'kernel_version': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}), + 'md5_sum': ('django.db.models.fields.CharField', [], {'max_length': '32', 'blank': 'True'}), + 'release_date': ('django.db.models.fields.DateField', [], {'db_index': 'True'}), + 'sha1_sum': ('django.db.models.fields.CharField', [], {'max_length': '40', 'blank': 'True'}), + 'torrent_data': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'version': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '50'}) + }, + u'releng.source': { + 'Meta': {'object_name': 'Source'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}) + }, + u'releng.test': { + 'Meta': {'object_name': 'Test'}, + 'architecture': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['releng.Architecture']"}), + 'boot_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['releng.BootType']"}), + 'bootloader': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['releng.Bootloader']"}), + 'clock_choice': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['releng.ClockChoice']"}), + 'comments': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {}), + 'filesystem': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['releng.Filesystem']"}), + 'hardware_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['releng.HardwareType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'install_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['releng.InstallType']"}), + 'ip_address': ('django.db.models.fields.GenericIPAddressField', [], {'max_length': '39'}), + 'iso': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['releng.Iso']"}), + 'iso_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['releng.IsoType']"}), + 'modules': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['releng.Module']", 'null': 'True', 'blank': 'True'}), + 'rollback_filesystem': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'rollback_test_set'", 'null': 'True', 'to': u"orm['releng.Filesystem']"}), + 'rollback_modules': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'rollback_test_set'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['releng.Module']"}), + 'source': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['releng.Source']"}), + 'success': ('django.db.models.fields.BooleanField', [], {}), + 'user_email': ('django.db.models.fields.EmailField', [], {'max_length': '75'}), + 'user_name': ('django.db.models.fields.CharField', [], {'max_length': '500'}) + } + } + + complete_apps = ['releng'] diff --git a/releng/models.py b/releng/models.py index 5ee2f325..c73e28d8 100644 --- a/releng/models.py +++ b/releng/models.py @@ -119,14 +119,13 @@ class Release(models.Model): release_date = models.DateField(db_index=True) version = models.CharField(max_length=50, unique=True) kernel_version = models.CharField(max_length=50, blank=True) - torrent_infohash = models.CharField(max_length=40, blank=True) md5_sum = models.CharField('MD5 digest', max_length=32, blank=True) sha1_sum = models.CharField('SHA1 digest', max_length=40, blank=True) - file_size = PositiveBigIntegerField(null=True, blank=True) created = models.DateTimeField(editable=False) available = models.BooleanField(default=True) info = models.TextField('Public information', blank=True) - torrent_data = models.TextField(blank=True) + torrent_data = models.TextField(blank=True, + help_text="base64-encoded torrent file") class Meta: get_latest_by = 'release_date' @@ -150,8 +149,9 @@ def magnet_uri(self): ] if settings.TORRENT_TRACKERS: query.extend(('tr', uri) for uri in settings.TORRENT_TRACKERS) - if self.torrent_infohash: - query.insert(0, ('xt', "urn:btih:%s" % self.torrent_infohash)) + metadata = self.torrent() + if metadata and 'info_hash' in metadata: + query.insert(0, ('xt', "urn:btih:%s" % metadata['info_hash'])) return "magnet:?%s" % '&'.join(['%s=%s' % (k, v) for k, v in query]) def info_html(self): diff --git a/templates/releng/release_detail.html b/templates/releng/release_detail.html index 09507536..5cd1c432 100644 --- a/templates/releng/release_detail.html +++ b/templates/releng/release_detail.html @@ -10,14 +10,12 @@

      {{ release.version }}

    • Release Date: {{ release.release_date|date }}
    • {% if release.kernel_version %}
    • Kernel Version: {{ release.kernel_version }}
    • {% endif %}
    • Available: {{ release.available|yesno }}
    • - {% if release.available %}
    • Download: Download: Torrent, Magnet
    • {% endif %} - {% if release.torrent_infohash %}
    • Torrent Info Hash: {{ release.torrent_infohash }}
    • {% endif %} {% if release.md5_sum %}
    • MD5: {{ release.md5_sum }}
    • {% endif %} {% if release.sha1_sum %}
    • SHA1: {{ release.sha1_sum }}
    • {% endif %} -
    • Download Size: {% if release.file_size %}{{ release.file_size|filesizeformat }}{% else %}Unknown{% endif %}
    {% if release.info %} @@ -38,7 +36,7 @@

    Torrent Information

  • File Length: {{ torrent.file_length|filesizeformat }}
  • Piece Count: {{ torrent.piece_count }} pieces
  • Piece Length: {{ torrent.piece_length|filesizeformat }}
  • -
  • Computed Info Hash: {{ torrent.info_hash }}
  • +
  • Info Hash: {{ torrent.info_hash }}
  • URL List Length: {{ torrent.url_list|length }} URLs
{% endwith %}{% endif %} -- cgit v1.2.3-54-g00ecf From faf196aa521e794aed905122600d12f1c9ab1f0e Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Tue, 21 Jan 2014 08:06:56 -0600 Subject: Flag out-of-date message is no longer optional Changed way back in commit ef9d1c1e, but I didn't update the actual text at the same time. FS#38126. Signed-off-by: Dan McGee --- templates/packages/flag.html | 2 +- templates/packages/flaghelp.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'templates') diff --git a/templates/packages/flag.html b/templates/packages/flag.html index d1226295..a83f37ff 100644 --- a/templates/packages/flag.html +++ b/templates/packages/flag.html @@ -20,7 +20,7 @@

Flag Package: {{ package.pkgname }} {{ package.full_version }} ({{ package.a {% endfor %} -

The message box portion of the flag utility is optional, and meant +

The message box portion is meant for short messages only. If you need more than 200 characters for your message, then file a bug report, email the maintainer directly, or send an email to the Flagging Packages

package so they can update it. If the package is unmaintained, the notification will be sent to a developer mailing list.

-

The message box portion of the flag utility is optional, and meant +

The message box portion of the flag utility is meant for short messages only. If you need more than 200 characters for your message, then file a bug report, email the maintainer directly, or send an email to the Date: Sat, 25 Jan 2014 09:16:48 -0600 Subject: Add 'Latest Update' column to stale package relations This helps when doing the irregular cleanup of these things and making sure a relation has been stale for some time and not just a couple minutes or hours. Signed-off-by: Dan McGee --- packages/models.py | 9 ++++++--- packages/utils.py | 3 ++- templates/packages/stale_relations.html | 2 ++ 3 files changed, 10 insertions(+), 4 deletions(-) (limited to 'templates') diff --git a/packages/models.py b/packages/models.py index 6477d412..da8adc56 100644 --- a/packages/models.py +++ b/packages/models.py @@ -28,6 +28,9 @@ class PackageRelation(models.Model): type = models.PositiveIntegerField(choices=TYPE_CHOICES, default=MAINTAINER) created = models.DateTimeField(editable=False) + class Meta: + unique_together = (('pkgbase', 'user', 'type'),) + def get_associated_packages(self): return Package.objects.normal().filter(pkgbase=self.pkgbase) @@ -35,13 +38,13 @@ def repositories(self): packages = self.get_associated_packages() return sorted({p.repo for p in packages}) + def last_update(self): + return Update.objects.filter(pkgbase=self.pkgbase).latest() + def __unicode__(self): return u'%s: %s (%s)' % ( self.pkgbase, self.user, self.get_type_display()) - class Meta: - unique_together = (('pkgbase', 'user', 'type'),) - class SignoffSpecificationManager(models.Manager): def get_from_package(self, pkg): diff --git a/packages/utils.py b/packages/utils.py index 6ec39483..0f47f170 100644 --- a/packages/utils.py +++ b/packages/utils.py @@ -243,7 +243,8 @@ def get_wrong_permissions(): cursor = connection.cursor() cursor.execute(sql, [PackageRelation.MAINTAINER]) to_fetch = [row[0] for row in cursor.fetchall()] - relations = PackageRelation.objects.select_related('user').filter( + relations = PackageRelation.objects.select_related( + 'user', 'user__userprofile').filter( id__in=to_fetch) return relations diff --git a/templates/packages/stale_relations.html b/templates/packages/stale_relations.html index 76f32052..f1ad4373 100644 --- a/templates/packages/stale_relations.html +++ b/templates/packages/stale_relations.html @@ -52,6 +52,7 @@

Relations with Non-existent pkgbase ({{ missing_pkgbase|length }})< User Type Created + Latest Update @@ -62,6 +63,7 @@

Relations with Non-existent pkgbase ({{ missing_pkgbase|length }})< {{ relation.user.get_full_name }} {{ relation.get_type_display }} {{ relation.created }} + {{ relation.last_update.created }} {% empty %} No non-existent pkgbase relations. -- cgit v1.2.3-54-g00ecf From 4a5714fba769c83724f29578d573f0b4096eb332 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Sun, 26 Jan 2014 12:55:33 -0600 Subject: Revert "Change old packages report from two years to one year" This reverts commit 8d3a1a1c504a70dd23d36c3ed5be0ebcd2f7a86d. Turns out we aren't updating packages quite as often anymore. There are currently 1900+ packages in the repos built more than one year ago. Signed-off-by: Dan McGee Conflicts: devel/views.py --- devel/views.py | 4 ++-- templates/devel/index.html | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'templates') diff --git a/devel/views.py b/devel/views.py index 29954b51..46feece2 100644 --- a/devel/views.py +++ b/devel/views.py @@ -194,8 +194,8 @@ def report(request, report_name, username=None): type=PackageRelation.MAINTAINER).values('user')) if report_name == 'old': - title = 'Packages last built more than one year ago' - cutoff = now() - timedelta(days=365) + title = 'Packages last built more than two years ago' + cutoff = now() - timedelta(days=365 * 2) packages = packages.filter( build_date__lt=cutoff).order_by('build_date') elif report_name == 'long-out-of-date': diff --git a/templates/devel/index.html b/templates/devel/index.html index c0c437a6..a4503102 100644 --- a/templates/devel/index.html +++ b/templates/devel/index.html @@ -150,7 +150,7 @@

Signoff Status

Developer Reports

  • Old: - Packages last built more than one year ago + Packages last built more than two years ago (yours only)
  • Long Out-of-date: Packages marked out-of-date more than 90 days ago -- cgit v1.2.3-54-g00ecf From 7c70083ed5b7cf0fbd1f66551c088a3c963b258c Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Mon, 27 Jan 2014 17:27:54 -0600 Subject: Cleanups and enhancments to JS package search typeahead Remove the need to press enter twice when using this typeahead box. Submit the form on enter, regardless of whether an item is selected or not. Signed-off-by: Dan McGee --- templates/public/index.html | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'templates') diff --git a/templates/public/index.html b/templates/public/index.html index 58dd3729..515ce582 100644 --- a/templates/public/index.html +++ b/templates/public/index.html @@ -224,8 +224,18 @@

    More Resources

    matcher: function(item) { return true; }, sorter: function(items) { return items; }, menu: '
      ', - items: 10 + items: 10, + updater: function(item) { + $('#pkgsearch-form').submit(); + return item; + } }).attr('autocomplete', 'off'); + $('#pkgsearch-field').keyup(function(e) { + if (e.keyCode === 13 && + $('ul.pkgsearch-typeahead li.active').size() === 0) { + $('#pkgsearch-form').submit(); + } + }); } function setupKonami() { var konami = new Konami(function() { -- cgit v1.2.3-54-g00ecf From cd21694652383a49077e15439adf717f631cdd50 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Sun, 16 Feb 2014 11:27:05 -0600 Subject: Ensure correct value gets submitted on package search typeahead Populate the form field with the chosen item before submitting the form. Signed-off-by: Dan McGee --- templates/public/index.html | 1 + 1 file changed, 1 insertion(+) (limited to 'templates') diff --git a/templates/public/index.html b/templates/public/index.html index 515ce582..ab836569 100644 --- a/templates/public/index.html +++ b/templates/public/index.html @@ -226,6 +226,7 @@

      More Resources

      menu: '
        ', items: 10, updater: function(item) { + $('#pkgsearch-field').val(item); $('#pkgsearch-form').submit(); return item; } -- cgit v1.2.3-54-g00ecf From 5fcc6af4ddd0d6f9fbe491a1fd5a9a0edc5b52a5 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Sat, 22 Feb 2014 08:42:07 -0600 Subject: Change long out-of-date report to 30 days At the request of barthalion. This bumps the report from currently showing 36 packages to 109 packages. Signed-off-by: Dan McGee --- devel/views.py | 4 ++-- templates/devel/index.html | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'templates') diff --git a/devel/views.py b/devel/views.py index 46feece2..1e20a437 100644 --- a/devel/views.py +++ b/devel/views.py @@ -199,8 +199,8 @@ def report(request, report_name, username=None): packages = packages.filter( build_date__lt=cutoff).order_by('build_date') elif report_name == 'long-out-of-date': - title = 'Packages marked out-of-date more than 90 days ago' - cutoff = now() - timedelta(days=90) + title = 'Packages marked out-of-date more than 30 days ago' + cutoff = now() - timedelta(days=30) packages = packages.filter( flag_date__lt=cutoff).order_by('flag_date') elif report_name == 'big': diff --git a/templates/devel/index.html b/templates/devel/index.html index a4503102..f432e6b9 100644 --- a/templates/devel/index.html +++ b/templates/devel/index.html @@ -153,7 +153,7 @@

        Developer Reports

        Packages last built more than two years ago (yours only)
      • Long Out-of-date: - Packages marked out-of-date more than 90 days ago + Packages marked out-of-date more than 30 days ago (yours only)
      • Uncompressed Manpages: Self-explanatory -- cgit v1.2.3-54-g00ecf From 871b284dd76f01d8a297f43ae86d869e2b7d2b3c Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Sat, 22 Feb 2014 13:48:52 -0600 Subject: Generate list of reports dynamically Signed-off-by: Dan McGee --- devel/reports.py | 15 ++++++++++----- devel/views.py | 3 ++- templates/devel/index.html | 30 +++++------------------------- 3 files changed, 17 insertions(+), 31 deletions(-) (limited to 'templates') diff --git a/devel/reports.py b/devel/reports.py index f1ffab3f..53cf9e69 100644 --- a/devel/reports.py +++ b/devel/reports.py @@ -11,13 +11,14 @@ class DeveloperReport(object): def __init__(self, slug, name, desc, packages_func, - names=None, attrs=None): + names=None, attrs=None, personal=True): self.slug = slug self.name = name self.description = desc self.packages = packages_func self.names = names self.attrs = attrs + self.personal = personal def old(packages, username): @@ -143,7 +144,7 @@ def mismatched_signature(packages, username): ['compressed_size_pretty', 'installed_size_pretty']) REPORT_BADCOMPRESS = DeveloperReport('badcompression', 'Bad Compression', - 'Packages that have little need for compression', badcompression, + 'Packages with a compression ratio of less than 10%', badcompression, ['Compressed Size', 'Installed Size', 'Ratio', 'Type'], ['compressed_size_pretty', 'installed_size_pretty','ratio', 'compress_type']) @@ -152,13 +153,17 @@ def mismatched_signature(packages, username): 'Packages with uncompressed manpages', uncompressed_man) REPORT_INFO = DeveloperReport('uncompressed-info', 'Uncompressed Info Pages', - 'Packages with uncompressed infopages', uncompressed_info) + 'Packages with uncompressed info pages', uncompressed_info) REPORT_ORPHANS = DeveloperReport('unneeded-orphans', 'Unneeded Orphans', - 'Orphan packages required by no other packages', unneeded_orphans) + 'Packages that have no maintainer and are not required by any ' + + 'other package in any repository', unneeded_orphans, + personal=False) REPORT_SIGNATURE = DeveloperReport('mismatched-signature', 'Mismatched Signatures', - 'Packages with mismatched signatures', mismatched_signature, + 'Packages where 1) signing key is unknown, 2) signer != packager, ' + + 'or 3) signature timestamp more than 24 hours after build timestamp', + mismatched_signature, ['Signature Date', 'Signed By', 'Packager'], ['sig_date', 'sig_by', 'packager']) diff --git a/devel/views.py b/devel/views.py index cd2e25f8..c53da668 100644 --- a/devel/views.py +++ b/devel/views.py @@ -57,7 +57,8 @@ def index(request): 'todos': todolists, 'flagged': flagged, 'todopkgs': todopkgs, - 'signoffs': signoffs + 'signoffs': signoffs, + 'reports': available_reports(), } return render(request, 'devel/index.html', page_dict) diff --git a/templates/devel/index.html b/templates/devel/index.html index f432e6b9..147917a0 100644 --- a/templates/devel/index.html +++ b/templates/devel/index.html @@ -149,31 +149,11 @@

        Signoff Status

        Developer Reports

        {# #dev-dashboard #} -- cgit v1.2.3-54-g00ecf From 2e06e74d3a2a09cbb2a2521cdd55d6543cb56674 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Sun, 9 Mar 2014 11:40:58 -0500 Subject: Use localStorage to save/restore signoffs filters Signed-off-by: Dan McGee --- sitestatic/archweb.js | 18 ++++++++++++++++++ templates/packages/signoffs.html | 1 + 2 files changed, 19 insertions(+) (limited to 'templates') diff --git a/sitestatic/archweb.js b/sitestatic/archweb.js index 209d6f67..8212e85b 100644 --- a/sitestatic/archweb.js +++ b/sitestatic/archweb.js @@ -444,6 +444,7 @@ function filter_signoffs() { $('#filter-count').text(rows.length); /* make sure we update the odd/even styling from sorting */ $('.results').trigger('applyWidgets', [false]); + filter_signoffs_save(); } function filter_signoffs_reset() { $('#signoffs_filter .arch_filter').attr('checked', 'checked'); @@ -451,6 +452,23 @@ function filter_signoffs_reset() { $('#id_pending').removeAttr('checked'); filter_signoffs(); } +function filter_signoffs_save() { + var state = $('#signoffs_filter').serializeArray(); + localStorage['filter_signoffs'] = JSON.stringify(state); +} +function filter_signoffs_load() { + var state = localStorage['filter_signoffs']; + if (!state) + return; + state = JSON.parse(state); + $('#signoffs_filter .arch_filter').removeAttr('checked'); + $('#signoffs_filter .repo_filter').removeAttr('checked'); + $('#id_pending').removeAttr('checked'); + $.each(state, function (i, v) { + // this assumes our only filters are checkboxes + $('#signoffs_filter input[name="' + v['name'] + '"]').attr('checked', 'checked'); + }); +} function collapseNotes(elements) { // Remove any trailing
        tags from the note contents diff --git a/templates/packages/signoffs.html b/templates/packages/signoffs.html index 83f81d39..1c133f15 100644 --- a/templates/packages/signoffs.html +++ b/templates/packages/signoffs.html @@ -93,6 +93,7 @@

        Filter Displayed Signoffs

        $('#signoffs_filter input').change(filter_signoffs); $('#criteria_reset').click(filter_signoffs_reset); // fire function on page load to ensure the current form selections take effect + filter_signoffs_load(); filter_signoffs(); }); $(document).ready(function() { -- cgit v1.2.3-54-g00ecf From 697a2b15c1e402c1c624af1ffeaf5123d7fb0e9f Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Sun, 9 Mar 2014 11:49:22 -0500 Subject: Use localStorage to save/restore todolist filters Signed-off-by: Dan McGee --- sitestatic/archweb.js | 19 +++++++++++++++++++ templates/todolists/view.html | 6 +++++- 2 files changed, 24 insertions(+), 1 deletion(-) (limited to 'templates') diff --git a/sitestatic/archweb.js b/sitestatic/archweb.js index 8212e85b..457e334c 100644 --- a/sitestatic/archweb.js +++ b/sitestatic/archweb.js @@ -367,6 +367,25 @@ function filter_pkgs_reset(callback) { callback(); } +function filter_todolist_save(list_id) { + var state = $('#todolist_filter').serializeArray(); + localStorage['filter_todolist_' + list_id] = JSON.stringify(state); +} +function filter_todolist_load(list_id) { + var state = localStorage['filter_todolist_' + list_id]; + if (!state) + return; + state = JSON.parse(state); + $('#todolist_filter .arch_filter').removeAttr('checked'); + $('#todolist_filter .repo_filter').removeAttr('checked'); + $('#id_incomplete').removeAttr('checked'); + $('#id_mine_only').removeAttr('checked'); + $.each(state, function (i, v) { + // this assumes our only filters are checkboxes + $('#todolist_filter input[name="' + v['name'] + '"]').attr('checked', 'checked'); + }); +} + /* signoffs.html */ function signoff_package() { // TODO: fix usage of this diff --git a/templates/todolists/view.html b/templates/todolists/view.html index a3ee5479..0045390c 100644 --- a/templates/todolists/view.html +++ b/templates/todolists/view.html @@ -118,10 +118,14 @@

        Filter Todo List Packages

        }); $(document).ready(function() { $('a.status-link').click(todolist_flag); - var filter_func = function() { filter_pkgs_list('#todolist_filter', '#dev-todo-pkglist tbody'); }; + var filter_func = function() { + filter_pkgs_list('#todolist_filter', '#dev-todo-pkglist tbody'); + filter_todolist_save({{ list.id }}); + }; $('#todolist_filter input').change(filter_func); $('#criteria_reset').click(function() { filter_pkgs_reset(filter_func); }); // fire function on page load to ensure the current form selections take effect + filter_todolist_load({{ list.id }}); filter_func(); }); -- cgit v1.2.3-54-g00ecf From 268317dd331bcdbe1c2828583034c0274a19eea3 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Sun, 9 Mar 2014 11:58:51 -0500 Subject: Use localStorage to save/restore developer report filters Signed-off-by: Dan McGee --- devel/views.py | 1 + sitestatic/archweb.js | 16 ++++++++++++++++ templates/devel/packages.html | 6 +++++- 3 files changed, 22 insertions(+), 1 deletion(-) (limited to 'templates') diff --git a/devel/views.py b/devel/views.py index c53da668..972d0abb 100644 --- a/devel/views.py +++ b/devel/views.py @@ -201,6 +201,7 @@ def report(request, report_name, username=None): context = { 'all_maintainers': maints, 'title': report.description, + 'report': report, 'maintainer': user, 'packages': report.packages(packages, username), 'arches': sorted(arches), diff --git a/sitestatic/archweb.js b/sitestatic/archweb.js index 457e334c..0a979494 100644 --- a/sitestatic/archweb.js +++ b/sitestatic/archweb.js @@ -386,6 +386,22 @@ function filter_todolist_load(list_id) { }); } +function filter_report_save(report_id) { + var state = $('#report_filter').serializeArray(); + localStorage['filter_report_' + report_id] = JSON.stringify(state); +} +function filter_report_load(report_id) { + var state = localStorage['filter_report_' + report_id]; + if (!state) + return; + state = JSON.parse(state); + $('#report_filter input[type="checkbox"]').removeAttr('checked') + $.each(state, function (i, v) { + // this assumes our only filters are checkboxes + $('#report_filter input[name="' + v['name'] + '"]').attr('checked', 'checked'); + }); +} + /* signoffs.html */ function signoff_package() { // TODO: fix usage of this diff --git a/templates/devel/packages.html b/templates/devel/packages.html index 74aebf20..c190ab08 100644 --- a/templates/devel/packages.html +++ b/templates/devel/packages.html @@ -84,10 +84,14 @@

        Filter Packages

        $(".results").tablesorter({widgets: ['zebra']}); }); $(document).ready(function() { - var filter_func = function() { filter_pkgs_list('#report_filter', '#dev-report-results tbody'); }; + var filter_func = function() { + filter_pkgs_list('#report_filter', '#dev-report-results tbody'); + filter_report_save('{{ report.slug }}'); + }; $('#report_filter input').change(filter_func); $('#criteria_reset').click(function() { filter_pkgs_reset(filter_func); }); // run on page load to ensure current form selections take effect + filter_report_load('{{ report.slug }}'); filter_func(); }); -- cgit v1.2.3-54-g00ecf