class Enventure(MPTTModel): name = models.CharField(max_length=50) parent = TreeForeignKey('self', blank=True, null=True, related_name='children') code = models.CharField(max_length=8, blank=True, null=True) location = LocationField(based_fields=['place'], zoom=7, default=Point(1.0, 1.0)) place = models.CharField(max_length=100, null=True, blank=True) phoneNumber = models.CharField(max_length=200, null=True, blank=True) email = models.EmailField(max_length=200, blank=True) age = models.IntegerField(default=0, blank=True, null=True) district = models.CharField(max_length=200, blank=True, null=True) is_active = models.NullBooleanField() dashboardAccess = models.NullBooleanField() account_type = models.CharField(max_length=200, blank=True, null=True) address = models.CharField(max_length=200, blank=True, null=True) gender = models.CharField(max_length=200, blank=True, null=True) created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True) def accounts(self): #sorting? return self.account_objects.all() def get_account(self, name): return self.account_objects.get(name=name)
class Petition(gis_models.Model): title = models.CharField(max_length=100) description = models.TextField() address_to = models.CharField(default='Pulchowk campus', max_length=20) img = models.FileField(default='gallery/construction.jpeg', upload_to='gallery/', null=True, blank=True) city = models.CharField(max_length=20, default='kathmandu') date_posted = models.DateTimeField(default=timezone.now) author = models.ForeignKey(User, on_delete=models.CASCADE) location = LocationField(based_fields=['pulchowk campus'], zoom=7, default=Point(85.3178166, 27.6828417)) class Meta: ordering = ['-date_posted'] def __str__(self): return self.title def get_absolute_url(self): return reverse('petition-home') def total_upvotes(self): return self.upvotes.count()
class Event(models.Model): name = models.CharField(max_length=255) description = models.TextField() location = models.CharField(max_length=255) start_time = models.DateTimeField(db_index=True) end_time = models.DateTimeField() url = models.URLField(blank=True) lat_lng = LocationField(based_fields=['location'], zoom=7) # lat = models.FloatField(null=True) # lng = models.FloatField(null=True) country_code = models.CharField(max_length=2, blank=True) continent_code = models.CharField(max_length=2, null=True) place = models.ForeignKey('place.Place', blank=True, null=True) slug = models.SlugField() image = models.FileField(upload_to="events/photos", null=False, blank=False) investors = models.ManyToManyField(Investor, blank=True) startups = models.ManyToManyField(Startup, blank=True) objects = EventManager() class Meta: ordering = ('start_time', ) def __str__(self): return self.name @property def day_of_month(self): return self.start_time.strftime('%d') @property def month_abbr(self): """Return the abbreviated month name with the abbr html tag.""" # for l10n, the abbreviated month strings include the tag return u'<abbr>{0:%b}</abbr>'.format(self.start_time) def get_absolute_url(self): return reverse('events:event', kwargs={ 'event': self.slug, }) def get_main_photo(self): return self.image.url def get_title(self): return self.name def indexing(self): from .search_indexes import EventIndex from config.es_client import es_client # EventIndex.init(using=es_client) obj = EventIndex( meta={'id': self.id}, name=self.name, start_time=self.start_time, description=self.description, ) obj.save(using=es_client) return obj.to_dict(include_meta=True)
class ProfileForm(forms.ModelForm): city= forms.CharField(widget= forms.TextInput (attrs={'id':'city'})) location = LocationField(based_fields=['city'], zoom=7, default=Point(1.0, 1.0)) class Meta: model = Profile fields = ['forename','city','location','claim','phonenumber','app_usage','sex','sexuality','birthday','figure','height','bust_size','languages','app_language','intrests','best_food','drinks','occupation','dress_style','upfront_booking','minimum_booking','custom_travel_from_price','price','scent','rating','upfront_booking_for_travels','minimum_booking_for_travels','meetup_location','booking_notes','travel_types','adult','profile_pic']
class Location(geo_models.Model): city = models.CharField(max_length=255) location = LocationField() org = models.ForeignKey(Organisation, null=True) def __str__(self): return self.city
class Facility(FacilityBaseModel): name = models.CharField(max_length=1000, blank=False, null=False) is_active = models.BooleanField(default=True) verified = models.BooleanField(default=False) district = models.IntegerField(choices=DISTRICT_CHOICES, blank=False) new_district = models.ForeignKey(District, on_delete=models.PROTECT, null=True, blank=True) local_body = models.ForeignKey(LocalBody, on_delete=models.PROTECT, null=True, blank=True) facility_type = models.IntegerField(choices=FACILITY_TYPES) address = models.TextField() location = LocationField(based_fields=["address"], zoom=7, blank=True, null=True) oxygen_capacity = models.IntegerField(default=0) phone_number = models.CharField(max_length=14, blank=True, validators=[phone_number_regex]) corona_testing = models.BooleanField(default=False) created_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True) def __str__(self): return f"{self.name}, {DISTRICT_CHOICES[self.district - 1][1]}" class Meta: verbose_name_plural = "Facilities"
class Facility(commons_models.TimeStampModel, commons_models.AddressModel): name = models.CharField(max_length=1000) facility_code = models.CharField(max_length=50) facility_type = models.ForeignKey(FacilityType, on_delete=models.CASCADE) owned_by = models.ForeignKey(commons_models.OwnershipType, on_delete=models.CASCADE) location = LocationField(based_fields=["address"], zoom=7, blank=True, null=True) local_body = models.ForeignKey( accounts_models.LocalBody, on_delete=models.SET_NULL, null=True, blank=True, ) phone_number = models.CharField( max_length=14, blank=True, validators=[commons_validators.phone_number_regex]) corona_testing = models.BooleanField(default=False) created_by = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True) total_patient = models.PositiveIntegerField(default=0) positive_patient = models.PositiveIntegerField(default=0) negative_patient = models.PositiveIntegerField(default=0) users = models.ManyToManyField( User, through="FacilityUser", related_name="facilities", through_fields=("facility", "user"), ) class Meta: verbose_name_plural = "Facilities" def __str__(self): return f"{self.name}" def save(self, *args, **kwargs) -> None: """ While saving, if the local body is not null, then district will be local body's district Overriding save will help in a collision where the local body's district and district fields are different. """ if self.local_body is not None: self.district = self.local_body.district if self.district is not None: self.state = self.district.state is_create = self.pk is None super().save(*args, **kwargs) if is_create: FacilityUser.objects.create(facility=self, user=self.created_by, created_by=self.created_by)
class Facility(FacilityBaseModel, FacilityPermissionMixin): name = models.CharField(max_length=1000, blank=False, null=False) is_active = models.BooleanField(default=True) verified = models.BooleanField(default=False) facility_type = models.IntegerField(choices=FACILITY_TYPES) location = LocationField(based_fields=["address"], zoom=7, blank=True, null=True) pincode = models.IntegerField(default=None, null=True) address = models.TextField() local_body = models.ForeignKey(LocalBody, on_delete=models.SET_NULL, null=True, blank=True) district = models.ForeignKey(District, on_delete=models.SET_NULL, null=True, blank=True) state = models.ForeignKey(State, on_delete=models.SET_NULL, null=True, blank=True) oxygen_capacity = models.IntegerField(default=0) phone_number = models.CharField(max_length=14, blank=True, validators=[phone_number_regex]) corona_testing = models.BooleanField(default=False) created_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True) users = models.ManyToManyField( User, through="FacilityUser", related_name="facilities", through_fields=("facility", "user"), ) class Meta: verbose_name_plural = "Facilities" def __str__(self): return f"{self.name}" def has_object_destroy_permission(self, request): return request.user.is_superuser def save(self, *args, **kwargs) -> None: """ While saving, if the local body is not null, then district will be local body's district Overriding save will help in a collision where the local body's district and district fields are different. """ if self.local_body is not None: self.district = self.local_body.district if self.district is not None: self.state = self.district.state is_create = self.pk is None super().save(*args, **kwargs) if is_create: FacilityUser.objects.create(facility=self, user=self.created_by, created_by=self.created_by) CSV_MAPPING = { "name": "Facility Name", "facility_type": "Facility Type", "address": "Address", "local_body__name": "Local Body", "district__name": "District", "state__name": "State", "oxygen_capacity": "Oxygen Capacity", "phone_number": "Phone Number", } CSV_MAKE_PRETTY = {"facility_type": (lambda x: REVERSE_FACILITY_TYPES[x])}
class Branch(models.Model): name = models.CharField(max_length=100) image = models.ImageField(blank=True, null=True) location = LocationField( default=Point(51.60431839178197, 46.115950578823686)) def __str__(self): return self.name
class Place(models.Model): parent_place = models.ForeignKey('self', null=True, blank=True) city = models.CharField(max_length=255) location = LocationField(based_fields=['city'], zoom=13, default=Point(1.0, 1.0)) objects = models.GeoManager() def __str__(self): return self.city
class Point(DescriptionedModel): location = LocationField(based_fields=['name'], default='POINT(0.0 0.0)', verbose_name=_('location')) phone = PhoneNumberField(_('phone'), max_length=12) objects = models.GeoManager() class Meta: ordering = ('routepointm2m__point_number', )
class Entity(models.Model): name = models.CharField(max_length=255) location = LocationField(based_fields=['address'], zoom=7, default=Point(0, 0)) manager = models.ManyToManyField(User) address = models.CharField(max_length=255, null=True, blank=True) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) def __str__(self): return self.name
class Facility(FacilityBaseModel): name = models.CharField(max_length=1000, blank=False, null=False) is_active = models.BooleanField(default=True) verified = models.BooleanField(default=False) facility_type = models.IntegerField(choices=FACILITY_TYPES) location = LocationField(based_fields=["address"], zoom=7, blank=True, null=True) address = models.TextField() local_body = models.ForeignKey(LocalBody, on_delete=models.SET_NULL, null=True, blank=True) district = models.ForeignKey(District, on_delete=models.SET_NULL, null=True, blank=True) state = models.ForeignKey(State, on_delete=models.SET_NULL, null=True, blank=True) oxygen_capacity = models.IntegerField(default=0) phone_number = models.CharField(max_length=14, blank=True, validators=[phone_number_regex]) corona_testing = models.BooleanField(default=False) created_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True) class Meta: verbose_name_plural = "Facilities" def __str__(self): return f"{self.name}" def save(self, *args, **kwargs) -> None: """ While saving, if the local body is not null, then district will be local body's district Overriding save will help in a collision where the local body's district and district fields are different. """ if self.local_body is not None: self.district = self.local_body.district if self.district is not None: self.state = self.district.state super().save(*args, **kwargs)
class BaseLocation(models.Model): address = models.CharField(max_length=250) lat_lng = LocationField(based_fields=['address'], zoom=7) class Meta: abstract = True @cached_property def lat(self): return self.lat_lng.y @cached_property def lng(self): return self.lat_lng.x
class Order(models.Model): user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.DO_NOTHING, related_name='orders') number_of_cups = models.IntegerField() location = LocationField(based_fields=['city'], zoom=7, default=Point(1.0, 1.0)) objects = models.GeoManager() order_status = models.BooleanField(default=1) order_time = models.DateTimeField(auto_now_add=True) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now_add=True) def __str__(self): return self.user.username
class Company(models.Model): name = models.CharField( max_length=50, unique=True) hq_location = LocationField( blank=True, null=True) country = CountryField( blank=True, null=True) notes = models.TextField( blank=True, null=True) class Meta: verbose_name_plural = 'Companies' def __str__(self): return self.name @property def latitude(self): if self.hq_location: return self.hq_location.x return '' @property def longitude(self): if self.hq_location: return self.hq_location.y return '' def distilleries(self): try: return Distillery.objects.filter(owner=self).order_by('name') except Exception as e: return [] distilleries.short_description = 'Distilleries' def owned_properties(self): try: distilleries = Distillery.objects.filter(owner=self).order_by('name') distillery_list = [f'<a href="{reverse("admin:entities_distillery_change", args=[d.pk])}">{d.name}</a>' for d in distilleries] return format_html('<br/>'.join(distillery_list)) except Exception as e: return '' owned_properties.short_description = 'Owned Distilleries' @property def flag(self): return format_html('<img src="' + self.country.flag + '"/>')
class Place(models.Model): chain = models.ForeignKey(Chain, related_name='places') city = models.CharField(max_length=255) plain_location = PlainLocationField(based_fields=[city], zoom=7, default=Point(1, 1)) geo_location = LocationField(based_fields=[city], zoom=7, default=Point(1, 1), srid=3857) def __str__(self): return self.city def get_distance_from(self, another_place): return self.geo_location.distance(another_place.geo_location)
class Place(models.Model): parent_place = models.ForeignKey('self', null=True, blank=True) street_address = models.CharField(max_length=255, null=True, blank=True) street = models.CharField(max_length=255, null=True, blank=True) zipcode = models.CharField(max_length=7, null=True, blank=True) city = models.CharField(max_length=255, null=True) state = models.CharField(max_length=255, null=True, blank=True) country = CountryField(default='US') location = LocationField(based_fields=['city'], zoom=7, default='POINT(0.0 0.0)', null=True, blank=True) objects = models.GeoManager() created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True) tags = TaggableManager(blank=True) STATUS = Choices('', 'published') @property def coordinates(self): return self.location.coords @property def latitude(self): return '%s' % self.location.x @property def longitude(self): return '%s' % self.location.y def __str__(self): # __unicode__ on Python 2 return '{2} {0}, {1}'.format(self.location.x, self.location.y, self.city) @property def address(self): return '{0} {1}, {2}, {3}, {4} {5}'.format(self.street_address, self.street, self.city, self.state, self.country, self.zipcode)
class Place(models.Model): city = models.CharField(max_length=255) location = LocationField(based_fields=['city'], zoom=7, default=Point(21.011524200439453, 52.22995487277945))
class Distillery(models.Model): name = models.CharField( max_length=50, unique=True) slug = models.SlugField( blank=True, null=True) location = models.CharField( max_length=40, blank=True, null=True) region = models.CharField( max_length=40, blank=True, null=True) owner_name = models.CharField( max_length=60, blank=True, null=True) year_established = models.IntegerField( blank=True, null=True) year_closed = models.IntegerField( blank=True, null=True) year_demolished = models.IntegerField( blank=True, null=True) geolocation = LocationField(based_fields=['name'], blank=True, null=True) image_url = models.CharField( max_length=200, blank=True, null=True) logo_url = models.CharField( max_length=200, blank=True, null=True) owner = models.ForeignKey('Company', on_delete=models.SET_NULL, blank=True, null=True) class Meta: verbose_name_plural = 'Distilleries' def __str__(self): return self.name @property def latitude(self): return self.geolocation.x @property def longitude(self): return self.geolocation.y @property def coordinates(self): if self.geolocation: return format_coordinates(self.geolocation.x, self.geolocation.y) return '--' @property def image(self): if self.image_url: return self.image_url for scotch in Scotch.objects.filter(distillery=self): if scotch.image_url: return scotch.image_url return settings.PLACEHOLDER_IMAGE def save(self, *args, **kwargs): if not self.slug: self.slug = slugify(self.name) # Get or create if not self.owner and self.owner_name: company, _ = Company.objects.get_or_create(name=self.owner_name) self.owner = company return super().save(*args, **kwargs)
class details(models.Model): #FIR DETAILS ACC_ID = models.CharField(max_length=15, primary_key=True, verbose_name = 'Accident ID') CIRCLE = models.ForeignKey(circles, verbose_name = 'Circle') DIST = models.CharField(max_length=5, verbose_name = 'District') RNG = models.CharField(max_length=5, verbose_name = 'Range') PS = ChainedForeignKey(policestation, chained_field = "CIRCLE", chained_model_field = "CIRCLE", show_all=False, auto_choose=True, sort=True, verbose_name = 'Police Station') FIRNO = models.PositiveIntegerField( verbose_name = 'FIR No.', validators=[MaxValueValidator(9999), MinValueValidator(1)]) FIR_DATE = models.DateField('FIR Date') DATE_OCC = models.DateField('Accident Date') TIME_KNOWN =models.CharField(choices=TIME_KNOWN_CHOICES, max_length = 30, verbose_name = 'Time Known') TIME_OCC = models.CharField(max_length=4,default='',blank=True, verbose_name = 'Time') OF_SECTION = models.ForeignKey(sections, verbose_name = 'Section') MVA_NAME =models.ForeignKey(mva_act,blank=True, null=True,verbose_name = 'MVA Act') ACC_PHOTO = models.FileField(upload_to='documents/',blank=True,null=True,default='', verbose_name = 'Picture of Accident ') ACC_PHOTO1 = models.FileField(upload_to='documents/',blank=True,null=True,default='', verbose_name = 'Picture of Accident ') ACC_PHOTO2 = models.FileField(upload_to='documents/',blank=True,null=True,default='', verbose_name = 'Picture of Accident ') ACC_PHOTO3 = models.FileField(upload_to='documents/',blank=True,null=True,default='', verbose_name = 'Picture of Accident ') FIR_PHOTO = models.FileField(upload_to='documents/',blank=True,null=True,default='', verbose_name = 'Picture of FIR ') #END OF FIR DETAILS NAME_IO = models.CharField(max_length=140,blank=True, default='', verbose_name = 'Name Of IO') PIS_NUM = models.CharField(max_length=140,blank=True, default='', verbose_name = 'PIS No.') MOB_NUM = models.CharField(max_length=11,blank=True, default='', verbose_name = 'Mobile No.') #LOCATION PLACE_OCC = models.CharField(max_length=140,blank=True, default='', verbose_name = 'Place of Occurence') map_loc = LocationField(based_fields=['PLACE_OCC'], zoom=7, verbose_name = 'Lat/Long', default=Point(77.1025, 28.7041)) AREA =models.CharField(choices=AREA_CHOICES, max_length = 30, verbose_name = 'Area') ACC_SKETCH_PHOTO = models.FileField(upload_to='documents/',blank=True,null=True,default='', verbose_name = 'Sketch of Accident') AREA_TYPE = models.ForeignKey(area_type, verbose_name = 'Area Type') AREA_TYPE_OTHER = models.CharField(max_length=50,blank=True, default='', null = True, verbose_name = 'Other Area Type') '''AREA_TYPE2=models.ForeignKey(area_type2, verbose_name = 'Area Type 2') AREA_TYPE2_OTHER=models.ForeignKey(area_type2_oth,default='',blank=True, null = True, verbose_name = 'Other Area Type 2')''' AREA_TYPE2 = models.ForeignKey(location, blank=True,verbose_name = 'Location', default=11) ROAD = ChainedForeignKey( roads, chained_field = "CIRCLE", chained_model_field = "CIRCLE", show_all=False, auto_choose=True, sort=True, verbose_name = 'Road') ROADNAME = models.CharField(max_length=150, verbose_name = 'Road Name') MINORROADNAME = models.CharField(max_length=150, default='',blank=True, verbose_name = 'Minor Road') ROAD_LEVEL = models.CharField(choices=ROAD_LEVEL_Choices,blank=True, max_length = 30, verbose_name = 'Road Level') GROUND_LEVEL=models.CharField(choices=GROUND_LEVEL_Choices,blank=True, max_length = 30, verbose_name = 'Ground Level') FLYOVER =models.CharField(choices=FLYOVER_CHOICES, max_length = 30,blank=True, verbose_name = 'Flyover') UNDERPASS =models.CharField(choices=UNDERP_CHOICES, max_length = 30,blank=True, verbose_name = 'Underpass') JUNCTION_CONTROL=models.CharField(choices=JUNC_CTRL_Choices,blank=True, max_length = 30, verbose_name = 'Junction') ROAD_TYPE=models.ForeignKey(road_type, verbose_name = 'Road Type') ROAD_TYPE1=models.CharField(choices=ROAD_TYPE1_Choices,blank=True, max_length = 30, verbose_name = 'Road Type 1') SEPERATION = models.ForeignKey(seperation, verbose_name = 'Separation') ROAD_CHARACTER = models.ForeignKey(road_character, verbose_name = 'Character of Road') ROAD_CHARACTER_REMARKS= models.CharField(max_length=50,blank=True, default='', verbose_name = 'Road Character-Remarks') SURFACE_TYPE = models.ForeignKey(surface_type, verbose_name = 'Surface Type') SURFACE_CONDITION = models.ForeignKey(surface_condition, verbose_name = 'Surface Condition') SURFACE_CONDITION_REMARKS = models.CharField(max_length=50,blank=True, default='', verbose_name = 'Surface Condition-Remarks') ROAD_CONDITION = models.ForeignKey(road_condition, verbose_name = 'Road Condition') ROAD_CONDITION_REMARKS = models.CharField(max_length=50,blank=True, default='', verbose_name = 'Road Condition- Remarks') APZ = models.CharField(max_length=50,blank=True, default='', verbose_name = 'Accident Prone Zone') APZ_TYPE = models.CharField(max_length=50,blank=True, default='', verbose_name = 'APZ Type') ILLUMINATION = models.CharField(max_length=50,blank=True, choices=YES_NO_CHOICES, verbose_name = 'Illumination') YES_ILLUMINATION = models.CharField(max_length=50,blank=True, choices=ILLUMINATION_CHOICES, verbose_name = 'Illumination Working') ROAD_MARKING = models.CharField(max_length=50,blank=True, choices=ROAD_MARKING_CHOICES, verbose_name = 'Road Markings') ROAD_SIGN = models.CharField(max_length=50,blank=True, choices=ROAD_SIGN_CHOICES, verbose_name = 'Road Signs') #END OF LOCATION #END OF REMARKS #DOUBTFUL '''SELF_TYPE = models.ForeignKey(self_type, default=0,blank=True)
class Route(DescriptionedModel): points = models.ManyToManyField('Point', through='RoutePointM2M', verbose_name=_('points')) center = LocationField(verbose_name=_('center'), based_fields=['name'], default='POINT(0.0 0.0)') saved_by = models.ManyToManyField(Tourist, through='SavedRoutes', blank=True, related_name='saved_by', verbose_name=_('saved_by')) tourist = models.ForeignKey(Tourist, on_delete=models.CASCADE, verbose_name=_('tourist')) popularity = models.PositiveIntegerField(_('popularity'), blank=True, null=True) cost = models.PositiveIntegerField(_('cost'), blank=True, null=True) extremality = models.PositiveSmallIntegerField(_('extremality'), blank=True, null=True) objects = models.GeoManager() @cached_property def formatted_points(self): data = dict(points=[]) for p in self.tourist_points: point = dict(location=p.location.get_coords()) point['name'] = p.name point['description'] = p.description data['points'].append(point) return data @cached_property def length(self): # километры length = sum( a.location.distance(b.location) for (a, b) in self._pairwise(self.tourist_points)) * 100 return round(length) @cached_property def pairwised_points(self): """route.points.all() -> (point0, points1), (point1, point2), (point2, point3), ...""" return self._pairwise(self.tourist_points) @staticmethod def _pairwise(iterable): """iterable -> (iterable[0], iterable[1]), (iterable[1], iterable[2]), ...)""" a, b = tee(iterable) next(b, None) return zip(a, b) @cached_property def tourist_points(self): return self.points.filter(companypoint__isnull=True, adminpoint__isnull=True) @cached_property def company_points(self): return self.points.filter(companypoint__isnull=False, adminpoint__isnull=True) @cached_property def admin_points(self): return self.points.filter(adminpoint__isnull=False, companypoint__isnull=True) def __str__(self): return self.name
class SpatialPlace(models.Model): parent_place = models.ForeignKey('self', blank=True, null=True) city = models.CharField(max_length=255) location = LocationField(based_fields=['city'], zoom=7)
class Place(models.Model): city = models.CharField(max_length=255) location = LocationField(based_fields=['city'], zoom=7, default=Point(1.0, 1.0)) objects = GeoManager()
class Ride(models.Model): def __init__(self, *args, **kwargs): super(Ride, self).__init__(*args, **kwargs) self.previous_state = self.state state_choices = ( ('new', 'New'), ('selecting', 'Selecting'), ('requested', 'Requested'), ('accepted', 'Accepted'), ('driving', 'Driving'), ('dropoff', 'Dropping Off'), ('payment', 'Payment'), ('rating', 'Rating'), ('declined', 'Declined'), ('canceled', 'Canceled'), ('finalized', 'Finalized'), ) payment_choices = (('cash', 'Cash'), ('mpesa', 'M-Pesa')) customer = models.ForeignKey('delivery_api.User', related_name='customer_ride', null=True) driver = models.ForeignKey('delivery_api.User', null=True, blank=True, related_name='driver_ride') origin_text = models.CharField(max_length=500, null=True, blank=True) origin = LocationField(based_fields=['origin_text'], zoom=7, default=Point(1.0, 1.0)) destination_text = models.CharField(max_length=500, null=True, blank=True) destination = LocationField(based_fields=['destination_text'], zoom=7, default=Point(1.0, 1.0)) customer_start_location = models.PointField(null=True) driver_start_location = models.PointField(null=True) ride_start_location = models.PointField(null=True) ride_end_location = models.PointField(null=True) # payout = models.ForeignKey('payouts.Payout', null=True, # related_name='payout_rides', # on_delete=models.SET_NULL) @property def start(self): if self.ridelog_set.filter(state='driving').count(): return self.ridelog_set.order_by('created').filter( state='driving')[0].created if self.state in ['accepted', 'requested']: return now() return self.created @property def end(self): if self.ridelog_set.filter(state='dropoff').count(): return self.ridelog_set.order_by('created').filter( state='dropoff')[0].created if self.state in ['accepted', 'driving', 'dropoff']: return now() return self.updated @property def mpesa_payment(self): if self.payment_set.count(): return self.payment_set.order_by('-created').all()[0] return None state = FSMField(default='new', choices=state_choices) payment_method = models.CharField(max_length=30, choices=payment_choices, blank=True, null=True, verbose_name='method') customer_rating = models.IntegerField(null=True, blank=True, verbose_name='rating cs') driver_rating = models.IntegerField(null=True, blank=True, verbose_name='rating rd') created = CreationDateTimeField() updated = ModificationDateTimeField() fare = MoneyField(decimal_places=2, max_digits=20, default_currency='KES', null=True) live_fare = MoneyField(decimal_places=2, max_digits=20, default_currency='KES', null=True) driver_distance = JSONField(null=True) distance = JSONField(null=True) live_distance = JSONField(null=True) @property def route(self): logs = self.route_points return [{'lat': log.coords[1], 'lng': log.coords[0]} for log in logs] @property def route_points(self): points = [] try: until = self.end if self.end else now() ls = LocationLog.objects.filter(user=self.driver, created__gte=self.start, created__lte=until) for l in ls.all(): points.append(l.location) except ValueError: pass return points @property def waypoints_distance(self): prev = None dist = 0 for loc in self.route_points: if prev: dist += prev.distance(loc) prev = loc return "%.1f" % (dist * 100) def update_route(self): if self.driver and self.state in ['driving', 'dropoff']: self.destination = self.driver.position if not self.destination: self.destination = self.origin if self.state in ['requested', 'accepted'] and self.origin: self.driver_distance = calculate_distance(self.origin, self.driver.position) if self.state in ['driving', 'dropoff' ] and self.origin and self.destination: self.live_distance = calculate_distance(self.origin, self.driver.position) if not self.destination: self.destination = self.origin if self.live_distance: self.live_fare = Money( calculate_fare(self.live_distance['meters']), 'KES') if self.driver and self.driver.position and self.customer.position and self.state in [ 'accepted' ]: self.driver_distance = calculate_distance(self.driver.position, self.customer.position) # Fare on basis of Waypoints Distance if self.state in ['dropoff', 'payment', 'finalized']: self.distance = { 'distance': '%s km' % self.waypoints_distance, 'duration': '-', 'distance_meters': 1000 * float(self.waypoints_distance) } self.fare = Money( calculate_fare(int(1000 * float(self.waypoints_distance))), 'KES') @transition(field=state, source='new', target='requested') def request(self): self.driver.state = 'requested' self.driver.save() @transition(field=state, source='requested', target='accepted') def accept(self): self.driver.state = 'driving' self.driver.save() @transition(field=state, source='new', target='declined') def decline(self): self.driver.state = 'available' self.driver.save() @transition(field=state, source='*', target='canceled') def cancel(self): self.driver.state = 'not-responding' self.driver.save() @transition(field=state, source='accepted', target='dropoff') def dropoff(self): self.driver.state = 'driving' self.driver.save() @transition(field=state, source='*', target='payment') def payment(self): self.driver.state = 'driving' self.driver.save() @transition(field=state, source='*', target='rating') def rate(self): self.driver.state = 'driving' self.driver.save() @transition(field=state, source='*', target='finalized') def finalize(self): self.driver.state = 'available' self.driver.save() @property def meters(self): try: return self.distance['meters'] except KeyError: return 0 @property def orig(self): return "{},{}".format(self.origin[0], self.origin[1]) @property def dest(self): return "{},{}".format(self.destination[0], self.destination[1]) def __unicode__(self): return 'Ride {0}'.format(self.id) def save(self, *args, **kwargs): self.update_route() if self.driver and self.state == 'new': self.state = 'requested' # If payment method if self.payment_method == 'cash' and self.state == 'payment': self.state = 'rating' super(Ride, self).save(*args, **kwargs)
class Profile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) forename = models.CharField(max_length=100) city = models.CharField(max_length=255, verbose_name='city based in') location = LocationField(based_fields=['city'], zoom=7, default=Point(1.0, 1.0)) latitude = models.DecimalField(max_digits=10, decimal_places=6, default=0.000001) longitude = models.DecimalField(max_digits=10, decimal_places=6, default=0.000001) claim = models.CharField(max_length=100) phonenumber = models.CharField(max_length=20) app_usage = models.BooleanField( default=False, verbose_name='would you love to use the app') sex = models.CharField(choices=SEX, max_length=100) sexuality = models.CharField(choices=SEXUALITY, max_length=100, verbose_name='your sexuality') birthday = models.DateField(blank=True, null=True) figure = models.CharField(choices=FIGURE, max_length=100) height = models.PositiveIntegerField(default=0) bust_size = models.CharField(choices=BUST_SIZE, max_length=100) languages = models.CharField(choices=LANGUAGES, max_length=100, verbose_name='spoken languages') app_language = models.CharField(choices=APP_LANGUAGES, max_length=100) intrests = models.CharField(max_length=100, verbose_name='your intrests') best_food = models.CharField(max_length=100) drinks = models.CharField(max_length=100) occupation = models.CharField(max_length=100) dress_style = models.CharField(max_length=100) upfront_booking = models.PositiveIntegerField(default=0) minimum_booking = models.PositiveIntegerField(default=0) custom_travel_from_price = models.PositiveIntegerField(default=0) price = models.IntegerField(default=0) scent = models.CharField(max_length=100) rating = models.IntegerField(default=0) upfront_booking_for_travels = models.PositiveIntegerField(default=0) minimum_booking_for_travels = models.PositiveIntegerField(default=0) meetup_location = MultiSelectField(choices=MEETUP_LOCATIONS, max_length=100) description = models.CharField(max_length=100, verbose_name='brief description') booking_notes = models.CharField(max_length=100) travel_types = MultiSelectField(choices=TRAVEL_TYPES, max_length=100) adult = models.BooleanField(default=False, verbose_name='are you over 18years of age?') views = models.PositiveIntegerField(default=0, verbose_name='number of views') profile_pic = models.ImageField(default='default.jpg', upload_to='profile_pics') def save(self, *args, **kwargs): self.latitude = self.location.y self.longitude = self.location.x super(Profile, self).save(*args, **kwargs) class Meta: verbose_name = 'Profile' verbose_name_plural = 'Profiles' def get_absolute_url(self): return reverse('users:user_public_profile', kwargs={'user_username': self.user.username}) def __str__(self): return '{} profile location : {}'.format(self.user.username, self.city)
class Community(models.Model): suburb = models.CharField(max_length=255) city = models.CharField(max_length=255) zipcode = models.CharField(max_length=255) location = LocationField(based_fields=['suburb', 'city', 'zipcode'])
class Company(models.Model): user = models.ForeignKey(User, null=True, on_delete=models.SET_NULL) name = models.CharField(max_length=100) name_en = models.CharField(max_length=100) description = models.CharField(max_length=3000, null=True) logo = models.CharField(max_length=200, null=True) cover = models.CharField(max_length=200, null=True) industry = models.ForeignKey(Industry, on_delete=models.CASCADE) founded = models.DateField(null=True, blank=True) company_slug = models.SlugField(max_length=255, unique=True, db_index=True) benefit = models.ManyToManyField(Benefit, blank=True) size = models.CharField(choices=settings.OFFICE_SIZE_CHOICES, max_length=2) is_deleted = models.BooleanField(default=False) has_legal_issue = models.BooleanField(default=False) created = models.DateTimeField(auto_now=True) approved = models.BooleanField(default=False) user_generated = models.BooleanField(default=False) city = models.ForeignKey(City, on_delete=models.CASCADE) tell = models.CharField(max_length=14, blank=True) site = models.CharField(max_length=100, blank=True) address = models.CharField(max_length=200, blank=True) location_point = LocationField(based_fields=['city'], zoom=7, default=Point(0, 0), null=True, blank=True) working_hours_start = models.TimeField(null=True) working_hours_stop = models.TimeField(null=True) work_life_balance = models.FloatField(default=0) salary_benefit = models.FloatField(default=0) security = models.FloatField(default=0) management = models.IntegerField( default=0) culture = models.FloatField(default=0) over_all_rate = models.FloatField(default=0) salary_avg = models.FloatField(default=0) salary_max = models.FloatField(default=0) salary_min = models.FloatField(default=0) recommend_to_friend = models.IntegerField(default=0) total_review = models.IntegerField(default=0) total_interview = models.IntegerField(default=0) view = models.ManyToManyField(User, related_name='company_views') total_view = models.IntegerField(default=0) is_cheater = models.BooleanField(default=False) # for company that try to cheat and advertise, 1 point in best company is_famous = models.BooleanField(default=False) # 2 points in best company has_panel_moderator = models.BooleanField(default=False) # 1 point is_big_company = models.BooleanField(default=False) # 1 point company_score = models.FloatField(default=0) # company rate for best company def __str__(self): return self.name def save(self, *args, **kwargs): cache.delete(settings.BEST_COMPANY_LIST) cache.delete(settings.DISCUSSED_COMPANY_LIST) cache.delete(settings.TOTAL_COMPANY) self.is_big_company = False if self.size in ['VS', 'S'] else True self.handle_company_score() for review in self.companyreview_set.all(): review.has_legal_issue = self.has_legal_issue review.save() for interview in self.interview_set.all(): interview.has_legal_issue = self.has_legal_issue interview.save() super().save(*args, **kwargs) def handle_company_score(self): review_count = self.companyreview_set.filter(is_deleted=False, approved=True).count() interview_count = self.interview_set.filter(is_deleted=False, approved=True).count() review_point = (review_count + interview_count) review_point = 20 if review_point > 20 else review_point review_point /= 4 # max must be 5 bool_point = (2*self.is_famous) + self.has_panel_moderator + self.is_big_company + (not self.is_cheater) over_all_rate = self.companyreview_set.filter(is_deleted=False, approved=True). \ aggregate(models.Avg('over_all_rate')) over_all_rate = over_all_rate['over_all_rate__avg'] if over_all_rate['over_all_rate__avg'] else 0 self.company_score = round((bool_point + review_point + over_all_rate)/3, 1) @property def get_media(self): return self.logo def get_absolute_url(self): return '/company/{}'.format(self.company_slug) def handle_company_review_statics(self): result_company_review = self.companyreview_set.filter(is_deleted=False, approved=True).exclude(salary=0). \ aggregate(models.Avg('salary'), models.Max('salary'), models.Min('salary'), models.Avg('work_life_balance'), models.Avg('salary_benefit'), models.Avg('security'), models.Avg('management'), models.Avg('culture'), models.Avg('over_all_rate')) result_list = self.companyreview_set.filter(is_deleted=False, approved=True).values_list('recommend_to_friend') total_result_list = len(result_list) total_result_list_true = len(list(filter(lambda x: x[0], result_list))) temp_data = { 'total_review': total_result_list, 'salary_avg': result_company_review['salary__avg'], 'salary_max': result_company_review['salary__max'], 'salary_min': result_company_review['salary__min'], 'work_life_balance': result_company_review['work_life_balance__avg'], 'salary_benefit': result_company_review['salary_benefit__avg'], 'security': result_company_review['security__avg'], 'management': result_company_review['management__avg'], 'culture': result_company_review['culture__avg'], 'over_all_rate': result_company_review['over_all_rate__avg'], 'recommend_to_friend': round(total_result_list_true / total_result_list) * 100 if total_result_list else 0, } self.total_review = temp_data['total_review'] self.salary_avg = round(temp_data['salary_avg']/1000000, 1) if temp_data['salary_avg'] else 0 self.salary_max = round(temp_data['salary_max']/1000000, 1) if temp_data['salary_max'] else 0 self.salary_min = round(temp_data['salary_min']/1000000, 1) if temp_data['salary_min'] else 0 self.work_life_balance = round(temp_data['work_life_balance'], 1) if temp_data['work_life_balance'] else 0 self.salary_benefit = round(temp_data['salary_benefit'], 1) if temp_data['salary_benefit'] else 0 self.security = round(temp_data['security'], 1) if temp_data['security'] else 0 self.management = round(temp_data['management'], 1) if temp_data['management'] else 0 self.culture = round(temp_data['culture'], 1) if temp_data['culture'] else 0 self.over_all_rate = round(temp_data['over_all_rate'], 1) if temp_data['over_all_rate'] else 0 self.recommend_to_friend = round(temp_data['recommend_to_friend'], 2) if temp_data['recommend_to_friend'] else 0 self.handle_company_score() self.save() def handle_company_interview_statics(self): self.total_interview = self.interview_set.filter(is_deleted=False, approved=True).count() self.handle_company_score() self.save()