from django.db import models from collectors.models import * ## -------------------------------------- ## Tracker ## -------------------------------------- class Tracker(models.Model): url = models.URLField(unique=True) created = models.DateTimeField(auto_now_add=True,blank=True) def __unicode__(self): return self.url ## -------------------------------------- ## Torrent ## -------------------------------------- class Torrent(models.Model): STATUS_NEW = 'NE' STATUS_INVALID = 'IN' STATUS_ACTIVE = 'AC' STATUS_DEAD = 'DE' STATUS_IGNORE = 'IG' STATUS_TYPES = [ (STATUS_NEW, 'New'), (STATUS_INVALID, 'Invalid'), (STATUS_ACTIVE, 'Active'), (STATUS_DEAD, 'Dead'), (STATUS_IGNORE, 'Ignore'), ] source = models.ForeignKey(Source,null=False) trackers = models.ManyToManyField(Tracker,null=False) feed = models.ForeignKey(Feed,null=False) feed_date = models.DateTimeField(null=True,blank=True) category = models.ForeignKey(Category,null=False) first_checked = models.DateTimeField(null=True,blank=True) last_checked = models.DateTimeField(null=True,blank=True) last_peer = models.DateTimeField(null=True,blank=True) last_tracker = models.DateTimeField(null=True,blank=True) status = models.CharField(max_length=2,null=False,blank=False,choices=STATUS_TYPES,default=STATUS_NEW) info_url = models.URLField() torrent_url = models.URLField() info_hash = models.CharField(max_length=40,unique=True,null=False) name = models.CharField(max_length=255) created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True,blank=True) closed = models.DateTimeField(null=True,blank=True) def __unicode__(self): #return unicode(self.name.encode("utf-8")) #if len(self.name) > 0: # return unicode(self.name) return u"Torrent #" + unicode(self.id) def short_name(self): if len(self.name) > 50: return self.name[0:50] + u"..." return self.name short_name.short_description = 'Name' short_name.admin_order_field = 'name' def snapshots(self): return TorrentSnapshot.objects.filter(torrent__exact=self) snapshots.short_description = 'Snapshots' def snapshots_link(self): return "%d" % (self.id, len(self.snapshots())) snapshots_link.short_description = 'Snapshots' snapshots_link.allow_tags = True def data(self): return TorrentData.objects.get(torrent__exact=self) data.short_description = 'Meta-Data' def data_link(self): return "View" % (self.id) data_link.short_description = 'Meta-Data' data_link.allow_tags = True ## -------------------------------------- ## TorrentData ## -------------------------------------- class TorrentData(models.Model): torrent = models.ForeignKey(Torrent,null=False) metafile = models.TextField(editable=False) description = models.TextField(null=True,blank=True) comment = models.TextField(null=True,blank=True) creator = models.CharField(max_length=128,null=True,blank=True) creator_date = models.DateTimeField(null=True,blank=True) private = models.BooleanField(default=False) encoding = models.CharField(max_length=16,null=True,blank=True) files = models.TextField(default="") files_count = models.PositiveIntegerField(default=0) files_size = models.PositiveIntegerField(default=0) pieces_size = models.PositiveIntegerField(default=0) pieces_count = models.PositiveIntegerField(default=0) created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True,blank=True) class Meta: verbose_name = "Torrent Data" verbose_name_plural = "Torrent Data" def __unicode__(self): return u"Torrent #" + unicode(self.torrent_id) ## -------------------------------------- ## TorrentSnapshot ## -------------------------------------- class TorrentSnapshot(models.Model): STATUS_QUEUED = "QU" STATUS_CHECKING = "CH" STATUS_CONNECTING = "CO" STATUS_META = "ME" STATUS_DOWNLOADING = "DO" STATUS_FINISHED = "FI" STATUS_SEEDING = "SE" STATUS_ALLOCATING = "AL" STATUS_TYPES = [ (STATUS_QUEUED, "Queued for Checking"), (STATUS_CHECKING, "Checking Files"), (STATUS_CONNECTING, "Connecting to Tracker"), (STATUS_META, "Downloading Metadata"), (STATUS_DOWNLOADING, "Downloading"), (STATUS_FINISHED, "Finished"), (STATUS_SEEDING, "Seeding"), (STATUS_ALLOCATING, "Allocating") ] torrent = models.ForeignKey(Torrent,null=False) tracker = models.ForeignKey(Tracker,null=False,default=None) collector = models.ForeignKey(Collector,null=False) status = models.CharField(max_length=2,null=True,blank=True,choices=STATUS_TYPES,default=None) num_peers = models.PositiveSmallIntegerField(default=0) num_complete = models.PositiveIntegerField(default=None,null=True,blank=True) num_incomplete = models.PositiveIntegerField(default=None,null=True,blank=True) num_seeds = models.PositiveSmallIntegerField(default=0) num_uploads = models.PositiveSmallIntegerField(default=0) num_connections = models.PositiveSmallIntegerField(default=0) distributed_copies = models.DecimalField(null=True, blank=True, max_digits=12, decimal_places=5) created = models.DateTimeField(auto_now_add=True) class Meta: unique_together = ( "torrent", "tracker", "created" ) verbose_name = "Torrent Snapshot" def debug(self): ret = unicode(self.torrent) + u":\n" ret += u" Created: " + unicode(self.created) + "\n" ret += u" Status: " + self.get_status_display() + "\n" ret += u" NumPeers: " + unicode(self.num_peers) + "\n" ret += u" NumComplete: " + unicode(self.num_complete) + "\n" ret += u" NumInComplete: " + unicode(self.num_incomplete) + "\n" ret += u" NumSeeds: " + unicode(self.num_seeds) + "\n" ret += u" NumConnections: " + unicode(self.num_connections) + "\n" ret += u" DistributedCopies: " + unicode(self.distributed_copies) return ret def __unicode__(self): return u"Torrent " + unicode(self.torrent.id) + u" @ " + unicode(self.created) def snapshots(self): from peers.models import PeerSnapshot return PeerSnapshot.objects.filter(torrent_snapshot__exact=self) snapshots.short_description = 'Peer Snapshots' def snapshots_link(self): return "View %d" % (self.id, len(self.snapshots())) snapshots_link.short_description = 'Peer Snapshots' snapshots_link.allow_tags = True