Source code for cycle_storage.models

from django.db import models
from django.contrib.auth.models import User
from django.core.urlresolvers import reverse
from profiles.models import UserProfile


[docs]def bike_photo_path(instance, filename): return "bicycles/user{}_{}".format(instance.owner.id, filename)
[docs]class Bicycle(models.Model): WAITING = 1 # 'WAITING' ACCEPTED = 2 # 'ACCEPTED' DECLINED = 3 # 'DECLINED' NO_PLACE = 4 # 'NO_PLACE' BIKE_STATUS = ( (WAITING, "Заявка рассматривается"), (ACCEPTED, "Одобрено"), (DECLINED, "Отказано"), (NO_PLACE, "Нет мест"), ) owner = models.ForeignKey(User, blank=True, null=True, verbose_name="Владелец") manufacturer = models.CharField("Производитель", max_length=255, default="Неизвестно", blank=True, null=True) model = models.CharField("Модель", max_length=255, default="Неизвестно", blank=True, null=True) info = models.TextField("Доп. описание", max_length=1024, blank=True, null=True) add_dttm = models.DateTimeField('Publish datetime', auto_now_add=True) photo = models.ImageField("Фотография", upload_to='bicycles/') # in case of name collision suffix autocreated verified = models.BooleanField("Данные верифицированы", default=False) # deprecated request_status = models.IntegerField("Статус заявки", default=WAITING, choices=BIKE_STATUS) class Meta: verbose_name = "велосипед" verbose_name_plural = "велосипеды" ordering = ['owner'] def __str__(self): return "Хозяин: {}, велосипед: {} {}".format(self.owner.__str__(), self.manufacturer, self.model)
[docs] def get_absolute_url(self): return reverse('bicycle:bicycle_detail', args=[self.id])
[docs] def image_tag(self): return'<img src={} style="max-width: 100%;">'.format(self.photo.url)
image_tag.allow_tags=True image_tag.short_description = "Фотография"
# Storage room, contains several places for bicycles
[docs]class Storage(models.Model): dorm = models.CharField("Расположение", max_length=255, default="Общежитие №6", blank=True, null=True) name = models.CharField("Название хранилища", max_length=255, default="Велокомната 6ки") class Meta: verbose_name = "велохранилище" verbose_name_plural = "велохранилища" def __str__(self): return '{}: {}'.format(self.dorm, self.name) # initialize storage with places named by natural numbers. 'num' - count of created places
[docs] def create_places(self, num): Place.objects.bulk_create([Place(storage=self, name=str(i)) for i in range(1, num + 1)])
[docs] def randomly_fill(self): accepted_bicycles_count = Bicycle.objects.filter(request_status=Bicycle.ACCEPTED, place=None).count() if accepted_bicycles_count > self.free_places: print("Too many bikes to place in this storage") return False accepted_bicycles = Bicycle.objects.filter(request_status=Bicycle.ACCEPTED) free_places = Place.objects.filter(bicycle=None) for bicycle, place in zip(accepted_bicycles, free_places[:accepted_bicycles_count]): place.bicycle = bicycle place.save() print("Done") return True
@property def total_places(self): return Place.objects.filter(storage=self).count() @property def free_places(self): return Place.objects.filter(storage=self, bicycle=None).count()
# One place in storage, may contain bicycle
[docs]class Place(models.Model): storage = models.ForeignKey(Storage) name = models.CharField("Место", max_length=255) bicycle = models.OneToOneField(Bicycle, on_delete=models.SET_NULL, default=None, blank=True, null=True, verbose_name="Велосипед") class Meta: verbose_name = "место" verbose_name_plural = "места" def __str__(self): return "{}, Место {}".format(self.storage.__str__(), self.name)