summaryrefslogtreecommitdiff
path: root/patchtracker/models.py
blob: 175860996fab31dcd01ca1ceb38b9a852594b280 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import os
import re

import Conf
import Patch

from django.db import models

class SourcePackage (models.Model):
  name = models.CharField(max_length=1024)
  version = models.CharField(max_length=1024)
  format = models.CharField(max_length=64)
  loc = models.CharField(max_length=4096)
  diffgz_name = models.CharField(max_length=4096, null=True, blank=True)
  diffgz_size = models.IntegerField(null=True, blank=True)
  diffgz_md5sum = models.CharField(max_length=32, null=True, blank=True)
  debtar_name = models.CharField(max_length=4096, null=True, blank=True)
  debtar_size = models.IntegerField(null=True, blank=True)
  debtar_md5sum = models.CharField(max_length=32, null=True, blank=True)
  maintainer = models.CharField(max_length=1024)
  uploaders = models.CharField(max_length=4096, null=True, blank=True)

  def type( self ):
    """ Source package "type".  Not incredibly useful, i guess... """
    if self.diffgz_name or self.debtar_name:
      return "Debian-diff"
    else:
      return "Native"

  def diffhandler( self ):
    """ Return a diffhandler object too the caller """
    if self.diffgz_name:
      dgz = os.sep.join([Conf.archive_root, self.loc, self.diffgz_name])
      return Patch.DiffGzHandler(dgz)
    elif self.debtar_name:
      dtar = os.sep.join([Conf.archive_root, self.loc, self.debtar_name])
      return Patch.DebTarHandler(dtar)

  def anchor_name(self):
    """ output a version of the package name suitable for use as an
        anchor name (i.e. <a name="foo">) """
    return re.sub("([^a-zA-Z0-9-])", (lambda x: "_%d"%(ord(x.group(1)))), self.name)

  def wrappable_version(self):
    """ output a version that can be broken up by a web browser using
        the unicode zero-whitespace-break character (&#8203;) """
    return '&#8203;'.join([self.version[i:i+12] for i in range(0,len(self.version),12)])

  def __unicode__( self ):
    return "%s (%s)"%(self.name, self.version)

  class Meta:
    managed = False
    db_table = 'packages'
    unique_together = (('name','version'),)

class RepositorySuite (models.Model):
  name = models.CharField(max_length=1024, unique=True)

  def __unicode__( self ):
    return unicode(self.name)

  class Meta:
    managed = False
    db_table = 'suites'

class RepositoryComponent (models.Model):
  name = models.CharField(max_length=1024, unique=True)

  def __unicode__( self ):
    return unicode(self.name)

  class Meta:
    managed = False
    db_table = 'components'

class SourcePackageMapping (models.Model):
  rowid = models.AutoField(primary_key=True)
  package = models.ForeignKey(SourcePackage)
  suite = models.ForeignKey(RepositorySuite)
  component = models.ForeignKey(RepositoryComponent)

  def __unicode__( self ):
    return "%s / %s / %s"%(unicode(self.package),unicode(self.suite),unicode(self.component))

  class Meta:
    managed = False
    db_table = 'package_rel_map'
    unique_together = (('package','suite','component'),)