class Notification(models.Model): project = models.ForeignKey(Project, related_name='%(class)s_notifications') objects = RelatedProjectManager() class Meta: abstract = True
class Domain(models.Model): project = models.ForeignKey(Project, related_name='domains') domain = models.CharField(_('Domain'), unique=True, max_length=255, validators=[validate_domain_name]) machine = models.BooleanField(default=False, help_text=_('This Domain was auto-created')) cname = models.BooleanField( default=False, help_text=_('This Domain is a CNAME for the project')) canonical = models.BooleanField( default=False, help_text= _('This Domain is the primary one where the documentation is served from.' )) count = models.IntegerField( default=0, help_text=_('Number of times this domain has been hit.')) objects = RelatedProjectManager() class Meta: ordering = ('-canonical', '-machine', 'domain') def __unicode__(self): return "{domain} pointed at {project}".format( domain=self.domain, project=self.project.name) def save(self, *args, **kwargs): parsed = urlparse(self.domain) if parsed.scheme or parsed.netloc: self.domain = parsed.netloc else: self.domain = parsed.path super(Domain, self).save(*args, **kwargs)
class Build(models.Model): project = models.ForeignKey(Project, verbose_name=_('Project'), related_name='builds') version = models.ForeignKey(Version, verbose_name=_('Version'), null=True, related_name='builds') type = models.CharField(_('Type'), max_length=55, choices=BUILD_TYPES, default='html') state = models.CharField(_('State'), max_length=55, choices=BUILD_STATE, default='finished') date = models.DateTimeField(_('Date'), auto_now_add=True) success = models.BooleanField(_('Success'), default=True) setup = models.TextField(_('Setup'), null=True, blank=True) setup_error = models.TextField(_('Setup error'), null=True, blank=True) output = models.TextField(_('Output'), default='', blank=True) error = models.TextField(_('Error'), default='', blank=True) exit_code = models.IntegerField(_('Exit code'), null=True, blank=True) commit = models.CharField(_('Commit'), max_length=255, null=True, blank=True) length = models.IntegerField(_('Build Length'), null=True, blank=True) builder = models.CharField(_('Builder'), max_length=255, null=True, blank=True) # Manager objects = RelatedProjectManager() class Meta: ordering = ['-date'] get_latest_by = 'date' index_together = [ ['version', 'state', 'type'] ] def __unicode__(self): return ugettext(u"Build %(project)s for %(usernames)s (%(pk)s)" % { 'project': self.project, 'usernames': ' '.join(self.project.users.all() .values_list('username', flat=True)), 'pk': self.pk, }) @models.permalink def get_absolute_url(self): return ('builds_detail', [self.project.slug, self.pk]) @property def finished(self): '''Return if build has a finished state''' return self.state == BUILD_STATE_FINISHED
class Domain(models.Model): """A custom domain name for a project.""" project = models.ForeignKey(Project, related_name='domains') domain = models.CharField(_('Domain'), unique=True, max_length=255, validators=[validate_domain_name]) machine = models.BooleanField(default=False, help_text=_('This Domain was auto-created')) cname = models.BooleanField( default=False, help_text=_('This Domain is a CNAME for the project')) canonical = models.BooleanField( default=False, help_text= _('This Domain is the primary one where the documentation is served from.' )) https = models.BooleanField(_('Use HTTPS'), default=False, help_text=_('SSL is enabled for this domain')) count = models.IntegerField( default=0, help_text=_('Number of times this domain has been hit.')) objects = RelatedProjectManager() class Meta: ordering = ('-canonical', '-machine', 'domain') def __unicode__(self): return "{domain} pointed at {project}".format( domain=self.domain, project=self.project.name) def save(self, *args, **kwargs): from readthedocs.projects import tasks parsed = urlparse(self.domain) if parsed.scheme or parsed.netloc: self.domain = parsed.netloc else: self.domain = parsed.path super(Domain, self).save(*args, **kwargs) broadcast(type='app', task=tasks.symlink_domain, args=[self.project.pk, self.pk]) def delete(self, *args, **kwargs): from readthedocs.projects import tasks broadcast(type='app', task=tasks.symlink_domain, args=[self.project.pk, self.pk, True]) super(Domain, self).delete(*args, **kwargs)