GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Completed
Push — master ( ca28e3...0fbdc5 )
by Jason
01:15
created

ReservableProduct.__str__()   A

Complexity

Conditions 1

Size

Total Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
c 1
b 0
f 0
dl 0
loc 2
rs 10
1
# -*- coding: utf-8 -*-
2
import datetime
3
4
from django.conf import settings
5
from django.core.urlresolvers import reverse
6
from django.db import models
7
from django.db.models import Q
8
from django.dispatch import receiver
9
from django.utils.translation import ugettext_lazy as _
10
11
from reservable_pricing.models import PeriodPriceModifier
12
from reservations.notify_events import ReservationsOrderReceived, get_order_details
13
from shoop.core.models import Product, OrderLine
14
from shoop.front.signals import order_creator_finished
15
16
17
class ReservableProduct(models.Model):
18
    """Products that have reservable properties."""
19
20
    product = models.OneToOneField(Product, verbose_name=_(u"reservable product"), related_name="reservable")
21
    check_out_time = models.TimeField(verbose_name=_(u"sign out time"), default=datetime.time(hour=12))
22
    check_in_time = models.TimeField(verbose_name=_(u"sign in time"), default=datetime.time(hour=15))
23
    available_count = models.IntegerField(verbose_name=_(u"available quantity"), default=1)
24
    pricing_per_person = models.BooleanField(verbose_name=_("pricing per person"), default=False)
25
    pricing_per_person_included = models.PositiveIntegerField(
26
        verbose_name=_("people included in price"), null=True, blank=True,
27
    )
28
    pricing_per_person_price = models.DecimalField(
29
        verbose_name=_("price per person"), null=True, blank=True, decimal_places=2, max_digits=6,
30
    )
31
    sort_order = models.PositiveIntegerField(verbose_name=_(u"sort order"), default=50)
32
33
    class Meta:
34
        verbose_name = _('reservable product')
35
        verbose_name_plural = _('reservable products')
36
        ordering = ("sort_order",)
37
38
    def __str__(self):
39
        return self.product.safe_translation_getter("name") or self.product.sku
40
41
    def get_reserved_dates(self, start, end):
42
        """Get a list of reserved dates, between and including start and end.
43
44
        Args:
45
            start (date)
46
            end (date)
47
48
        Returns:
49
            list of dates or []
50
        """
51
        return Reservation.get_reserved_days_for_period(start, end, self)
52
53
    def is_period_days_free(self, start, end):
54
        """Check if period is free."""
55
        return len(self.get_reserved_dates(start, end)) == 0
56
57
    @property
58
    def has_price_modifiers(self):
59
        """Check if this reservable has price modifiers.
60
61
        Returns:
62
            True or False
63
        """
64
        if self.pricing_per_person:
65
            return True
66
        if self.period_price_modifiers.exists():
67
            return True
68
        return False
69
70
    @property
71
    def period_price_modifiers(self):
72
        future_period_modifiers = PeriodPriceModifier.objects.filter(
0 ignored issues
show
Bug introduced by
The Class PeriodPriceModifier does not seem to have a member named objects.

This check looks for calls to members that are non-existent. These calls will fail.

The member could have been renamed or removed.

Loading history...
73
            product=self.product, start_date__gte=datetime.date.today()).order_by("start_date")
74
        return future_period_modifiers
75
76
77
class Reservation(models.Model):
78
    """A single reservation."""
79
80
    reservable = models.ForeignKey(
81
        ReservableProduct, verbose_name=_(u"reservable product"), related_name="reservations")
82
    order_line = models.OneToOneField(
83
        OrderLine, verbose_name=_("order line"), related_name="reservation", null=True, blank=True)
84
    start_time = models.DateTimeField(verbose_name=_(u"starts"))
85
    end_time = models.DateTimeField(verbose_name=_(u"ends"))
86
    persons = models.IntegerField(verbose_name=_(u"persons"), default=1)
87
88
    class Meta:
89
        verbose_name = _('reservation')
90
        verbose_name_plural = _('reservations')
91
92
    def __str__(self):
93
        return str(self.reservable)
94
95
    def save(self, *args, **kwargs):
96
        # Validate end_time is past start_time
97
        if self.end_time <= self.start_time:
98
            raise ValueError
99
        return super(Reservation, self).save(*args, **kwargs)
100
101
    @staticmethod
102
    def get_reserved_days_for_period(start_date, end_date, reservable=None):
103
        """Get a list of reserved dates, between and including start and end.
104
105
        Args:
106
            start_date (date)
107
            end_date (date)
108
            reservable (ReservableProduct, optional)    - optionally filter by reservable
109
110
        Returns:
111
            list of dates or []
112
        """
113
        reservations = Reservation.objects.filter(
0 ignored issues
show
Bug introduced by
The Class Reservation does not seem to have a member named objects.

This check looks for calls to members that are non-existent. These calls will fail.

The member could have been renamed or removed.

Loading history...
114
            Q(start_time__range=(start_date, end_date)) | Q(end_time__range=(start_date, end_date))
115
        )
116
        if reservable:
117
            reservations = reservations.filter(reservable=reservable)
118
        dates = []
119
        for reservation in reservations:
120
            current = max(reservation.start_time.date(), start_date)
121
            while current < reservation.end_time.date() and current <= end_date:
122
                dates.append(current)
123
                current += datetime.timedelta(days=1)
124
        return dates
125
126
127
@receiver(order_creator_finished)
128
def send_order_received_notification(sender, **kwargs):
129
    order = kwargs["order"]
130
    request = kwargs["request"]
131
    ReservationsOrderReceived(
0 ignored issues
show
Bug introduced by
The Instance of ReservationsOrderReceived does not seem to have a member named run.

This check looks for calls to members that are non-existent. These calls will fail.

The member could have been renamed or removed.

Loading history...
132
        order=order,
133
        order_id=order.id,
134
        order_details=get_order_details(order),
135
        order_url="%s%s" % (
136
            settings.KAKARAVAARA_SITE_URL, reverse("shoop:order_complete", kwargs={"pk": order.pk, "key": order.key})
137
        ),
138
        customer_email=order.email,
139
        customer_phone=order.phone,
140
        customer_name=order.billing_address.name if order.billing_address else "",
141
        language=request.LANGUAGE_CODE,
142
        additional_notes=order.customer_comment,
143
        total_sum=order.taxful_total_price_value,
144
    ).run()
145