class Ressource(models.Model): """Model for representing a ressource""" album = models.ForeignKey(Album) related = models.ManyToManyField("self", blank=True) name = models.CharField(_('name'), max_length=250) description = models.TextField(_('description'), blank=True) image = FileBrowseField(_('image'), max_length=255, null=True, blank=True, default=None, help_text=_("Mainly used as a thumbnails")) file_type = models.IntegerField( _('file type'), choices=settings.PORTICUS_RESSOURCE_FILETYPE_CHOICES, default=settings.PORTICUS_RESSOURCE_FILETYPE_DEFAULT) file = FileBrowseField( _('file'), max_length=255, null=True, blank=True, default=None, help_text=_( "Mainly used for original size image or a file to download")) file_url = models.URLField( _('file url'), blank=True, help_text= _("Same meaning that 'file' attribute but for an external file to use instead" )) publish = models.BooleanField(_('published'), choices=PUBLISHED_CHOICES, default=True) priority = models.IntegerField(_('display priority'), default=100) creation_date = models.DateTimeField(_('creation date'), editable=False) slug = models.SlugField(_('slug'), max_length=100) tags = TagField(_('tags')) objects = models.Manager() published = RessourcePublishedManager() def __unicode__(self): return self.name def get_tags(self): return Tag.objects.get_for_object(self) def get_file_kind(self): return dict(settings.PORTICUS_RESSOURCE_FILETYPES)[self.file_type] @property def get_file(self): """ Main method to get the attached file without to search with file object and file_url """ fileobject = None if self.file: fileobject = self.file.url try: return self.file_url or fileobject except ValueError, AttributeError: return None
class Product(BaseModel): slug = models.SlugField(max_length=25, unique=True) title = models.CharField(max_length=255, verbose_name=_(u'Title')) #~ base content short_description = models.TextField(blank=True, verbose_name=_(u'Short description')) description = models.TextField(blank=True, verbose_name=_(u'Long description')) upc = models.CharField(null=True, max_length=30, verbose_name=_(u'Universal Product Code')) navimage = FileBrowseField("Navigation image", max_length=200, extensions=[".jpg", "png"], null=True) #~ external keys brand = models.ForeignKey(Brand, blank=True, null=True, on_delete=models.PROTECT, verbose_name=_(u'Brand')) category = TreeForeignKey(Category, related_name="products", verbose_name=_(u'Category')) #~ prices price = models.FloatField(null=True, blank=True, verbose_name=_(u'Price')) available = models.BooleanField(default=True, verbose_name=_(u'Available')) #~ extra info extra = JSONField(blank=True, verbose_name=_(u'Extra infos')) status = models.CharField(max_length=20, verbose_name=_(u'Status'), choices=STATUSES, default=STATUSES[1][0]) content_type = models.CharField(max_length=100, default="product", editable=False) url = models.CharField(max_length=255, null=True, blank=True) class Meta: verbose_name = _(u'Product') verbose_name_plural = _(u'Products') order_with_respect_to = 'category' def __str__(self): return self.title def get_absolute_url(self): index = reverse("category-index") url = index + "product/" + self.slug + "/" return url def update_routes(self): call_command('build_products_routes', verbosity=0) return def save(self, *args, **kwargs): self.url = self.get_absolute_url() self.update_routes() super(Product, self).save(*args, **kwargs) return def delete(self, *args, **kwargs): super(Product, self).delete(*args, **kwargs) self.update_routes() return
class FeaturedImage(models.Model): #image = models.ImageField (upload_to = 'images/customers/') #image2 = FilerImageField (null=True, blank=True) image = FileBrowseField(max_length=200, directory="images/", extensions=[".jpg", ".jpeg", ".png", ".gif"]) #, blank=True, null=True) link = models.CharField( max_length=100, help_text="Product or page to link to - relative links OK") title = models.CharField(max_length=100, blank=True, help_text="Mouseover title - optional") caption = models.CharField( max_length=100, blank=True, help_text= "Image / Slide caption - optional, shown across bottom of image, such as <h2>My Caption</h2>" ) #html_overlay = models.TextField (blank=True, help_text="HTML / Text overlay over image - optional") product = models.ForeignKey( Product, null=True, blank=True, help_text= 'Product the featured image is talking about, optional, can use caption instead' ) sortorder = models.IntegerField( default=100, help_text="Default order the slideshow is shown in") created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True) published = models.BooleanField(default=True) objects = PublishedManager() def __unicode__(self): return self.caption or self.title or self.image.url class Meta: ordering = ["sortorder"] def as_img(self): if trace: print self kw = dict( src=self.image.url, #d='#featured_%s' % self.id, alt=self.caption, title=self.title, data_link=self.link, ) kw['data-link'] = kw.pop('data_link') return mark_safe(tags.img(**kw)) # return mark_safe ('<img src="%s" alt="%s" title="%s" data-link="%s"/>' % (self.image.url, self.caption, self.title, self.link)) # tagstream / TagGen? def as_caption(self): rslt = tags.span(self.caption, cls='orbit-caption', d='featured_caption_%s' % self.id) if self.caption else '' return mark_safe(rslt) def as_content(self): kw = dict(cls='content', d='#featured_%s' % self.id) if self.caption: kw['data-caption'] = '#featured_caption_%s' % self.id rslt = tags.div(tags.a(self.as_img(), href=self.link), **kw) return mark_safe(rslt)
class Club(models.Model): name = models.CharField(max_length=50) logo = FileBrowseField(max_length=500, default="base/team_placeholder.png", directory="/") founded = models.CharField(max_length=4, blank=True, help_text="Year in YYYY format") website = models.URLField(blank=True) facebook = models.URLField(blank=True) instagram = models.URLField(blank=True) # If Venue is deleted -> disallow and protect the club. Has to # delete the Venue first. venue = models.ForeignKey("Venue", on_delete=models.PROTECT, blank=True, null=True) lat = models.DecimalField(max_digits=22, decimal_places=16, blank=True, null=True) lng = models.DecimalField(max_digits=22, decimal_places=16, blank=True, null=True) token = models.CharField(max_length=6, default=generate_uuidv4) @property def home_matches(self): return Match.objects.filter(home_team=self) @property def away_matches(self): return Match.objects.filter(away_team=self) @property def matches_won(self): as_home = self.home_matches.filter( home_touchdowns__gt=models.F("away_touchdowns")).count() as_away = self.away_matches.filter( away_touchdowns__gt=models.F("home_touchdowns")).count() return as_home + as_away @property def matches_lost(self): as_home = self.home_matches.filter( away_touchdowns__gt=models.F("home_touchdowns")).count() as_away = self.away_matches.filter( home_touchdowns__gt=models.F("away_touchdowns")).count() return as_home + as_away @property def matches_tied(self): as_home = self.home_matches.filter( away_touchdowns=models.F("home_touchdowns")).count() as_away = self.away_matches.filter( home_touchdowns=models.F("away_touchdowns")).count() return as_home + as_away @property def form(self): return 1 @property def avg_touchdowns_scored(self): as_home_agg = self.home_matches.aggregate( avg_td=Coalesce(Avg("home_touchdowns"), V(0))) as_away_agg = self.away_matches.aggregate( avg_td=Coalesce(Avg("away_touchdowns"), V(0))) return round(as_home_agg["avg_td"] + as_away_agg["avg_td"], 2) @property def avg_touchdowns_conceded(self): as_home_agg = self.home_matches.aggregate( avg_td=Coalesce(Avg("away_touchdowns"), V(0))) as_away_agg = self.away_matches.aggregate( avg_td=Coalesce(Avg("home_touchdowns"), V(0))) return round(as_home_agg["avg_td"] + as_away_agg["avg_td"], 2) def __str__(self): return self.name class Meta: ordering = ['name']
class Account(AbstractUser): RELATIONSHIP_CHOICES = ( ('O', 'Other'), ('A', 'Accounting'), ('AA', 'Airlines/Aviation'), ('ADR', 'Alternative Dispute Resolution'), ) INDUSTRY_CHOICES = ( ('S', 'Single'), ('O', 'Other'), ('A', 'Analyst'), ('BA', 'Business Analyst'), ('BTA', 'Business Technology Analyst'), ('S', 'Student'), ('F', "Founder/Co-Founder"), ) FUNCTION_CHOICES = ( ('A', 'Accounting'), ('B', 'Business'), ('M', 'Married'), ('D', 'Divorced'), ('W', 'Widowed'), ('C', "It's complicated"), ) active = models.BooleanField() date_of_birth = models.DateField(blank=True, null=True) marital_status = models.CharField(max_length=1, default='S', choices=RELATIONSHIP_CHOICES) kids = models.IntegerField(default=0) dp = FileBrowseField("Image", max_length=200, extensions=[".jpg", ".png", ".gif"], blank=True, null=True) educations = models.ManyToManyField('accounts.Organization', through='Education', related_name='mi_education') experiences = models.ManyToManyField('accounts.Organization', through='Experience', related_name='mi_experience') activities = TaggableManager(through='TaggedActivity') awards = TaggableManager(through='TaggedAward') certifications = TaggableManager(through='TaggedCertification') interests = TaggableManager(through='TaggedInterest') languages = TaggableManager(through='TaggedLanguage') skills = TaggableManager(through='TaggedSkill') origin_country = models.CharField(max_length=50, blank=True, null=True) origin_city = models.CharField(max_length=50, blank=True, null=True) current_country = models.CharField(max_length=50, blank=True, null=True) current_city = models.CharField(max_length=50, blank=True, null=True) industry = models.CharField(max_length=4, default='O', choices=INDUSTRY_CHOICES) function = models.CharField(max_length=4, default='O', choices=FUNCTION_CHOICES) objective = models.TextField( default="Put your educational or career goal here!") headline = models.TextField(default="Tell us a little bit about yourself!") unread = models.IntegerField(blank=True, null=True) supporters = models.ManyToManyField('self', through='Supporter', symmetrical=False, blank=True, null=True) purchases = models.ManyToManyField('campaigns.Campaign', through='transactions.Transaction', related_name='purchase', blank=True, null=True) def __unicode__(self): return u'%s' % (self.first_name + ' ' + self.last_name)
class Event(CoreModel): """ Evento """ EVENT_IMAGE_PATH = "eventos/evento/" event_active = models.CharField(verbose_name=_(u"Ativar Evento"), max_length=1, choices=CHOICE_ACTIVE, default=ACTIVE, blank=False) event_title_menu = models.CharField( verbose_name=_(u"Título do Evento para o Menu"), max_length=255, blank=False, null=False, help_text= _(u"Título que vai no link à esquerda no Menu do Topo. Máximo 255 caracteres. Ex: Congresso" )) event_description_short = models.CharField( verbose_name=_(u"Descrição curta"), max_length=255, blank=False, null=False, help_text= _(u"Descrição curta para Buscadores e Redes sociais. Ex: Congresso Escoteiro Regional 2015" )) event_url = models.SlugField( verbose_name=_(u"Nome da URL do Evento"), unique=True, max_length=255, blank=False, null=False, help_text=_(u"Nome do link, ex: congresso-2015")) event_logo = FileBrowseField( verbose_name=_(u"Cabeçalho Logo"), directory=EVENT_IMAGE_PATH, max_length=200, blank=True, null=True, help_text= _(u"Para não distorcer e manter a responsividade, envie uma imagem com resolução de 300x300px." )) event_title = RichTextField(verbose_name=_(u"Cabeçalho Título"), blank=True, config_name='description') event_image_background = FileBrowseField( verbose_name=_(u"Cabeçalho Imagem de Fundo"), directory=EVENT_IMAGE_PATH, max_length=200, blank=True, null=True, help_text= _(u"Para não distorcer, envie uma imagem com resolução máxima de 2362x591px." )) event_social_image = FileBrowseField( verbose_name=_(u"Imagem para Redes Sociais"), directory=EVENT_IMAGE_PATH, max_length=200, blank=True, null=True, help_text= _(u"Imagem para exibir em links de Redes Sociais, como Facebook. Para imagem retangular envie em 600x315, para imagem quadrada envie em 200x200. Ou formatos maiores sempre mantendo a proporção." )) information_active = models.CharField( verbose_name=_(u"Exibir Bloco Informações"), max_length=1, choices=CHOICE_ACTIVE, default=ACTIVE, blank=False) information_title = RichTextField(verbose_name=_(u"Informações Título"), config_name='title', null=True, blank=True) information_text = RichTextField(verbose_name=_(u"Informações Texto"), config_name='description', null=True, blank=True) local_active = models.CharField(verbose_name=_(u"Exibir Bloco Local"), max_length=1, choices=CHOICE_ACTIVE, default=ACTIVE, blank=False) local_maps_name = models.CharField( verbose_name=_(u"Local no Maps"), max_length=500, blank=True, help_text=_(u"Nome do Local no Google Maps.")) local_title = RichTextField(verbose_name=_(u"Local Título"), config_name='title', null=True, blank=True) local_text = RichTextField(verbose_name=_(u"Local Texto"), blank=True, config_name='description') observation_active = models.CharField( verbose_name=_(u"Exibir Bloco Observações"), max_length=1, choices=CHOICE_ACTIVE, default=ACTIVE, blank=False) observation_title = RichTextField(verbose_name=_(u"Observações Título"), config_name='title', null=True, blank=True) observation_text = RichTextField(verbose_name=_(u"Observações Texto"), blank=True, config_name='description') list_events_active = models.CharField( verbose_name=_(u"Ativar Lista de Eventos"), max_length=1, choices=CHOICE_ACTIVE, default=ACTIVE, blank=False) list_events_title = RichTextField( verbose_name=_(u"Lista de Eventos Título"), config_name='title', null=True, blank=True) list_programations_active = models.CharField( verbose_name=_(u"Ativar Lista de Programações"), max_length=1, choices=CHOICE_ACTIVE, default=ACTIVE, blank=False) list_programations_title = RichTextField( verbose_name=_(u"Lista de Programações Título"), config_name='title', null=True, blank=True) class Meta: ordering = ["event_active"] db_table = "event_homepage" verbose_name = _(u"Evento") verbose_name_plural = _(u"Eventos") def __unicode__(self): text = strip_tags(self.event_title) if len(text) > 50: text = "%s..." % text[0:50] else: text = "%s" % text return mark_safe(text) def get_text(valor): return mark_safe(strip_tags(valor)) def get_absolute_url(self): """ URL absoluta do Evento """ return reverse('events:event-homepage', args=(self.event_url, )) def get_url_preview(self): return reverse('events:event-preview', args=(self.event_url, )) def get_link_preview(self): return '<a href="%s" target="_blank">%s</a>' % (reverse( 'events:event-preview', args=(self.event_url, )), unicode(_(u"Pré-visualizar"))) def duplicate_save(self): obj_new = deepcopy(self) obj_new.id = None obj_new.event_title += "Cópia de %s" % (obj_new.event_title) obj_new.homepage_active = INACTIVE obj_new.save() return obj_new def is_information_active(self): if self.information_active == ACTIVE: return True else: return False def is_local_active(self): if self.local_active == ACTIVE: return True else: return False def is_observation_active(self): if self.observation_active == ACTIVE: return True else: return False def is_list_programations_active(self): if self.list_programations_active == ACTIVE: return True else: return False def get_event_logo(self): """ retorna o caminho do logo do evento para montar a URL """ if self.event_logo: return "%s/%s" % (settings.MEDIA_URL, self.event_logo) else: return False def get_event_image_background(self): if self.event_image_background: return "%s/%s" % (settings.MEDIA_URL, self.event_image_background) else: return os.path.join(settings.STATIC_URL, 'campotec', 'img', 'header.jpg') def get_event_social_image(self): """ retorna o caminho do logo do evento para montar a URL """ if self.event_logo: return "%s/%s" % (settings.MEDIA_URL, self.event_social_image) else: return '' def get_programation_list(self): """ Busca apenas as programacoes ATIVAS do evento """ return self.eventprogramation_set.filter( active=ACTIVE).order_by('date_time')
class BannerHome(models.Model): SECAO_CHOICES = (('banner_principal', 'Banner principal'), ('banner_729x90', 'Banner 729x90'), ('banner_729x90_1', 'Banner 729x90 2'), ('banner_337x280', 'Banner 337x280'), ('banner_300x400', 'Banner 300x400'), ('banner_729x90_footer', 'Banner 729x90 footer')) URL_EXTERNA = ( ('sim', 'sim'), ('nao', 'não'), ) secretaria = models.CharField(verbose_name='secretaria', max_length=60, choices=SECRETARIA_CHOICES, default='administracao') titulo = models.CharField(verbose_name='Titulo', max_length=250) slug = models.SlugField(verbose_name='URL (slug)', unique=True, max_length=250) texto = models.TextField(blank=True, null=True) publicacao = models.DateTimeField(verbose_name='publicação', auto_now_add=True) banner = FileBrowseField( verbose_name="banner", max_length=80, directory="videos/", blank=True, null=True, help_text="utilize o tamanho do banner de acordo com a seção") status = models.CharField(verbose_name='status', max_length=11, choices=STATUS_CHOICES, default='rascunho') url_externa = models.CharField(verbose_name='url externa?', max_length=3, choices=URL_EXTERNA, default='nao') secao = models.CharField(verbose_name='seção', choices=SECAO_CHOICES, max_length=20) url = models.URLField(verbose_name='URL', blank=True, null=True) objects = models.Manager() publicado = Gerenciador() def get_absolute_url(self): return reverse("home:banner_detalhe", kwargs={"slug": self.slug}) def save(self, *args, **kwargs): if self.slug == '': self.slug = slugify(self.titulo) super(BannerHome, self).save(*args, **kwargs) class Meta: db_table = 'tb_home_banner' verbose_name = 'Banner da home' verbose_name_plural = 'Banners da home' ordering = ['-publicacao'] get_latest_by = 'publicacao' def __str__(self): return self.titulo
def test_model_field(self): f = FileBrowseField() self.assertEqual(f.db_parameters(connection)['type'], 'varchar(200)')
class SliderPhoto(models.Model): """ Store sliders photos """ slider = models.ForeignKey(Slider) if IS_FILEBROWSER: image = FileBrowseField("Image", max_length=255, extensions=('.jpg', '.png'), null=True, blank=True) else: image = models.ImageField(upload_to='sliders/%Y/%m/%d', null=True, blank=True) video = models.CharField(_('Video'), max_length=255, null=True, blank=True) title = models.CharField(_('Title'), max_length=255, null=True, blank=True) description = models.TextField(_('Description'), null=True, blank=True) links_to = models.CharField(_('Links To'), null=True, blank=True, max_length=255) content_type = models.ForeignKey( ContentType, null=True, blank=True, limit_choices_to=consts.SLIDE_CONTENT_TYPES, related_name='content_type') object_id = models.IntegerField(_('Object ID'), null=True, blank=True) content_object = generic.GenericForeignKey('content_type', 'object_id') is_active = models.BooleanField(_('Is active'), default=True) active_from = models.DateTimeField(null=True, blank=True) active_to = models.DateTimeField(null=True, blank=True) order = models.IntegerField(_('Order'), default=0) css_class = models.CharField(_('Css class'), null=True, blank=True, choices=consts.SLIDE_CSS_CLASSES, max_length=50) objects = SliderPhotoManager() class Meta: verbose_name = _('Slider photo') verbose_name_plural = _('Slider photos') ordering = ('order', ) def __unicode__(self): return self.get_title() def get_title(self): return self.title or self.get_from_content_object('title') def get_image(self): return self.image or self.get_from_content_object('image') def get_video(self): return self.video or self.get_from_content_object('video') def get_description(self): return self.description or self.get_from_content_object('description') def get_absolute_url(self): if self.links_to: return self.links_to if self.content_object: return self.content_object.get_absolute_url() return '#' def get_from_content_object(self, field): if self.content_type: mapping_key = '%s.%s' % self.content_type.natural_key() mapping = consts.SLIDE_FIELDS_MAPPING.get(mapping_key) if mapping: field = mapping[field] return getattr(self.content_object, field, None) else: return getattr(self, field)
class Cursos(AuditableModel, SlugModel): relacion = models.ForeignKey( "self", related_name="cursos_relacionados", null=True, blank=True, help_text='los cursos que tengan este campo vació apareceran \ por defecto. los demas cursos deberan ser relacionados con su respectivo \ representante') categoria = models.ForeignKey(CursosCategorias) # rubro = models.ManyToManyField(Rubros, blank=True) # idiomas = models.ManyToManyField(Idiomas, blank=True) rubro = ChainedManyToManyField(Rubros, chained_field="categoria", chained_model_field="categoria") idiomas = ChainedManyToManyField(Idiomas, chained_field="categoria", chained_model_field="categoria") posicion = models.PositiveIntegerField("Posición", default=1) nombre = models.CharField('Nombre', max_length=256) nombre_complex = models.CharField( 'Nombre', max_length=256, help_text='encierre el texto a resaltar con < >') img = FileBrowseField('Imágen de Curso', max_length=200, directory='cursos/', extensions=['.jpg', '.png']) #Categorización de_interes = models.BooleanField("Curso de interes", default=False) nuevo = models.BooleanField("Nuevo", default=False) online = models.BooleanField("Online", default=False) classroom = models.BooleanField("Classroom", default=False) webcast = models.BooleanField("Live WebCast", default=False) #Información inicio = models.DateField("Fecha de inicio", default=date.today) descript = RichTextField(config_name='small', verbose_name='Descripción') yt_img_usage = models.BooleanField( "Usar miniatura del Youtube como imagen de curso", default=False) video = models.URLField("Video de Youtube", max_length=1024, blank=True) video_id = models.CharField("Video de Youtube", max_length=1024, blank=True) vimeo = models.URLField("Video de Vimeo", max_length=1024, blank=True) vimeo_id = models.CharField("ID de Vimeo", max_length=50, blank=True, null=True) archivo = models.FileField('Brochure', upload_to='brochures/%Y/%m/%d/', blank=True) fechas = models.CharField("Fechas", max_length=256) horarios = models.CharField("Horarios", max_length=256) lugar = models.CharField("Lugar", max_length=256) inversion = models.CharField("Inversión", max_length=256) #Meotodología y Docentes mt_show = models.BooleanField("Mostrar Metodología", default=True) mt_titulo = models.CharField("Título de Metodología", max_length=64, help_text='NUESTRA <METODOLOGIA>', blank=True) mt_descript = RichTextField(config_name='small', verbose_name='Meotodología', blank=True) dc_titulo = models.CharField("Título de Docentes", max_length=64, help_text='NUESTROS <DOCENTES>', blank=True) dc_descript = RichTextField(config_name='small', verbose_name='Docentes', blank=True) #Inversión iv_show = models.BooleanField("Mostrar inversión", default=True) iv_descript = RichTextField(config_name='small', verbose_name='Descripción de Inversión', blank=True) iv_tabla = RichTextField(config_name='default', verbose_name='Tabla de Inversión', blank=True, default=tabla_def) iv_descript_pie = RichTextField(config_name='small', verbose_name='Pie de tabla de Inversión', blank=True) #Demo dm_show = models.BooleanField("Mostrar Demo", default=True) dm_titulo = models.CharField("Título", max_length=64, help_text='COURSE <DEMO QUIZ>', blank=True) dm_descript = RichTextField(config_name='small', verbose_name='Descripción de Demo', blank=True) dm_video = models.URLField("Video de Youtube", max_length=1024, blank=True) dm_video_id = models.CharField("ID Video de Youtube", max_length=1024, blank=True) #PayInfo cod = models.CharField("Codigo de curso", max_length=32, blank=True) # precio = models.PositiveIntegerField("Precio de curso", default=69) precio = models.DecimalField("Precio", max_digits=6, decimal_places=2, default=69) token = models.CharField('Token', blank=True, max_length=32) class Meta: verbose_name = u'curso' verbose_name_plural = u'Cursos' ordering = ['posicion'] def getImg(self): if self.yt_img_usage and self.video_id: return 'https://img.youtube.com/vi/{0}/hqdefault.jpg'.format( self.video_id, ) elif self.img: return self.img.url else: return '' def getDemoImg(self): if self.dm_video and self.dm_video_id: return 'https://img.youtube.com/vi/{0}/hqdefault.jpg'.format( self.video_id, ) elif self.img: return self.img.url else: return '' def getModalidad(self): response = '' if self.online: response += ' Online' if self.classroom: response += ' Classroom' if self.webcast: response += ' Live WebCast' return response def getIdiomas(self): arr = [] for row in self.idiomas.all(): arr.append(row.nombre) return ', '.join(arr, ) def getRubros(self): arr = [] for row in self.rubro.all(): arr.append(row.nombre) return ', '.join(arr, ) def save(self, *args, **kwargs): import re if self.video: self.video_id = wYoutubeGetID(self.video_id, self.video) print self.video_id else: self.video_id = '' if self.dm_video: self.dm_video_id = wYoutubeGetID(self.dm_video_id, self.dm_video) print self.dm_video_id else: self.dm_video_id = '' if not self.cod: self.cod = str(uuid4())[:8] if not self.token: self.token = str(uuid4())[:20] if self.vimeo: self.vimeo_id = re.search( r'^(https://)?(www\.)?(vimeo\.com/)?(\d+)', self.vimeo).group(4) else: self.vimeo_id = '' super(Cursos, self).save(*args, **kwargs) def getContenidos(self): return Contenidos.objects.active().filter( curso=self).order_by('posicion') def getBeneficios(self): return Beneficios.objects.active().filter( curso=self).order_by('posicion') def getProfesores(self): return Profesores.objects.active().filter( cursos=self).order_by('posicion') def __unicode__(self): return u'{0}'.format(self.nombre, )
class Event(models.Model): fb_image = FileBrowseField("Immagine", max_length=200, directory="events/", extensions=[".jpg", ".png", ".jpeg", ".gif", ".tif", ".tiff"], null=True, blank=True) carousel = StreamField(model_list=[ LandscapeGallery, ], null=True, blank=True, verbose_name="Galleria", help_text="Una sola galleria, per favore, larghezza minima immagini 2048px") title = models.CharField('Titolo', help_text="Il titolo dell'evento", max_length = 50) slug = models.SlugField(max_length=50, editable=False, null=True) date = models.DateTimeField('Quando', default = now) last_updated = models.DateTimeField(editable=False, null=True) location = models.ForeignKey(Location, on_delete=models.SET_NULL, null = True, verbose_name = 'Dove', ) intro = models.CharField('Introduzione', default = 'Un altro appuntamento con RP!', max_length = 100) stream = StreamField(model_list=[ IndexedParagraph, CaptionedImage, Gallery, DownloadableFile, LinkableList, BoxedText, ], verbose_name="Lancio") upgrade_stream = StreamField(model_list=[ EventUpgrade, IndexedParagraph, DownloadableFile, ], verbose_name="Aggiornamenti") chron_stream = StreamField(model_list=[ IndexedParagraph, CaptionedImage, Gallery, DownloadableFile, LinkableList, BoxedText], verbose_name="Cronaca") restr_stream = StreamField(model_list=[ IndexedParagraph, CaptionedImage, Gallery, DownloadableFile, LinkableList, BoxedText], verbose_name="Area riservata", help_text="Inserisci qui materiale riservato ai soci",) manager = models.ForeignKey(User, on_delete=models.SET_NULL, blank= True, null=True, verbose_name = 'Responsabile') tags = TaggableManager(verbose_name="Categorie", help_text="Lista di categorie separate da virgole", through=None, blank=True) notice = models.CharField(max_length = 4, choices = NOTICE, blank = True, null = True, verbose_name = 'Notifica via email', help_text = """Non invia in automatico, per farlo seleziona l'Evento dalla Lista degli Eventi, imposta l'azione 'Invia notifica' e fai clic su 'Vai'. """) def get_badge_color(self): if self.date.date() > datetime.today().date(): return 'success' elif self.date.date() < datetime.today().date(): return 'secondary' else: return 'warning' def get_image(self): if self.fb_image: return self.fb_image elif self.location.fb_image: return self.location.fb_image return def get_tags(self): return list(self.tags.names()) def get_upgrades(self): return EventUpgrade.objects.filter(event_id=self.id) def get_chronicle(self): if self.date.date() < datetime.today().date(): return True return False def get_uploads(self): return UserUpload.objects.filter(event_id=self.id) def get_path(self): return '/calendario/' + self.date.strftime("%Y/%m/%d") + '/' + self.slug def save(self, *args, **kwargs): if not self.slug: self.slug = generate_unique_slug(Event, self.title) if not self.notice: self.notice = 'SPAM' self.last_updated = now() super(Event, self).save(*args, **kwargs) #update parent_type end parent_id in IndexedParagraph streamblocks type = ContentType.objects.get(app_label='pagine', model='event').id id = self.id stream_list = self.stream.from_json() update_indexed_paragraphs(stream_list, type, id) stream_list = self.upgrade_stream.from_json() update_indexed_paragraphs(stream_list, type, id) stream_list = self.chron_stream.from_json() update_indexed_paragraphs(stream_list, type, id) stream_list = self.restr_stream.from_json() update_indexed_paragraphs(stream_list, type, id) def __str__(self): return self.title class Meta: verbose_name = 'Evento' verbose_name_plural = 'Eventi' ordering = ('-date', )
class SoundcloudTrack(models.Model): """ Soundcloud track model - all these fields have been lifted as is from http://developers.soundcloud.com/docs/api/reference#tracks and then amended to a suitable django model with a quick bit of multiline editing in SublimeText. Note that the resources returned from the current Soundcloud python API do not have all fields so where they dont exist they've been removed and left out of the model definition & syncing. """ id = models.IntegerField(primary_key=True) artwork_url = models.URLField(max_length=255, blank=True) bpm = models.CharField(max_length=255, blank=True) comment_count = models.IntegerField(max_length=255, blank=True, null=True) commentable = models.BooleanField(default=True) created_at = models.DateTimeField(max_length=255, blank=True, null=True) description = models.TextField(blank=True) download_count = models.IntegerField(max_length=255, blank=True, null=True) download_url = models.URLField(max_length=255, blank=True) downloadable = models.BooleanField(default=True) duration = models.CharField(max_length=255, blank=True) embeddable_by = models.CharField(max_length=255, blank=True) favoritings_count = models.IntegerField(max_length=255, blank=True, null=True) genre = models.CharField(max_length=255, blank=True) isrc = models.CharField(max_length=255, blank=True) key_signature = models.CharField(max_length=255, blank=True) label_id = models.IntegerField(max_length=255, blank=True, null=True) label_name = models.CharField(max_length=255, blank=True) license = models.CharField(max_length=255, blank=True) original_content_size = models.IntegerField(max_length=255, blank=True, null=True) original_format = models.CharField(max_length=255, blank=True) permalink = models.CharField(max_length=255, blank=True) permalink_url = models.URLField(max_length=255, blank=True) playback_count = models.IntegerField(max_length=255, blank=True, null=True) purchase_url = models.URLField(max_length=255, blank=True) release = models.CharField(max_length=255, blank=True) release_day = models.CharField(max_length=255, blank=True) release_month = models.CharField(max_length=255, blank=True) release_year = models.CharField(max_length=255, blank=True) sharing = models.CharField(max_length=255, blank=True) state = models.CharField(max_length=255, blank=True) stream_url = models.URLField(max_length=255, blank=True) streamable = models.BooleanField(default=True) tag_list = models.CharField(max_length=255, blank=True) title = models.CharField(max_length=255, blank=True) track_type = models.CharField(max_length=255, blank=True) uri = models.CharField(max_length=255, blank=True) user_id = models.IntegerField(max_length=255, blank=True, null=True) user_name = models.CharField(max_length=255, blank=True) user_permalink = models.CharField(max_length=255, blank=True) user_permalink_url = models.URLField(max_length=255, blank=True) user_uri = models.URLField(max_length=255, blank=True) user_avatar = models.CharField(max_length=255, blank=True) user_favorite = models.CharField(max_length=255, blank=True) video_url = models.URLField(max_length=255, blank=True) waveform_url = models.URLField(max_length=255, blank=True) # Add an image field that we will be using to populate with a cached # filebrowser bound image image = FileBrowseField(directory='soundcloud/', format='image', max_length=5096, blank=True, null=True) # And add in our usual other timestamps we use modified_at = models.DateTimeField(null=True, blank=True) modified_at.help_text = 'Last modification time for this track (sync-side)' synced_at = models.DateTimeField(null=True, blank=True) synced_at.help_text = 'The last time a sync was ran against this track' # Custom managers top = MostPlayedManager() recent = MostRecentManager() class Meta: ordering = ('-created_at', ) @property def body(self): if self.custom_description != '': return self.custom_description return self.description def __unicode__(self): return '%s (%s)' % (self.title, self.id) def get_absolute_url(self): return reverse('soundcloud:detail', kwargs={'slug': self.permalink})
class Invoice(models.Model): author = models.ForeignKey(Author, on_delete=models.CASCADE) invoice_num = models.IntegerField(default=0) # Fields whose default values are taken from Author identification = models.CharField(max_length=20, blank=True, help_text="SA ID, passport or some form " "of official identification") dob = models.DateField(blank=True, null=True, verbose_name="date of birth", help_text="Required by SARS") address = models.TextField(blank=True, help_text="Required by SARS") bank_name = models.CharField(max_length=20, blank=True) bank_account_number = models.CharField(max_length=20, verbose_name="account", blank=True) bank_account_type = models.CharField(max_length=20, verbose_name="account type", default="CURRENT") bank_branch_name = models.CharField(max_length=20, blank=True, verbose_name="branch name", help_text="Unnecessary for Capitec, " "FNB, Standard, Nedbank and Absa") bank_branch_code = models.CharField(max_length=20, blank=True, verbose_name="branch code", help_text="Unnecessary for Capitec, " "FNB, Standard, Nedbank and Absa") swift_code = models.CharField(max_length=12, blank=True, help_text="Only relevant for banks " "outside SA") iban = models.CharField(max_length=34, blank=True, help_text="Only relevant for banks outside SA") tax_no = models.CharField(max_length=50, blank=True, verbose_name="tax number", help_text="Necessary for SARS.") tax_percent = models.DecimalField(max_digits=2, decimal_places=0, default=25, verbose_name="PAYE %", help_text="Unless you have " "a tax directive " "we have to deduct 25% PAYE") vat = models.DecimalField(max_digits=2, decimal_places=0, default=0, verbose_name="VAT %", help_text="If you are VAT registered " "set this to 15 else leave at 0") level = models.CharField(max_length=15, choices=LEVEL_CHOICES, default='standard') #### # paid = models.BooleanField(default=False) amount_paid = models.DecimalField(max_digits=8, decimal_places=2, default=0.00, verbose_name="amount") tax_paid = models.DecimalField(max_digits=8, decimal_places=2, default=0.00) vat_paid = models.DecimalField(max_digits=8, decimal_places=2, default=0.00) invoice = FileBrowseField(max_length=200, directory="commissions/invoices/", blank=True, extensions=EXTENSIONS) proof = FileBrowseField(max_length=200, directory="commissions/proofs/", blank=True, extensions=EXTENSIONS) status = models.CharField(max_length=2, choices=INVOICE_STATUS_CHOICES, default="-") notes = models.TextField(blank=True) query = models.TextField(blank=True, max_length=3000, help_text="Explain your query " "here if you have one") date_time_reporter_approved = models.DateTimeField(null=True, blank=True, editable=False) date_time_editor_approved = models.DateTimeField(null=True, blank=True, editable=False) date_time_processed = models.DateTimeField(null=True, blank=True, editable=False) date_notified_payment = models.DateTimeField(null=True, blank=True, editable=False) our_reference = models.CharField(max_length=20, blank=True) their_reference = models.CharField(max_length=20, blank=True) created = models.DateTimeField(auto_now_add=True, editable=False) modified = models.DateTimeField(auto_now=True, editable=False) def calc_payment(self): commissions = Commission.objects.for_authors().\ filter(invoice=self) total_uncorrected = Decimal(0.00) total_paid = Decimal(0.00) total_tax = Decimal(0.00) total_vat = Decimal(0.00) for commission in commissions: (due, vat, tax, uncorrected) = commission.calc_payment() total_paid = total_paid + due total_vat = total_vat + vat total_tax = total_tax + tax total_uncorrected = total_uncorrected + uncorrected self.amount_paid = total_paid self.vat_paid = total_vat self.tax_paid = total_tax return ( self.amount_paid, self.vat_paid, self.tax_paid, total_uncorrected, ) def quick_calc_payment(self): if self.status >= "4": return (self.amount_paid, self.vat_paid, self.tax_paid, self.amount_paid - self.vat_paid + self.tax_paid) else: return self.calc_payment() def __str__(self): return str(self.author.pk) + "-" + str(self.invoice_num) + " - " + \ str(self.author) + " - " + self.get_status_display() def get_absolute_url(self): return reverse('payments:invoice.detail', args=[self.author.pk, self.invoice_num]) def short_string(self): return str(self.author.pk) + "-" + str(self.invoice_num) def save(self, *args, **kwargs): if self.status == "2": # Reporter has approved if self.date_time_reporter_approved is None: self.date_time_reporter_approved = timezone.now() if self.status == "3": # Editor has approved if self.date_time_editor_approved is None: self.date_time_editor_approved = timezone.now() if self.status == "4": # Invoice has been paid if self.date_time_processed is None: self.date_time_processed = timezone.now() self.calc_payment() super(Invoice, self).save(*args, **kwargs) set_corresponding_vals(self, self.author) self.author.save() @staticmethod def create_invoice(author): max_invoice = Invoice.objects.filter(author=author).\ aggregate(Max('invoice_num')) if max_invoice["invoice_num__max"] is None: invoice_num = 1 else: invoice_num = max_invoice["invoice_num__max"] + 1 invoice = Invoice() invoice.author = author invoice.invoice_num = invoice_num set_corresponding_vals(author, invoice) invoice.save() return invoice @staticmethod def get_open_invoice_for_author(author): invoices = Invoice.objects.filter(author=author).\ filter(status__lte="0") if len(invoices) == 0: invoice = Invoice.create_invoice(author) else: invoice = invoices[0] if invoice.status == "0": invoice.status = "-" invoice.save() return invoice class Meta: ordering = [ 'status', '-modified', ] unique_together = [ 'author', 'invoice_num', ]
class MagazineIssue(models.Model): """ A Magazine Issue """ magazine = models.ForeignKey(Magazine) issue_name = models.CharField(blank=True, null=True, max_length=255) slug = models.SlugField(blank=False, editable=False, max_length=250, null=False, unique=True) issue_date = models.DateField(blank=True, editable=False, null=True) issue_number = models.PositiveIntegerField(blank=True, null=True) issue_volume = models.PositiveIntegerField(blank=True, null=True) issue_month = models.CharField(blank=True, choices=MONTHS, max_length=100, null=True) issue_year = models.CharField(blank=True, choices=YEARS, max_length=10, null=True) cover_image = FileBrowseField("Issue cover", blank=True, directory="covers", max_length=250, null=True) class Meta: order_with_respect_to = 'magazine' ordering = [ 'magazine', '-issue_year', '-issue_number', ] # unique_together = [ 'issue_year', issue_name] def __unicode__(self): display_name_fields = [ self.magazine.title, self.issue_name, self.issue_month, self._next_month, self.issue_year ] display_name_values = [] for display_name_field in display_name_fields: if display_name_field: display_name_values.append(display_name_field) return u'%s' % (' '.join(display_name_values)) @property def _next_month(self): if self.magazine.is_bimonthly: try: index = MONTHS.index((self.issue_month, self.issue_month)) except: return None else: if index == (len(MONTHS) - 1): return MONTHS[0][0] else: return MONTHS[index + 1][0] else: return None @property def _display_month(self): if self._next_month: return u'%s/%s' % (self.issue_month, self._next_month) else: self.issue_month def save(self, *args, **kwargs): if not self.id: if self.issue_name: sluggable_string = self.issue_name else: sluggable_fields = [ self.magazine.title, self.issue_month, self._next_month, self.issue_year, self.issue_number ] sluggable_string_values = [] for sluggable_field in sluggable_fields: if sluggable_field: sluggable_string_values.append(sluggable_field) sluggable_string = ' '.join(sluggable_string_values) self.slug = SlugifyUniquely(sluggable_string, self.__class__) super(MagazineIssue, self).save(*args, **kwargs) @models.permalink def get_absolute_url(self): return (str(self.content_type()) + '_view', (), { 'issue_slug': self.slug, 'magazine_slug': self.magazine.slug }) def content_type(self): return u'magazine_issue' def cover_image_exists(self): if self.cover_image and os.path.exists( os.path.join(settings.MEDIA_ROOT, self.cover_image.path_relative)): return True return False def placeholder_image_url(self): return settings.MAGAZINE_COVER_PLACEHOLDER_IMAGE_PATH def is_from_the_archive(self): if self.archivearticle_set.all().count() > 0: return True return False def issue_display_name(self): if self.issue_name: return u'%s' % (self.issue_name) else: display_name_fields = [self._display_month, self.issue_year] display_name_values = [] for display_name_field in display_name_fields: if display_name_field: display_name_values.append(display_name_field) return u'%s' % (' '.join(display_name_values))
class Album(MPTTModel): """Model representing an album""" gallery = models.ForeignKey(Gallery) parent = TreeForeignKey('self', null=True, blank=True, related_name='children') name = models.CharField(_('name'), max_length=250) description = models.TextField(_('description'), blank=True) image = FileBrowseField(_('image'), max_length=255, null=True, blank=True, default=None) template_name = models.CharField( _('template'), max_length=255, help_text=_('Template used to render the album'), choices=settings.PORTICUS_ALBUM_TEMPLATE_CHOICES, default=settings.PORTICUS_ALBUM_TEMPLATE_DEFAULT) publish = models.BooleanField(_('published'), choices=PUBLISHED_CHOICES, default=True) priority = models.IntegerField(_('display priority'), default=100) creation_date = models.DateTimeField(_('creation date'), editable=False) slug = models.SlugField(_('slug'), unique=True, max_length=100) def __unicode__(self): return self.name objects = TreeManager() published = AlbumPublishedManager() #@models.permalink #def get_absolute_url(self): #return ('porticus:album-detail', (self.gallery.slug, self.slug,)) def get_tags(self): """ Return a queryset of tags used from album's ressources """ return Tag.objects.get_for_object(self) def get_published_children(self): """ Return all ressources for the album and all its children """ return self.get_children().filter(publish=True) def get_published_descendants(self): """ Return all ressources for the album and its direct descendants """ return self.get_descendants().filter(publish=True) def get_published_ressources(self): """ Return all ressources for the album """ return self.ressource_set.filter(publish=True).order_by( 'priority', 'name') def save(self, *args, **kwargs): """ Fill 'creation_date' attribute on first create """ if self.creation_date is None: self.creation_date = tz_now() super(Album, self).save(*args, **kwargs) class Meta: verbose_name = _('album') verbose_name_plural = _('albums') class MPTTMeta: order_insertion_by = ['gallery', 'priority', 'name']
class Image(models.Model): title = models.CharField(max_length=200) slug = models.SlugField(unique=True) file = FileBrowseField(max_length=200, directory="images/", format='image', blank=True, null=True) preferred_size = models.CharField(max_length=1, choices=SIZES, blank=True, help_text=_('In some cases setting this can help HTML ' 'writers display the image display.')) caption = models.CharField(max_length=200, blank=True) url = models.URLField(blank=True, verify_exists=False, verbose_name=('URL'), help_text=_('URL for image to link to, usually the source.')) description = EnhancedTextField(blank=True, default="\W") credits = generic.GenericRelation(OrderedCredit, verbose_name=_('Credit',), blank=True, null=True) copyright = models.ForeignKey(Copyright, blank=True, null=True) tags = generic.GenericRelation(TaggedItem, verbose_name=_('tags'), blank=True, null=True) last_modified = models.DateTimeField(auto_now=True, editable=False) date_added = models.DateTimeField(auto_now_add=True, editable=False) def image_thumbnail(self): if self.file and self.file.filetype == "Image": return '<img src="%s" />' % self.file.url_thumbnail else: return "" image_thumbnail.allow_tags = True image_thumbnail.short_description = "Thumbnail" def _get_unique_slug(self): '''Makes slug unique, if it is not already, and returns it as a string. ''' slug_unique = False counter = 1 slug = self.slug while not slug_unique: if self.id: images = Image.objects.filter(slug=slug).\ exclude(pk=self.id) else: images = Image.objects.filter(slug=slug) if len(images) == 0: slug_unique = True else: slug = self.slug + "-" + unicode(counter) counter += 1 return slug def get_credits(self): return credit_list(self.credits) def describe(self): if unicode(self.description).strip(): return self.description else: return self.caption @models.permalink def get_absolute_url(self): return ('image_view', [str(self.id)]) def __unicode__(self): return self.title class Meta: verbose_name = _('image') verbose_name_plural = _('images') ordering = ['-last_modified']
class config(models.Model): ENABLED=( (1,"启用"), ) enabled=models.IntegerField(unique=True,choices=ENABLED,blank=True,verbose_name="启用该设置") # 生产环境的域名(形如:http://*****,末尾不加/) domainName=models.CharField(max_length=99,verbose_name="域名") articlesPerPage=models.PositiveSmallIntegerField(verbose_name="首页每页显示的博客数",default=9) commentVerify=models.BooleanField(verbose_name="新评论是否默认隐藏",default=True) musicAutoPlay=models.BooleanField(default=False,verbose_name="背景音乐自动播放") qrCodeImage=FileBrowseField(max_length=99,blank=True,verbose_name="QR码URL") brand=models.CharField(max_length=19,blank=True,verbose_name="博客名") subBrand=models.CharField(max_length=99,blank=True,verbose_name="副博客名") ownerName=models.CharField(max_length=19,verbose_name="博主名") ownerBriefSelfIntro=models.CharField(max_length=999,blank=True,verbose_name="博主简介") ownerIcon=FileBrowseField(max_length=99,blank=True,verbose_name="博主头像") ownerSelfIntro=models.ForeignKey("flatPage",related_name="self_intro",verbose_name="自我介绍") ownerGithub=models.URLField(max_length=999,blank=True,verbose_name="GitHub") ownerGoogle=models.URLField(max_length=999,blank=True,verbose_name="Google") ownerTwitter=models.URLField(max_length=999,blank=True,verbose_name="Twitter") ownerWeibo=models.URLField(max_length=999,blank=True,verbose_name="微博") ownerWeiboBox=models.TextField(max_length=9999,blank=True,verbose_name="微博展示台") ownerEmail=models.EmailField(max_length=99,blank=True,verbose_name="邮箱") def __str__(self): return "【设置%s】"%(self.id,) def getOwnerIcon(self): ''' get the owner's icon if there's an icon in config,use it; otherwise generate from gravatar ''' import hashlib from urllib import parse if self.ownerIcon:return self.ownerIcon if self.ownerEmail: return "http://www.gravatar.com/avatar/"+ \ hashlib.md5(self.ownerEmail.lower().encode("utf-8")).hexdigest()+ \ "?"+ \ parse.urlencode({ "d":"http://www.gravatar.com/avatar/", "size":"32" }) return "" def getSafeOwnerEmail(self): ''' return a 'safe' email address ''' if not self.ownerEmail:return "" return self.ownerEmail.replace("@",random.choice(["(#)","($)","(&)","(*)","(a)"])) def getBrand(self): '''获取正确的博客名''' if self.brand:return self.brand return self.ownerName+"的博客" class Meta: verbose_name="设置" verbose_name_plural=verbose_name
class Invoice(models.Model): author = models.ForeignKey(Author, on_delete=models.CASCADE) invoice_num = models.IntegerField(default=0) # Fields whose default values are taken from Author identification = models.CharField(max_length=20, blank=True, help_text="SA ID, passport or some form " "of official identification") dob = models.DateField(blank=True, null=True, verbose_name="date of birth", help_text="Required by SARS") invoicing_company = models.CharField( blank=True, max_length=100, help_text="Leave blank unless you invoice through a company") address = models.TextField(blank=True, help_text="Required by SARS") bank_name = models.CharField(max_length=20, blank=True) bank_account_number = models.CharField(max_length=20, verbose_name="account", blank=True) bank_account_type = models.CharField(max_length=20, verbose_name="account type", default="CURRENT") bank_branch_name = models.CharField(max_length=20, blank=True, verbose_name="branch name", help_text="Unnecessary for Capitec, " "FNB, Standard, Nedbank and Absa") bank_branch_code = models.CharField(max_length=20, blank=True, verbose_name="branch code", help_text="Unnecessary for Capitec, " "FNB, Standard, Nedbank and Absa") swift_code = models.CharField(max_length=12, blank=True, help_text="Only relevant for banks " "outside SA") iban = models.CharField(max_length=34, blank=True, help_text="Only relevant for banks outside SA") tax_no = models.CharField(max_length=50, blank=True, verbose_name="tax number", help_text="Necessary for SARS.") tax_percent = models.DecimalField(max_digits=2, decimal_places=0, default=25, verbose_name="PAYE %", help_text="Unless you have " "a tax directive " "we have to deduct 25% PAYE") vat = models.DecimalField(max_digits=2, decimal_places=0, default=0, verbose_name="VAT %", help_text="If you are VAT registered " "set this to 15 else leave at 0") level = models.CharField(max_length=15, choices=LEVEL_CHOICES, default='standard') #### # paid = models.BooleanField(default=False) amount_paid = models.DecimalField(max_digits=10, decimal_places=4, default=0.00, verbose_name="amount") tax_paid = models.DecimalField(max_digits=10, decimal_places=4, default=0.00) vat_paid = models.DecimalField(max_digits=10, decimal_places=4, default=0.00) invoice = FileBrowseField(max_length=200, directory="commissions/invoices/", blank=True, extensions=EXTENSIONS) proof = FileBrowseField(max_length=200, directory="commissions/proofs/", blank=True, extensions=EXTENSIONS) status = models.CharField(max_length=2, choices=INVOICE_STATUS_CHOICES, default="-") notes = models.TextField(blank=True) query = models.TextField(blank=True, max_length=3000, help_text="Explain your query " "here if you have one") additional_emails = models.CharField( max_length=200, blank=True, help_text="Additional emails to notify " "separated by commas") date_time_reporter_approved = models.DateTimeField(null=True, blank=True, editable=False) date_time_editor_approved = models.DateTimeField(null=True, blank=True, editable=False) date_time_processed = models.DateTimeField(null=True, blank=True, editable=False) date_notified_payment = models.DateTimeField(null=True, blank=True, editable=False) # Requisition print fields requisition = models.BooleanField(default=False) requisition_number = models.CharField(blank=True, max_length=12) payment_method = models.CharField(blank=True, default="EFT", max_length=12) description = models.CharField(blank=True, max_length=200) fund = models.ForeignKey(Fund, blank=True, null=True, on_delete=models.CASCADE) vouchers_attached = models.BooleanField(default=True) prepared_by = models.CharField(max_length=100, blank=True) approved_by = models.CharField(max_length=100, blank=True) authorised_by = models.CharField(max_length=100, blank=True) created = models.DateTimeField(auto_now_add=True, editable=False) modified = models.DateTimeField(auto_now=True, editable=False) def calc_payment(self): commissions = Commission.objects.for_authors().\ filter(invoice=self) total_uncorrected = Decimal(0.0000) total_paid = Decimal(0.0000) total_tax = Decimal(0.0000) total_vat = Decimal(0.0000) for commission in commissions: (due, vat, tax, uncorrected) = commission.calc_payment() total_paid = total_paid + due total_vat = total_vat + vat total_tax = total_tax + tax total_uncorrected = total_uncorrected + uncorrected self.amount_paid = total_paid self.vat_paid = total_vat self.tax_paid = total_tax return ( self.amount_paid, self.vat_paid, self.tax_paid, total_uncorrected, ) def quick_calc_payment(self): if self.status >= "4": return (self.amount_paid, self.vat_paid, self.tax_paid, self.amount_paid - self.vat_paid + self.tax_paid) else: return self.calc_payment() def __str__(self): return str(self.author.pk) + "-" + str(self.invoice_num) + " - " + \ str(self.author) + " - " + self.get_status_display() def get_absolute_url(self): return reverse('payments:invoice.detail', args=[self.author.pk, self.invoice_num]) def short_string(self): return str(self.author.pk) + "-" + str(self.invoice_num) def process_splits(self): commissions = self.commission_set.filter(split=True) if len(commissions) > 0: new_invoice = Invoice.create_invoice(self.author) for commission in commissions: commission.split = False commission.invoice = new_invoice commission.save() def invoice_type(self): if self.author.freelancer == "f": return "invoice" elif self.author.freelancer == "c": return "requisition" else: return "payment" def accepted_commissions(self): return self.commission_set.filter(fund__isnull=False).filter( deleted=False) def save(self, *args, **kwargs): try: with transaction.atomic(): if self.status == "2": # Reporter has approved if self.date_time_reporter_approved is None: self.date_time_reporter_approved = timezone.now() if self.status == "3": # Editor has approved if self.date_time_editor_approved is None: self.date_time_editor_approved = timezone.now() if self.status == "4": # Invoice has been paid if self.date_time_processed is None: self.date_time_processed = timezone.now() self.calc_payment() super(Invoice, self).save(*args, **kwargs) set_corresponding_vals(self, self.author) self.author.save() self.process_splits() except Exception as e: msg = "Error saving invoice: " + str(e) # messages.add_message(request, messages.ERROR, msg) print(msg) logger.error(msg) @staticmethod def create_invoice(author, description=None): max_invoice = Invoice.objects.filter(author=author).\ aggregate(Max('invoice_num')) if max_invoice["invoice_num__max"] is None: invoice_num = 1 else: invoice_num = max_invoice["invoice_num__max"] + 1 invoice = Invoice() invoice.author = author invoice.invoice_num = invoice_num if description: invoice.description = description set_corresponding_vals(author, invoice) invoice.save() return invoice @staticmethod def get_open_invoice_for_author(author): invoices = Invoice.objects.filter(author=author).\ filter(status__lte="0") if len(invoices) == 0: invoice = Invoice.create_invoice(author) else: invoice = invoices[0] if invoice.status == "0": invoice.status = "-" invoice.save() return invoice @staticmethod def merge_invoices(from_invoice, to_invoice): for commission in from_invoice.commission_set.all(): commission.invoice = to_invoice commission.save() from_invoice.status = "5" from_invoice.save() class Meta: ordering = [ 'status', '-modified', ] unique_together = [ 'author', 'invoice_num', ]
class VideoYoutube(models.Model): URL_EXTERNA = ( ('sim', 'sim'), ('nao', 'não'), ) SECAO_CHOICES = ( ('vid_destaque', 'Destaque'), ('vid_videos_2', 'Videos secão 2'), ) secretaria = models.CharField(verbose_name='secretaria', max_length=60, choices=SECRETARIA_CHOICES, default='administracao') titulo = models.CharField(verbose_name='Titulo', max_length=250) slug = models.SlugField(verbose_name='URL (slug)', unique=True, max_length=250) url = models.URLField(verbose_name='url do video', max_length=80, null=True, blank=True) publicacao = models.DateTimeField(verbose_name='publicação', auto_now_add=True) imagem = FileBrowseField(verbose_name="image de destaque", max_length=80, directory="videos/", blank=True, null=True, help_text="200x160. Imagem para video do youtube") secao = models.CharField(verbose_name='seção', choices=SECAO_CHOICES, max_length=20) status = models.CharField(verbose_name='status', max_length=11, choices=STATUS_CHOICES, default='rascunho') embed = EmbedVideoField(verbose_name='embed', blank=True, null=True) url_externa = models.CharField(verbose_name='url externa?', max_length=3, choices=URL_EXTERNA, default='nao') objects = models.Manager() publicado = Gerenciador() class Meta: db_table = "tb_video_youtube" verbose_name = "Video Youtube" verbose_name_plural = "Videos Youtube" ordering = ['-publicacao'] get_latest_by = 'publicacao' def get_absolute_url(self): return reverse("home:video_detalhe", kwargs={"slug": self.slug}) def save(self, *args, **kwargs): if self.slug == '': self.slug = slugify(self.titulo) super(VideoYoutube, self).save(*args, **kwargs) def __str__(self): return self.titulo
class TemplateSet(models.Model): organisationname = models.CharField( verbose_name=_("Name of the Organisation"), max_length=200) title = models.CharField(verbose_name=_("Title"), max_length=100) invoiceXSLFile = models.ForeignKey(XSLFile, verbose_name=_("XSL File for Invoice"), related_name="db_reltemplateinvoice") quoteXSLFile = models.ForeignKey(XSLFile, verbose_name=_("XSL File for Quote"), related_name="db_reltemplatequote") purchaseconfirmationXSLFile = models.ForeignKey( XSLFile, verbose_name=_("XSL File for Purchaseorder"), related_name="db_reltemplatepurchaseorder") deilveryorderXSLFile = models.ForeignKey( XSLFile, verbose_name=_("XSL File for Deilvery Order"), related_name="db_reltemplatedeliveryorder") profitLossStatementXSLFile = models.ForeignKey( XSLFile, verbose_name=_("XSL File for Profit Loss Statement"), related_name="db_reltemplateprofitlossstatement") balancesheetXSLFile = models.ForeignKey( XSLFile, verbose_name=_("XSL File for Balancesheet"), related_name="db_reltemplatebalancesheet") logo = FileBrowseField(verbose_name=_("Logo for the PDF generation"), blank=True, null=True, max_length=200) bankingaccountref = models.CharField( max_length=60, verbose_name=_("Reference to Banking Account"), blank=True, null=True) addresser = models.CharField(max_length=200, verbose_name=_("Addresser"), blank=True, null=True) fopConfigurationFile = FileBrowseField( verbose_name=_("FOP Configuration File"), blank=True, null=True, max_length=200) footerTextsalesorders = models.TextField( verbose_name=_("Footer Text On Salesorders"), blank=True, null=True) headerTextsalesorders = models.TextField( verbose_name=_("Header Text On Salesorders"), blank=True, null=True) headerTextpurchaseorders = models.TextField( verbose_name=_("Header Text On Purchaseorders"), blank=True, null=True) footerTextpurchaseorders = models.TextField( verbose_name=_("Footer Text On Purchaseorders"), blank=True, null=True) pagefooterleft = models.CharField(max_length=40, verbose_name=_("Page Footer Left"), blank=True, null=True) pagefootermiddle = models.CharField(max_length=40, verbose_name=_("Page Footer Middle"), blank=True, null=True) class Meta: app_label = "djangoUserExtension" #app_label_koalix = _('Djang User Extention') verbose_name = _('Templateset') verbose_name_plural = _('Templatesets') def __unicode__(self): return str(self.id) + ' ' + self.title
class Noticia(models.Model): SECAO_CHOICES = ( ('ultimas_noticias', 'Últimas noticias'), ('not_destaque_1', 'Destaque 1'), ('not_destaque_2', 'Destaque 2'), ('not_secretarias', 'Secretarias'), ('not_antigas1', 'Antigas seção 1'), ('not_antigas2', 'Antigas seção 2'), ('not_antigas3', 'Antigas seção 3'), ('veja_tambem', 'Veja também'), ) secretaria = models.CharField(verbose_name='secretaria', max_length=60, choices=SECRETARIA_CHOICES, default='administracao') titulo = models.CharField(verbose_name='título', max_length=250) slug = models.SlugField(verbose_name='URL (slug)', unique=True, max_length=250) legenda = models.CharField(verbose_name='legenda imagem') secao = models.CharField(verbose_name='seção', choices=SECAO_CHOICES, max_length=20) resumo = models.CharField(verbose_name='resumo', max_length=140, blank=True) conteudo = models.TextField(verbose_name='texto', blank=True) publicacao = models.DateTimeField(verbose_name='publicação', default=timezone.now) status = models.CharField(verbose_name='status', max_length=11, choices=STATUS_CHOICES, default='rascunho') imagem = FileBrowseField(verbose_name='image de destaque', max_length=80, directory="noticias/", blank=True, null=True) legenda = models.CharField(verbose_name='legenda imagem', max_length=80, blank=True, null=True) author = models.CharField(verbose_name='author', max_length=60, blank=True, null=True) objects = models.Manager() publicado = Gerenciador() class Meta: db_table = "tb_noticia" verbose_name = "Noticia" verbose_name_plural = "Noticias" ordering = ['-publicacao'] get_latest_by = '-publicacao' def get_absolute_url(self): return reverse("home:noticia_detalhe", kwargs={"slug": self.slug}) def save(self, *args, **kwargs): if self.slug == '': self.slug = slugify(self.titulo) super(Noticia, self).save(*args, **kwargs) def __str__(self): return self.titulo
class Picture(models.Model): picture = FileBrowseField(max_length=500) # If Gallery is deleted -> delete the pictures as well in_gallery = models.ForeignKey("Gallery", on_delete=models.CASCADE)