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 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.

View File

@ -1,6 +1,6 @@
import os
import datetime
from math import round, ceil
from math import ceil
from django.db import models
from django.urls import reverse
@ -78,20 +78,20 @@ class Place(Submittable, Taggable, Mapable):
# Get center position of LP-geocoordinates.
def average_latlon(cls, 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:
latitude = 0
longitude = 0
for place in place_list:
longitude += place.longitude
latitude += place.latitude
return {'latitude':latitude / amount, 'longitude': longitude / amount}
return {'latitude': latitude, 'longitude': longitude}
return {'latitude': latitude / amount, 'longitude': longitude / amount}
else:
# 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):
if self.placevotings.count() == 0:
@ -112,11 +112,14 @@ class Place(Submittable, Taggable, Mapable):
accuaries = [];
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))
accuaries.append(accuracy)
return ceil(sum(accuaries) / len(accuaries))
if len(accuaries) > 0:
return ceil(sum(accuaries) / len(accuaries))
else:
return 0
def __str__(self):
return self.name
@ -216,7 +219,7 @@ def auto_delete_file_on_change(sender, instance, **kwargs):
old_file.delete(save=False)
class PlaceVoting(PlaceAsset, Expireable):
class PlaceVoting(PlaceAsset):
vote = models.IntegerField(choices=PLACE_LEVELS)
def get_human_readable_level(self):

View File

@ -1,13 +1,14 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import datetime
from django.test import TestCase
from django.db import models
from django.contrib.auth.models import User
from django.utils import timezone
from lostplaces.models import Place
from lostplaces.models import Place, PlaceVoting
from lostplaces.tests.models import ModelTestCase
class PlaceTestCase(ModelTestCase):
@ -106,12 +107,12 @@ class PlaceTestCase(ModelTestCase):
an empty list
'''
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' % (
self.model.__name__
)
)
self.assertEqual(avg_latlon['longitude'], 0,
self.assertEqual(avg_latlon['longitude'], 7.6295628132604385,
msg='%s: (no places) average longitude missmatch' % (
self.model.__name__
)
@ -126,29 +127,167 @@ class PlaceTestCase(ModelTestCase):
)
def test_level_calculation(self):
place = self.place
explorer = place.submitted_by
explorer = self.place.submitted_by
PlaceVoting.objects.create(
submitted_by=explorer,
place=place,
vote=5,
expires_when=timezone.now()+self.delta
place=self.place,
vote=5
)
PlaceVoting.objects.create(
submitted_by=explorer,
place=place,
vote=2,
expires_when=timezone.now()+self.delta
place=self.place,
vote=2
)
PlaceVoting.objects.create(
submitted_by=explorer,
place=place,
vote=4,
expires_when=timezone.now()+self.delta
place=self.place,
vote=4
)
self.place.calculate_place_level()
self.assertEqual(
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(
submitted_by=explorer,
place=place,
vote=vote,
expires_when=timezone.now()+self.delta
vote=vote
)
messages.success(self.request, _('Vote submitted'))
else:
voting.expires_when=timezone.now()+self.delta
voting.submitted_when = timezone.now()
voting.vote = vote
messages.success(self.request, _('Your vote has been update'))