123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- from django.db import models
- from modelcluster.fields import ParentalKey
- from wagtail.wagtailadmin.edit_handlers import FieldPanel, InlinePanel
- from wagtail.wagtailcore.models import Orderable, Page
- from wagtail.wagtailimages.edit_handlers import ImageChooserPanel
- from wagtail.wagtailsearch import index
- class OperatingHours(models.Model):
- '''
- Django model to capture operating hours for a Location
- '''
- MONDAY = 'MON'
- TUESDAY = 'TUE'
- WEDNESDAY = 'WED'
- THURSDAY = 'THU'
- FRIDAY = 'FRI'
- SATURDAY = 'SAT'
- SUNDAY = 'SUN'
- DAY_CHOICES = (
- (MONDAY, 'MON'),
- (TUESDAY, 'TUE'),
- (WEDNESDAY, 'WED'),
- (THURSDAY, 'THU'),
- (FRIDAY, 'FRI'),
- (SATURDAY, 'SAT'),
- (SUNDAY, 'SUN'),
- )
- day = models.CharField(
- max_length=3,
- choices=DAY_CHOICES,
- default=MONDAY,
- )
- opening_time = models.TimeField()
- closing_time = models.TimeField()
- panels = [
- FieldPanel('day'),
- FieldPanel('opening_time'),
- FieldPanel('closing_time'),
- ]
- class Meta:
- abstract = True
- def __str__(self):
- return '{}: {} - {}'.format(self.day, self.opening_time, self.closing_time)
- class LocationOperatingHours(Orderable, OperatingHours):
- '''
- Operating Hours entry for a Location
- '''
- location = ParentalKey(
- 'LocationPage',
- related_name='hours_of_operation'
- )
- class LocationsIndexPage(Page):
- '''
- Index page for locations
- '''
- subpage_types = ['LocationPage']
- def get_context(self, request):
- context = super(LocationsIndexPage, self).get_context(request)
- context['locations'] = LocationPage.objects.descendant_of(
- self).live().order_by(
- '-first_published_at')
- return context
- class LocationPage(Page):
- '''
- Detail for a specific location
- '''
- address = models.TextField()
- image = models.ForeignKey(
- 'wagtailimages.Image',
- null=True,
- blank=True,
- on_delete=models.SET_NULL,
- related_name='+'
- )
- lat_long = models.CharField(
- max_length=36,
- help_text="Comma separated lat/long. (Ex. 64.144367, -21.939182) \
- Right click Google Maps and click 'What\'s Here'"
- )
- # Search index configuration
- search_fields = Page.search_fields + [
- index.SearchField('address'),
- ]
- # Editor panels configuration
- content_panels = Page.content_panels + [
- FieldPanel('address', classname="full"),
- FieldPanel('lat_long'),
- ImageChooserPanel('image'),
- InlinePanel('hours_of_operation', label="Hours of Operation")
- ]
- def __str__(self):
- return self.title
- def opening_hours(self):
- hours = self.hours_of_operation.all()
- return hours
- def get_context(self, request):
- context = super(LocationPage, self).get_context(request)
- context['lat'] = self.lat_long.split(",")[0]
- context['long'] = self.lat_long.split(",")[1]
- return context
- parent_page_types = [
- 'LocationsIndexPage'
- ]
|