Remove groups and start working on F2F location sharing
This commit is contained in:
parent
218abab16f
commit
875fa56cc4
9 changed files with 34 additions and 155 deletions
|
@ -2,7 +2,7 @@ from django.contrib import admin
|
||||||
from django.contrib.admin import register
|
from django.contrib.admin import register
|
||||||
from django.contrib.auth.admin import UserAdmin
|
from django.contrib.auth.admin import UserAdmin
|
||||||
|
|
||||||
from .models import Friend, FriendLocation, LocationSharingGroup
|
from .models import Friend, FriendLocation
|
||||||
|
|
||||||
admin.site.register(Friend, UserAdmin)
|
admin.site.register(Friend, UserAdmin)
|
||||||
|
|
||||||
|
@ -14,10 +14,3 @@ class FriendLocationAdmin(admin.ModelAdmin):
|
||||||
('Place', {'fields': ('latitude', 'longitude')}),
|
('Place', {'fields': ('latitude', 'longitude')}),
|
||||||
('Dates', {'fields': ('start_date', 'end_date')}),
|
('Dates', {'fields': ('start_date', 'end_date')}),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
@register(LocationSharingGroup)
|
|
||||||
class LocationSharingGroupAdmin(admin.ModelAdmin):
|
|
||||||
list_display = [
|
|
||||||
'name',
|
|
||||||
]
|
|
||||||
|
|
26
map/migrations/0009_auto_20190303_1943.py
Normal file
26
map/migrations/0009_auto_20190303_1943.py
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
# Generated by Django 2.1.7 on 2019-03-03 18:43
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('map', '0008_auto_20190303_1834'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='locationsharinggroup',
|
||||||
|
name='friends',
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='friend',
|
||||||
|
name='shares_location_to',
|
||||||
|
field=models.ManyToManyField(related_name='is_shared_location_by', to=settings.AUTH_USER_MODEL),
|
||||||
|
),
|
||||||
|
migrations.DeleteModel(
|
||||||
|
name='LocationSharingGroup',
|
||||||
|
),
|
||||||
|
]
|
|
@ -13,6 +13,8 @@ class BaseModel(models.Model):
|
||||||
|
|
||||||
|
|
||||||
class Friend(AbstractUser):
|
class Friend(AbstractUser):
|
||||||
|
shares_location_to = models.ManyToManyField('Friend', related_name='is_shared_location_by')
|
||||||
|
|
||||||
def get_display_name(self):
|
def get_display_name(self):
|
||||||
display_name = super().get_full_name()
|
display_name = super().get_full_name()
|
||||||
if not display_name:
|
if not display_name:
|
||||||
|
@ -20,24 +22,6 @@ class Friend(AbstractUser):
|
||||||
|
|
||||||
return display_name
|
return display_name
|
||||||
|
|
||||||
@property
|
|
||||||
def _relatives_set(self):
|
|
||||||
relative_set = set()
|
|
||||||
for group in self.location_sharing_groups.all():
|
|
||||||
for relative in group.friends.all():
|
|
||||||
relative_set.add(relative)
|
|
||||||
return relative_set
|
|
||||||
|
|
||||||
@property
|
|
||||||
def relatives(self):
|
|
||||||
return list(self._relatives_set)
|
|
||||||
|
|
||||||
@property
|
|
||||||
def relatives_with_self(self):
|
|
||||||
relatives = self._relatives_set
|
|
||||||
relatives.add(self)
|
|
||||||
return list(relatives)
|
|
||||||
|
|
||||||
|
|
||||||
class FriendLocation(BaseModel):
|
class FriendLocation(BaseModel):
|
||||||
latitude = CoordinateField()
|
latitude = CoordinateField()
|
||||||
|
@ -70,9 +54,3 @@ class FriendLocation(BaseModel):
|
||||||
if self.end_date:
|
if self.end_date:
|
||||||
html += f' until {self.end_date}'
|
html += f' until {self.end_date}'
|
||||||
return html
|
return html
|
||||||
|
|
||||||
|
|
||||||
class LocationSharingGroup(models.Model):
|
|
||||||
name = models.CharField(max_length=250)
|
|
||||||
friends = models.ManyToManyField(Friend, related_name='location_sharing_groups', blank=True)
|
|
||||||
|
|
||||||
|
|
|
@ -1,19 +0,0 @@
|
||||||
{% extends 'map/base.html' %}
|
|
||||||
{% load crispy_forms_filters %}
|
|
||||||
|
|
||||||
{% block title %}Create a group{% endblock %}
|
|
||||||
{% block h1 %}Create a group{% endblock %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
<div class="alert alert-info">
|
|
||||||
<h4 class="alert-heading">Notice</h4>
|
|
||||||
<div>
|
|
||||||
All members in this group can see your location.
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<form method="post">
|
|
||||||
{% csrf_token %}
|
|
||||||
{{ form|crispy }}
|
|
||||||
<button type="submit" class="btn btn-primary">Create</button>
|
|
||||||
</form>
|
|
||||||
{% endblock %}
|
|
|
@ -1,20 +0,0 @@
|
||||||
{% extends 'map/base.html' %}
|
|
||||||
{% load crispy_forms_filters %}
|
|
||||||
|
|
||||||
{% block title %}Leave a group{% endblock %}
|
|
||||||
{% block h1 %}Leave a group{% endblock %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
<div class="alert alert-warning">
|
|
||||||
<h4 class="alert-heading">Are you sure?</h4>
|
|
||||||
<div>
|
|
||||||
If you leave this group you will not be able to see the location of people in the group.
|
|
||||||
If you're the last member of the group, it will be deleted.
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<form method="post">
|
|
||||||
{% csrf_token %}
|
|
||||||
<button type="submit" class="btn btn-warning">Yes, I'm sure</button>
|
|
||||||
<a href="{% url 'manage-groups' %}" class="btn btn-secondary">No, cancel</a>
|
|
||||||
</form>
|
|
||||||
{% endblock %}
|
|
|
@ -1,27 +0,0 @@
|
||||||
{% extends 'map/base.html' %}
|
|
||||||
{% load crispy_forms_filters %}
|
|
||||||
|
|
||||||
{% block title %}Manage your groups{% endblock %}
|
|
||||||
{% block h1 %}Manage your groups{% endblock %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
<div class="alert alert-info">
|
|
||||||
<h4 class="alert-heading">Notice</h4>
|
|
||||||
<div>
|
|
||||||
Here you can list and manage groups you belong to. All members in these groups can see your location.
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<ul class="list-group">
|
|
||||||
{% for group in groups %}
|
|
||||||
<li class="list-group-item d-flex justify-content-between align-items-center">
|
|
||||||
{{ group.name }}
|
|
||||||
<span>
|
|
||||||
<span class="badge badge-secondary badge-pill">{{ group.friends.count }}</span>
|
|
||||||
<a href="{% url 'leave-group' group.pk %}" class="btn btn-sm btn-secondary">Leave</a>
|
|
||||||
</span>
|
|
||||||
</li>
|
|
||||||
{% endfor %}
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
{% endblock %}
|
|
|
@ -24,11 +24,15 @@
|
||||||
attribution: '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
|
attribution: '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
|
||||||
}).addTo(map);
|
}).addTo(map);
|
||||||
let marker = null;
|
let marker = null;
|
||||||
{% for relative in friend.relatives_with_self %}
|
{% for relative in friend.is_shared_location_by.all %}
|
||||||
{% with relative.location as location %}
|
{% with relative.location as location %}
|
||||||
marker = L.marker([{{ location.latitude_str }}, {{ location.longitude_str }}]).addTo(map);
|
marker = L.marker([{{ location.latitude_str }}, {{ location.longitude_str }}]).addTo(map);
|
||||||
marker.bindPopup("{{ location.safe_html|safe }}");
|
marker.bindPopup("{{ location.safe_html|safe }}");
|
||||||
{% endwith %}
|
{% endwith %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
{% with friend.location as location %}
|
||||||
|
marker = L.marker([{{ location.latitude_str }}, {{ location.longitude_str }}]).addTo(map);
|
||||||
|
marker.bindPopup("{{ location.safe_html|safe }}");
|
||||||
|
{% endwith %}
|
||||||
</script>
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -7,9 +7,6 @@ urlpatterns = [
|
||||||
path('change-location', views.EditLocationView.as_view(), name='change-location'),
|
path('change-location', views.EditLocationView.as_view(), name='change-location'),
|
||||||
path('add-location', views.AddLocationView.as_view(), name='add-location'),
|
path('add-location', views.AddLocationView.as_view(), name='add-location'),
|
||||||
path('delete-location', views.DeleteLocationView.as_view(), name='delete-location'),
|
path('delete-location', views.DeleteLocationView.as_view(), name='delete-location'),
|
||||||
path('manage-groups', views.ManageGroupsView.as_view(), name='manage-groups'),
|
|
||||||
path('add-group', views.CreateGroupView.as_view(), name='add-group'),
|
|
||||||
path('leave-group/<int:pk>', views.LeaveGroupView.as_view(), name='leave-group'),
|
|
||||||
path('accounts/profile', views.UpdateProfileView.as_view(), name='change-profile'),
|
path('accounts/profile', views.UpdateProfileView.as_view(), name='change-profile'),
|
||||||
path('accounts/profile/delete', views.DeleteProfileView.as_view(), name='delete-profile'),
|
path('accounts/profile/delete', views.DeleteProfileView.as_view(), name='delete-profile'),
|
||||||
]
|
]
|
||||||
|
|
53
map/views.py
53
map/views.py
|
@ -34,12 +34,6 @@ class MapView(LoginRequiredMixin, QuickActionsMixin, generic.DetailView):
|
||||||
'display': f'Add your location'
|
'display': f'Add your location'
|
||||||
}]
|
}]
|
||||||
|
|
||||||
actions.append({
|
|
||||||
'url': reverse_lazy('manage-groups'),
|
|
||||||
'category': 'secondary',
|
|
||||||
'display': f'Manage your groups'
|
|
||||||
})
|
|
||||||
|
|
||||||
return actions
|
return actions
|
||||||
|
|
||||||
|
|
||||||
|
@ -132,50 +126,3 @@ class DeleteProfileView(LoginRequiredMixin, generic.DeleteView):
|
||||||
def get_success_url(self):
|
def get_success_url(self):
|
||||||
messages.success(self.request, 'Your profile has been successfully and permanently deleted')
|
messages.success(self.request, 'Your profile has been successfully and permanently deleted')
|
||||||
return super().get_success_url()
|
return super().get_success_url()
|
||||||
|
|
||||||
|
|
||||||
class ManageGroupsView(LoginRequiredMixin, QuickActionsMixin, generic.ListView):
|
|
||||||
model = models.LocationSharingGroup
|
|
||||||
context_object_name = 'groups'
|
|
||||||
template_name = 'map/list_groups.html'
|
|
||||||
|
|
||||||
def get_queryset(self):
|
|
||||||
return self.request.user.location_sharing_groups.all()
|
|
||||||
|
|
||||||
def get_quick_actions(self):
|
|
||||||
return [{
|
|
||||||
'url': reverse_lazy('add-group'),
|
|
||||||
'category': 'primary',
|
|
||||||
'display': 'Create a group'
|
|
||||||
}]
|
|
||||||
|
|
||||||
|
|
||||||
class CreateGroupView(LoginRequiredMixin, QuickActionsMixin, generic.CreateView):
|
|
||||||
model = models.LocationSharingGroup
|
|
||||||
context_object_name = 'group'
|
|
||||||
template_name = 'map/change_group.html'
|
|
||||||
success_url = reverse_lazy('manage-groups')
|
|
||||||
|
|
||||||
fields = [
|
|
||||||
'name'
|
|
||||||
]
|
|
||||||
|
|
||||||
def get_success_url(self):
|
|
||||||
self.object.friends.add(self.request.user)
|
|
||||||
messages.success(self.request, 'The group has been successfully created')
|
|
||||||
return super().get_success_url()
|
|
||||||
|
|
||||||
|
|
||||||
class LeaveGroupView(LoginRequiredMixin, generic.UpdateView):
|
|
||||||
model = models.LocationSharingGroup
|
|
||||||
context_object_name = 'group'
|
|
||||||
template_name = 'map/leave_group.html'
|
|
||||||
fields = []
|
|
||||||
success_url = reverse_lazy('manage-groups')
|
|
||||||
|
|
||||||
def get_success_url(self):
|
|
||||||
self.object.friends.remove(self.request.user)
|
|
||||||
if self.object.friends.count() == 0:
|
|
||||||
self.object.delete()
|
|
||||||
messages.success(self.request, 'You successfully left the group')
|
|
||||||
return super().get_success_url()
|
|
||||||
|
|
Loading…
Reference in a new issue