123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466 |
- from datetime import *
- from dateutil import relativedelta
- from django.db import models
- from django.db.models import permalink
- from django.utils.translation import ugettext_lazy as _
- from django.core.urlresolvers import reverse
- from django.contrib.auth.models import User
- from django.contrib.localflavor.us.models import PhoneNumberField, USStateField
- from directory.models import Point, Person, Town, Place
- class StandardMetadata(models.Model):
- """
- A basic (abstract) model for metadata.
-
- Included in each model file to maintain application separation.
-
- Subclass new models from 'StandardMetadata' instead of 'models.Model'.
- """
- created = models.DateTimeField(default=datetime.now, editable=False)
- updated = models.DateTimeField(default=datetime.now, editable=False)
- class Meta:
- abstract = True
- def save(self, *args, **kwargs):
- self.updated = datetime.now()
- super(StandardMetadata, self).save(*args, **kwargs)
- class Category(models.Model):
- """Place categories model."""
- title = models.CharField(_("title"), max_length=100, unique=True)
- slug = models.SlugField(_("slug"), unique=True)
- class Meta:
- verbose_name = _("category")
- verbose_name_plural = _("categories")
- ordering = ("title",)
- def __unicode__(self):
- return u"%s" % self.title
- def get_absolute_url(self):
- return reverse("mk-category-index", args=[self.slug])
- class Subcategory(models.Model):
- """Place subcategories model."""
- title = models.CharField(_("title"), max_length=100, unique=True)
- slug = models.SlugField(_("slug"), unique=True)
- category = models.ForeignKey(Category)
- class Meta:
- verbose_name = _("subcategory")
- verbose_name_plural = _("subcategories")
- ordering = (
- "category",
- "title",
- )
- def __unicode__(self):
- return u"%s" % self.title
- def get_absolute_url(self):
- args = [self.category.slug, self.slug]
- return reverse("mk-subcategory-index", args=args)
- class Feature(models.Model):
- name = models.CharField(_("name"), max_length=200)
- slug = models.SlugField(_("slug"), unique=True)
- description = models.CharField(
- _("description"), max_length=255, blank=True, null=True
- )
- class Meta:
- verbose_name = _("feature")
- verbose_name_plural = _("features")
- ordering = ("name",)
- def __unicode__(self):
- return u"%s" % self.name
- class PaymentMethod(StandardMetadata):
- """Payment methods accepted by businesses."""
- name = models.CharField(_("name"), max_length=50)
- slug = models.SlugField(_("slug"), unique=True)
- icon = models.ImageField(
- _("icon"), upload_to="marketplace/paymenticons/", blank=True, null=True
- )
- class Meta:
- verbose_name = _("payment method")
- verbose_name_plural = _("payment methods")
- ordering = ("name",)
- def __unicode__(self):
- return u"%s" % self.name
- # def get_absolute_url(self):
- # args=[self.slug]
- # return reverse ('mk-payment-method-detail', args=args)
- class Business(StandardMetadata):
- """Base class for business models for Marketplace application.
-
- A business at it's simplest is a listing.
- It can be piled up with all manner of other things as upsells.
- Upsells are represented by the objects listing status."""
- STATUS_CHOICES = (
- (0, "Inactive"),
- (1, "Basic"),
- (2, "Full"),
- (3, "Hosted"),
- )
- point = models.ForeignKey(Point, blank=True, null=True)
- owner = models.ForeignKey(
- Person, blank=True, null=True
- ) # Eventually we want this to be a UserProfile class
- name = models.CharField(_("name"), max_length=255)
- slug = models.SlugField(_("slug"), unique=True)
- brief_hours = models.CharField(
- _("brief hours"), blank=True, null=True, max_length=255
- )
- logo = models.ImageField(
- _("logo or photo"), upload_to="marketplace/logos/", blank=True
- )
- unit = models.CharField(
- _("unit"), blank=True, max_length=100, help_text="Suite or Apartment #"
- )
- po_box = models.CharField(_("post office box"), blank=True, null=True, max_length=5)
- post_office = models.ForeignKey(
- Place, related_name="post_office", blank=True, null=True
- )
- phone = PhoneNumberField(_("primary phone"), blank=True, null=True)
- phone_title = models.CharField(
- _("phone one title"), blank=True, null=True, max_length=25
- )
- phone_2 = PhoneNumberField(_("phone two"), blank=True, null=True)
- phone_2_title = models.CharField(
- _("phone two title"), blank=True, null=True, max_length=25
- )
- phone_3 = PhoneNumberField(_("phone three"), blank=True, null=True)
- phone_3_title = models.CharField(
- _("phone three title"), blank=True, null=True, max_length=25
- )
- mobile_phone = PhoneNumberField(_("mobile phone"), blank=True, null=True)
- fax = PhoneNumberField(_("fax"), blank=True, null=True)
- url = models.URLField(_("url"), blank=True, verify_exists=False)
- email = models.EmailField(_("email"), blank=True)
- brief_hours = models.CharField(
- _("brief hours"), blank=True, null=True, max_length=255
- )
- directions = models.CharField(
- _("directions"), blank=True, null=True, max_length=255
- )
- twitter = models.CharField(
- _("twitter account"), blank=True, null=True, max_length=255
- )
- facebook = models.CharField(
- _("facebook profile"), blank=True, null=True, max_length=255
- )
- brief = models.CharField(_("brief"), max_length=140, blank=True, null=True)
- description = models.TextField(_("description"), blank=True, null=True)
- payment_accepted = models.ManyToManyField(PaymentMethod, blank=True, null=True)
- status = models.IntegerField(_("listing status"), choices=STATUS_CHOICES, default=1)
- paid_through = models.DateField(_("paid through date"), blank=True, null=True)
- features = models.ManyToManyField(Feature, blank=True, null=True)
- categories = models.ManyToManyField(Category)
- subcategories = models.ManyToManyField(Subcategory)
- with_branches = models.BooleanField(
- _("show with branches"),
- default=True,
- help_text="If this business has branch offices, do we show this listing as the primary office?",
- )
- internal_notes = models.TextField(
- _("Internal notes"),
- blank=True,
- null=True,
- help_text="Does not appear on public site, only for admin notes.",
- )
- class Meta:
- verbose_name = _("business")
- verbose_name_plural = _("businesses")
- ordering = ("point__town", "name")
- get_latest_by = "created"
- def __unicode__(self):
- return u"%s" % self.name
- def get_absolute_url(self):
- return reverse("mk-business-detail", args=[self.slug])
- class BusinessPhoto(StandardMetadata):
- business = models.ForeignKey(Business)
- branch = models.ForeignKey("Branch", blank=True, null=True)
- photo = models.ImageField(
- _("photo"), upload_to="marketplace/photos/", blank=True, null=True
- )
- caption = models.CharField(_("caption"), max_length=255, blank=True, null=True)
- credit = models.CharField(_("credit"), blank=True, null=True, max_length=150)
- ordering = models.IntegerField(_("ordering"), max_length=3, blank=True, null=True)
- class Meta:
- ordering = ["ordering"]
- get_latest_by = "created"
- verbose_name = _("business photo")
- verbose_name_plural = _("business photos")
- def __unicode__(self):
- return self.business.name + " photo"
- def __str__(self):
- return self.__unicode__()
- class Branch(StandardMetadata):
- """Branch model
-
- A branch is another physical location of a business. For example, banks often have multiple
- branches. Branches do not exist without an associated business, but most contact information
- can be unique from the business.
-
- It is assumed at this point that all branches share the same features and payment methods as
- their central office. Though in the long run, this may not be a desirable way to manage these things.
- """
- business = models.ForeignKey(Business)
- name = models.CharField(_("name"), blank=True, null=True, max_length=150)
- point = models.ForeignKey(Point, blank=True, null=True)
- slug = models.SlugField(_("slug"), unique=True)
- logo = models.ImageField(
- _("logo or photo"), upload_to="marketplace/logos/", blank=True
- )
- unit = models.CharField(
- _("unit"), blank=True, max_length=100, help_text="Suite or Apartment #"
- )
- po_box = models.CharField(_("post office box"), blank=True, null=True, max_length=5)
- brief_hours = models.CharField(
- _("brief hours"), blank=True, null=True, max_length=255
- )
- phone = PhoneNumberField(_("primary phone"), blank=True, null=True)
- tollfree_phone = PhoneNumberField(_("toll-free phone"), blank=True, null=True)
- mobile_phone = PhoneNumberField(_("mobile phone"), blank=True, null=True)
- fax = PhoneNumberField(_("fax"), blank=True, null=True)
- url = models.URLField(_("url"), blank=True, verify_exists=False)
- email = models.EmailField(_("email"), blank=True)
- twitter = models.CharField(
- _("twitter account"), blank=True, null=True, max_length=255
- )
- facebook = models.CharField(
- _("facebook profile"), blank=True, null=True, max_length=255
- )
- class Meta:
- verbose_name = _("branch office")
- verbose_name_plural = _("branch offices")
- ordering = ("business", "point")
- get_latest_by = "created"
- def __unicode__(self):
- return u"%s, %s branch" % (self.business, self.point.town.name)
- def get_absolute_url(self):
- return reverse("mk-branch-detail", args=[self.slug])
- class BaseHours(models.Model):
- mon_open = models.TimeField(_("monday opening"), blank=True, null=True)
- mon_close = models.TimeField(_("monday closing"), blank=True, null=True)
- tue_open = models.TimeField(_("tuesday opening"), blank=True, null=True)
- tue_close = models.TimeField(_("tuesday closing"), blank=True, null=True)
- wed_open = models.TimeField(_("wednesday opening"), blank=True, null=True)
- wed_close = models.TimeField(_("wednesday closing"), blank=True, null=True)
- thu_open = models.TimeField(_("thursday opening"), blank=True, null=True)
- thu_close = models.TimeField(_("thursday closing"), blank=True, null=True)
- fri_open = models.TimeField(_("friday opening"), blank=True, null=True)
- fri_close = models.TimeField(_("friday closing"), blank=True, null=True)
- sat_open = models.TimeField(_("saturday opening"), blank=True, null=True)
- sat_close = models.TimeField(_("saturday closing"), blank=True, null=True)
- sun_open = models.TimeField(_("sunday opening"), blank=True, null=True)
- sun_close = models.TimeField(_("sunday closing"), blank=True, null=True)
- class Meta:
- abstract = True
- class Hours(BaseHours):
- title = models.CharField(_("title"), blank=True, null=True, max_length=100)
- business = models.ForeignKey(Business)
- branch = models.ForeignKey(Branch, blank=True, null=True)
- mon_by_appt = models.BooleanField(_("monday by appt"), default=False)
- tue_by_appt = models.BooleanField(_("tuesday by appt"), default=False)
- wed_by_appt = models.BooleanField(_("wednesday by appt"), default=False)
- thu_by_appt = models.BooleanField(_("thursday by appt"), default=False)
- fri_by_appt = models.BooleanField(_("friday by appt"), default=False)
- sat_by_appt = models.BooleanField(_("saturday by appt"), default=False)
- sun_by_appt = models.BooleanField(_("sunday by appt"), default=False)
- addtional = models.CharField(
- _("additional info"), blank=True, null=True, max_length=200
- )
- class Meta:
- verbose_name = _("hours")
- verbose_name_plural = _("hours")
- def __unicode__(self):
- return u"%s hours" % (self.business)
- class Meal(models.Model):
- name = models.CharField(_("name"), max_length=100)
- slug = models.SlugField(_("slug"), unique=True)
- def __unicode__(self):
- return self.name
- class Menu(StandardMetadata):
- business = models.ForeignKey(Business)
- file = models.FileField(
- _("file"), upload_to="marketplace/menus/", blank=True, null=True
- )
- menu_text = models.TextField(_("menu text"), blank=True, null=True)
- expire_date = models.DateField(_("valid until"), blank=True, null=True)
- meal = models.ForeignKey(Meal)
- sample = models.BooleanField(
- _("sample"),
- default=False,
- help_text="Use this if your menu is to be used only as a sample of the sorts of food served.",
- )
- def __unicode__(self):
- return u"%s %s menu" % (self.business, self.meal)
- class DiningHours(BaseHours):
- business = models.ForeignKey(Business)
- branch = models.ForeignKey(Branch, blank=True, null=True)
- meal = models.ForeignKey(Meal)
- additional = models.CharField(
- _("additional info"), blank=True, null=True, max_length=200
- )
- class Meta:
- verbose_name = _("dining hours")
- verbose_name_plural = _("dining hours")
- def __unicode__(self):
- return u"%s - %s hours" % (self.business, self.meal)
- class Link(StandardMetadata):
- business = models.ForeignKey(Business)
- url = models.URLField("URL", verify_exists=False)
- title = models.CharField(_("title"), max_length=255)
- description = models.CharField(
- _("description"), max_length=200, blank=True, null=True
- )
- class Meta:
- verbose_name = _("link")
- verbose_name_plural = _("links")
- ordering = ("created", "updated")
- get_latest_by = "created"
- def __unicode__(self):
- return self.title
- class Reference(StandardMetadata):
- business = models.ForeignKey(Business)
- source = models.CharField(_("source"), max_length=255)
- slug = models.SlugField(_("slug"))
- body = models.CharField(_("description"), max_length=255)
- class Meta:
- verbose_name = _("reference")
- verbose_name_plural = _("references")
- ordering = ("created", "updated")
- get_latest_by = "created"
- def __unicode__(self):
- return u"%s reference from %s" % (self.business, self.source)
- class Ad(StandardMetadata):
- business = models.ForeignKey(Business)
- title = models.CharField(_("title"), max_length=255)
- slug = models.SlugField(_("slug"))
- start_date = models.DateField(_("start date"), blank=True, null=True)
- expire_date = models.DateField(_("expiration date"), blank=True, null=True)
- body = models.CharField(_("description"), max_length=200, blank=True, null=True)
- file = models.FileField(_("file"), upload_to="marketplace/flyers/")
- class Meta:
- verbose_name = _("advert")
- verbose_name_plural = _("adverts")
- ordering = ("created", "updated")
- get_latest_by = "created"
- def __unicode__(self):
- return u"%s ad - %s" % (self.business, self.title)
- def get_absolute_url(self):
- args = [self.business.slug, self.slug]
- return reverse("mk-ad-detail", args=args)
- class Guide(StandardMetadata):
- title = models.CharField(_("title"), max_length=255)
- slug = models.SlugField(_("slug"))
- published = models.BooleanField(_("published"), default=False)
- pub_date = models.DateField(_("publish date"))
- featured = models.BooleanField(_("featured"), default=False)
- logo = models.ImageField(
- _("logo or photo"), upload_to="marketplace/guides/logos/", blank=True
- )
- logo_thumbnail = models.ImageField(
- _("Thumbnail of logo (optionl)"),
- upload_to="marketplace/section/logos/thumbnails/",
- blank=True,
- null=True,
- help_text="An optional thumbnail of the logo. If not used, a thumbnail will be generated from the logo.",
- )
- tag_line = models.CharField(_("Tag line"), max_length=255, blank=True, null=True)
- brief_description = models.CharField(
- _("Brief description"), max_length=255, blank=True, null=True
- )
- description = models.TextField(_("description"), blank=True, null=True)
- categories = models.ManyToManyField(Category, blank=True, null=True)
- subcategories = models.ManyToManyField(Subcategory, blank=True, null=True)
- businesses = models.ManyToManyField(Business, blank=True, null=True)
- template_name = models.CharField(
- _("template name"),
- max_length=70,
- blank=True,
- help_text=_(
- "Example: 'marketplace/guides/seasonal_guide.html'. If this isn't provided, the system will use 'marketplace/guides/default.html'."
- ),
- )
- class Meta:
- verbose_name = _("Guide")
- verbose_name_plural = _("Guides")
- ordering = ("pub_date", "updated")
- get_latest_by = "pub_date"
- def __unicode__(self):
- return u"%s" % (self.title)
- def get_absolute_url(self):
- args = [self.slug]
- return reverse("mk-guide-detail", args=args)
|