+
+# http://stackoverflow.com/a/2680060/114435
+dthandler = lambda obj: obj.isoformat() if isinstance(obj, datetime.datetime) else None
+
+class Client(models.Model):
+ """
+ Model which refers to a service/application client. Client model contains
+ multiple ClientVersionSource to identify it's version downloads.
+ """
+ uid = models.CharField(max_length=255)
+ name = models.CharField(max_length=255)
+
+ def get_sources(self):
+ sources = {}
+ from cloudcms.clients import ClientVersions
+ for s in self.clientversionsource_set.all():
+ sources[s.os] = {'type': s.source_type,
+ 'args': [s.link]}
+
+ return ClientVersions(sources, cache_backend=cache)
+
+ def to_json(self):
+ return simplejson.dumps(list(self.get_sources().get_latest_versions()),
+ default=dthandler)
+
+ def get_default_os(self):
+ try:
+ return self.clientversionsource_set.filter(default=True)[0].os
+ except IndexError:
+ return self.clientversionsource_set.filter()[0].os
+
+ def __unicode__(self):
+ return self.name
+
+
+class ClientVersionSource(models.Model):
+ """
+ Client version source. source_type choices should map to
+ cloudcms.clients.SOURCE_TYPES.
+ """
+
+ default = models.BooleanField(default=True)
+ source_type = models.CharField(max_length=60,
+ choices=(('link','Link'),
+ ('direct','Direct'),
+ ('redmine_files','Redmine files')))
+ os = models.CharField(max_length=255)
+ link = models.CharField(max_length=255)
+ logo = MediaFileForeignKey(MediaFile, blank=True, null=True)
+ architecture = models.CharField(max_length=255, null=True, blank=True,
+ help_text="""Depending the source type this can be left empty and
+ let source type identify the architecture""")
+ client = models.ForeignKey(Client)
+ version_regex = models.CharField(max_length=255, help_text="""Regular expression to
+ match the version of the file based on retrieved source filenames
+ (used in redmine source types)""", null=True, blank=True)
+ file_regex = models.CharField(max_length=255, help_text="""Return only files that
+ match this expression""", null=True, blank=True)
+
+ def __unicode__(self):
+ return "[%s] %s" % (self.get_source_type_display(), self.os)
+
+