diff options
author | Luke Shumaker <LukeShu@sbcglobal.net> | 2013-04-22 00:36:57 -0400 |
---|---|---|
committer | Luke Shumaker <LukeShu@sbcglobal.net> | 2013-04-22 00:36:57 -0400 |
commit | df7a6aa620af6a165bdacd755757f8cb1179331c (patch) | |
tree | 384b4c62d1f50d8effb733d81d2a810666807624 /releng/models.py | |
parent | 94f972bb892dbf9a86f089f1872ae6d849c0cd0e (diff) | |
parent | a22557811a24b68ef85d4271787c48d8d1e4fc99 (diff) |
Merge branch 'archweb-generic2'
Conflicts:
README.BRANDING
local_settings.py.example
packages/templatetags/package_extras.py
public/views.py
releng/views.py
settings.py
sitestatic/archnavbar/archnavbar.css
sitestatic/silhouette.png
templates/base.html
templates/packages/differences.html
templates/packages/opensearch.xml
templates/packages/search.html
templates/public/donate.html
templates/public/download.html
templates/public/feeds.html
templates/public/index.html
urls.py
Diffstat (limited to 'releng/models.py')
-rw-r--r-- | releng/models.py | 112 |
1 files changed, 106 insertions, 6 deletions
diff --git a/releng/models.py b/releng/models.py index 56187766..5ee2f325 100644 --- a/releng/models.py +++ b/releng/models.py @@ -1,9 +1,20 @@ +from base64 import b64decode +from bencode import bdecode, bencode +from datetime import datetime +import hashlib +import markdown +from pytz import utc + +from django.conf import settings from django.core.urlresolvers import reverse from django.db import models from django.db.models.signals import pre_save +from django.utils.safestring import mark_safe +from main.fields import PositiveBigIntegerField from main.utils import set_created_field + class IsoOption(models.Model): name = models.CharField(max_length=200) @@ -13,10 +24,12 @@ class IsoOption(models.Model): class Meta: abstract = True + class RollbackOption(IsoOption): class Meta: abstract = True + class Iso(models.Model): name = models.CharField(max_length=255) created = models.DateTimeField(editable=False) @@ -32,41 +45,54 @@ class Iso(models.Model): class Meta: verbose_name = 'ISO' + class Architecture(IsoOption): pass + class IsoType(IsoOption): class Meta: verbose_name = 'ISO type' + class BootType(IsoOption): pass + class HardwareType(IsoOption): pass + class InstallType(IsoOption): pass + class Source(IsoOption): pass + class ClockChoice(IsoOption): pass + class Filesystem(RollbackOption): pass + class Module(RollbackOption): pass + class Bootloader(IsoOption): pass + class Test(models.Model): user_name = models.CharField(max_length=500) - user_email = models.EmailField() - ip_address = models.IPAddressField() + user_email = models.EmailField('email address') + # Great work, Django... https://code.djangoproject.com/ticket/18212 + ip_address = models.GenericIPAddressField(verbose_name='IP address', + unpack_ipv4=True) created = models.DateTimeField(editable=False) iso = models.ForeignKey(Iso) @@ -88,9 +114,83 @@ class Test(models.Model): success = models.BooleanField() comments = models.TextField(null=True, blank=True) -pre_save.connect(set_created_field, sender=Iso, - dispatch_uid="releng.models") -pre_save.connect(set_created_field, sender=Test, - dispatch_uid="releng.models") + +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) + + class Meta: + get_latest_by = 'release_date' + ordering = ('-release_date', '-version') + + def __unicode__(self): + return self.version + + def get_absolute_url(self): + return reverse('releng-release-detail', args=[self.version]) + + def dir_path(self): + return "iso/%s/" % self.version + + def iso_url(self): + return "iso/%s/archlinux-%s-dual.iso" % (self.version, self.version) + + def magnet_uri(self): + query = [ + ('dn', "archlinux-%s-dual.iso" % self.version), + ] + 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)) + return "magnet:?%s" % '&'.join(['%s=%s' % (k, v) for k, v in query]) + + def info_html(self): + return mark_safe(markdown.markdown( + self.info, safe_mode=True, enable_attributes=False)) + + def torrent(self): + try: + data = b64decode(self.torrent_data.encode('utf-8')) + except TypeError: + return None + if not data: + return None + data = bdecode(data) + # transform the data into a template-friendly dict + info = data.get('info', {}) + metadata = { + 'comment': data.get('comment', None), + 'created_by': data.get('created by', None), + 'creation_date': None, + 'announce': data.get('announce', None), + 'file_name': info.get('name', None), + 'file_length': info.get('length', None), + 'piece_count': len(info.get('pieces', '')) / 20, + 'piece_length': info.get('piece length', None), + 'url_list': data.get('url-list', []), + 'info_hash': None, + } + if 'creation date' in data: + created= datetime.utcfromtimestamp(data['creation date']) + metadata['creation_date'] = created.replace(tzinfo=utc) + if info: + metadata['info_hash'] = hashlib.sha1(bencode(info)).hexdigest() + + return metadata + + +for model in (Iso, Test, Release): + pre_save.connect(set_created_field, sender=model, + dispatch_uid="releng.models") # vim: set ts=4 sw=4 et: |