Compare commits

...

4 Commits

Author SHA1 Message Date
Leonhard Strohmidel
49301afe51 Adapting django version 2022-09-20 12:00:27 +02:00
Leonhard Strohmidel
624878624f Testing place level and level acccuracy 2022-09-20 12:00:09 +02:00
Leonhard Strohmidel
a2ee323fa4 Removing Expireable from PlaceVote 2022-09-20 11:59:51 +02:00
Leonhard Strohmidel
86c9de3213 Fixing average latlon function 2022-09-20 11:58:20 +02:00
4 changed files with 173 additions and 32 deletions

View File

@ -1,6 +1,6 @@
# lostplaces-backend # lostplaces-backend
lostplaces-backend is a django (3.x) based webproject. It once wants to become a software which allows a group of urban explorers to manage, document and share the locations of lost places while not exposing too much / any information to the public. lostplaces-backend is a django (4.x) based webproject. It once wants to become a software which allows a group of urban explorers to manage, document and share the locations of lost places while not exposing too much / any information to the public.
The software is currently in early development status, neither scope, datamodel(s) nor features are finalized yet. Therefore we would not recommend to download or install this piece of software anywhere - except your local django dev server. The software is currently in early development status, neither scope, datamodel(s) nor features are finalized yet. Therefore we would not recommend to download or install this piece of software anywhere - except your local django dev server.

View File

@ -1,6 +1,6 @@
import os import os
import datetime import datetime
from math import round, ceil from math import ceil
from django.db import models from django.db import models
from django.urls import reverse from django.urls import reverse
@ -78,20 +78,20 @@ class Place(Submittable, Taggable, Mapable):
# Get center position of LP-geocoordinates. # Get center position of LP-geocoordinates.
def average_latlon(cls, place_list): def average_latlon(cls, place_list):
amount = len(place_list) amount = len(place_list)
# Init fill values to prevent None
# China Corner in Münster
# Where I almost always eat lunch
# (Does'nt help losing wheight, tho)
longitude = 7.6295628132604385
latitude = 51.961922091398904
if amount > 0: if amount > 0:
latitude = 0
longitude = 0
for place in place_list: for place in place_list:
longitude += place.longitude longitude += place.longitude
latitude += place.latitude latitude += place.latitude
return {'latitude':latitude / amount, 'longitude': longitude / amount} return {'latitude': latitude / amount, 'longitude': longitude / amount}
else:
return {'latitude': latitude, 'longitude': longitude} # Location of China Corner in Münster
# Where I almost always eat lunch
# (Does'nt help losing wheight, tho)
return {'latitude': 51.961922091398904, 'longitude': 7.6295628132604385}
def calculate_place_level(self): def calculate_place_level(self):
if self.placevotings.count() == 0: if self.placevotings.count() == 0:
@ -112,11 +112,14 @@ class Place(Submittable, Taggable, Mapable):
accuaries = []; accuaries = [];
for vote in self.placevotings.all(): for vote in self.placevotings.all():
vote_age = timezone.now() - vote.created_when; vote_age = timezone.now() - vote.submitted_when;
accuracy = 100 - (100 / (place_age / vote_age)) accuracy = 100 - (100 / (place_age / vote_age))
accuaries.append(accuracy) accuaries.append(accuracy)
if len(accuaries) > 0:
return ceil(sum(accuaries) / len(accuaries)) return ceil(sum(accuaries) / len(accuaries))
else:
return 0
def __str__(self): def __str__(self):
return self.name return self.name
@ -216,7 +219,7 @@ def auto_delete_file_on_change(sender, instance, **kwargs):
old_file.delete(save=False) old_file.delete(save=False)
class PlaceVoting(PlaceAsset, Expireable): class PlaceVoting(PlaceAsset):
vote = models.IntegerField(choices=PLACE_LEVELS) vote = models.IntegerField(choices=PLACE_LEVELS)
def get_human_readable_level(self): def get_human_readable_level(self):

View File

@ -1,13 +1,14 @@
#!/usr/bin/env python #!/usr/bin/env python
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import datetime
from django.test import TestCase from django.test import TestCase
from django.db import models from django.db import models
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.utils import timezone from django.utils import timezone
from lostplaces.models import Place from lostplaces.models import Place, PlaceVoting
from lostplaces.tests.models import ModelTestCase from lostplaces.tests.models import ModelTestCase
class PlaceTestCase(ModelTestCase): class PlaceTestCase(ModelTestCase):
@ -106,12 +107,12 @@ class PlaceTestCase(ModelTestCase):
an empty list an empty list
''' '''
avg_latlon = Place.average_latlon([]) avg_latlon = Place.average_latlon([])
self.assertEqual(avg_latlon['latitude'], 0, self.assertEqual(avg_latlon['latitude'], 51.961922091398904,
msg='%s: (no places) average latitude missmatch' % ( msg='%s: (no places) average latitude missmatch' % (
self.model.__name__ self.model.__name__
) )
) )
self.assertEqual(avg_latlon['longitude'], 0, self.assertEqual(avg_latlon['longitude'], 7.6295628132604385,
msg='%s: (no places) average longitude missmatch' % ( msg='%s: (no places) average longitude missmatch' % (
self.model.__name__ self.model.__name__
) )
@ -126,29 +127,167 @@ class PlaceTestCase(ModelTestCase):
) )
def test_level_calculation(self): def test_level_calculation(self):
place = self.place explorer = self.place.submitted_by
explorer = place.submitted_by
PlaceVoting.objects.create( PlaceVoting.objects.create(
submitted_by=explorer, submitted_by=explorer,
place=place, place=self.place,
vote=5, vote=5
expires_when=timezone.now()+self.delta
) )
PlaceVoting.objects.create( PlaceVoting.objects.create(
submitted_by=explorer, submitted_by=explorer,
place=place, place=self.place,
vote=2, vote=2
expires_when=timezone.now()+self.delta
) )
PlaceVoting.objects.create( PlaceVoting.objects.create(
submitted_by=explorer, submitted_by=explorer,
place=place, place=self.place,
vote=4, vote=4
expires_when=timezone.now()+self.delta
) )
self.place.calculate_place_level()
self.assertEqual( self.assertEqual(
4, 4,
place.calculate_place_level() self.place.level,
msg='Expecting the place level to be 4'
) )
def test_level_calculation_no_votes(self):
self.place.calculate_place_level()
self.assertEqual(
5,
self.place.level,
msg='Expecting the default place level to be 5'
)
def test_level_mid_accuracy(self):
explorer = self.place.submitted_by
six_month_ago = datetime.timedelta(days=180)
self.place.submitted_when = timezone.now() - six_month_ago
votings = [
{
'date': timezone.now() - datetime.timedelta(days=170),
'vote': 5
},
{
'date': timezone.now() - datetime.timedelta(days=23),
'vote': 2
},
{
'date': timezone.now() - datetime.timedelta(days=1),
'vote': 4
}
]
for vote in votings:
voting = PlaceVoting.objects.create(
submitted_by=explorer,
place=self.place,
vote= vote['vote']
)
voting.submitted_when = vote['date']
voting.save()
self.assertEqual(
65,
self.place.calculate_voting_accuracy()
)
def test_level_high_accuracy(self):
explorer = self.place.submitted_by
six_month_ago = datetime.timedelta(days=180)
self.place.submitted_when = timezone.now() - six_month_ago
votings = [
{
'date': timezone.now() - datetime.timedelta(days=9),
'vote': 5
},
{
'date': timezone.now() - datetime.timedelta(days=14),
'vote': 2
},
{
'date': timezone.now() - datetime.timedelta(days=0),
'vote': 4
}
]
for vote in votings:
voting = PlaceVoting.objects.create(
submitted_by=explorer,
place=self.place,
vote= vote['vote']
)
voting.submitted_when = vote['date']
voting.save()
self.assertEqual(
96,
self.place.calculate_voting_accuracy()
)
def test_level_low_accuracy(self):
explorer = self.place.submitted_by
six_month_ago = datetime.timedelta(days=180)
self.place.submitted_when = timezone.now() - six_month_ago
votings = [
{
'date': timezone.now() - datetime.timedelta(days=177),
'vote': 5
},
{
'date': timezone.now() - datetime.timedelta(days=150),
'vote': 2
},
{
'date': timezone.now() - datetime.timedelta(days=100),
'vote': 4
}
]
for vote in votings:
voting = PlaceVoting.objects.create(
submitted_by=explorer,
place=self.place,
vote= vote['vote']
)
voting.submitted_when = vote['date']
voting.save()
self.assertEqual(
21,
self.place.calculate_voting_accuracy()
)
def test_level_accuracy_zero_timedelta(self):
explorer = self.place.submitted_by
six_month_ago = datetime.timedelta(days=180)
self.place.submitted_when = timezone.now() - six_month_ago
votings = [
{
'date': timezone.now() - datetime.timedelta(days=0),
'vote': 4
}
]
for vote in votings:
voting = PlaceVoting.objects.create(
submitted_by=explorer,
place=self.place,
vote= vote['vote']
)
voting.submitted_when = vote['date']
voting.save()
self.assertEqual(
100,
self.place.calculate_voting_accuracy(),
msg='Expecting the accurcy to be 100% when the vote is 0 time units old'
)

View File

@ -221,12 +221,11 @@ class PlaceVoteView(IsEligibleToSeePlaceMixin, View):
voting = PlaceVoting.objects.create( voting = PlaceVoting.objects.create(
submitted_by=explorer, submitted_by=explorer,
place=place, place=place,
vote=vote, vote=vote
expires_when=timezone.now()+self.delta
) )
messages.success(self.request, _('Vote submitted')) messages.success(self.request, _('Vote submitted'))
else: else:
voting.expires_when=timezone.now()+self.delta voting.submitted_when = timezone.now()
voting.vote = vote voting.vote = vote
messages.success(self.request, _('Your vote has been update')) messages.success(self.request, _('Your vote has been update'))