Create a custom view for location sharing management
This commit is contained in:
parent
3d83dbc91b
commit
50219adbbb
7 changed files with 97 additions and 29 deletions
|
@ -23,14 +23,10 @@ class LocationForm(forms.ModelForm):
|
||||||
return self.request.user
|
return self.request.user
|
||||||
|
|
||||||
|
|
||||||
class ProfileForm(forms.ModelForm):
|
class LocationSharingForm(forms.ModelForm):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Friend
|
model = Friend
|
||||||
fields = [
|
fields = [
|
||||||
'username',
|
|
||||||
'first_name',
|
|
||||||
'last_name',
|
|
||||||
'email',
|
|
||||||
'shares_location_to',
|
'shares_location_to',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -38,3 +34,4 @@ class ProfileForm(forms.ModelForm):
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
self.request = request
|
self.request = request
|
||||||
self.fields['shares_location_to'].queryset = Friend.objects.exclude(pk=request.user.pk)
|
self.fields['shares_location_to'].queryset = Friend.objects.exclude(pk=request.user.pk)
|
||||||
|
self.fields['shares_location_to'].label = 'Share location to'
|
||||||
|
|
14
map/templates/map/base_change.html
Normal file
14
map/templates/map/base_change.html
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
{% extends 'map/base.html' %}
|
||||||
|
{% load crispy_forms_filters %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
{% block notice %}
|
||||||
|
{% endblock %}
|
||||||
|
<form method="post">
|
||||||
|
{% csrf_token %}
|
||||||
|
{{ form|crispy }}
|
||||||
|
{% block form-buttons %}
|
||||||
|
<button type="submit" class="btn btn-primary">Save</button>
|
||||||
|
{% endblock %}
|
||||||
|
</form>
|
||||||
|
{% endblock %}
|
|
@ -1,10 +1,10 @@
|
||||||
{% extends 'map/base.html' %}
|
{% extends 'map/base_change.html' %}
|
||||||
{% load crispy_forms_filters %}
|
{% load crispy_forms_filters %}
|
||||||
|
|
||||||
{% block title %}Change your location{% endblock %}
|
{% block title %}Change your location{% endblock %}
|
||||||
{% block h1 %}Change your location{% endblock %}
|
{% block h1 %}Change your location{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block notice %}
|
||||||
<div class="alert alert-info">
|
<div class="alert alert-info">
|
||||||
<h4 class="alert-heading">Notice</h4>
|
<h4 class="alert-heading">Notice</h4>
|
||||||
<div>
|
<div>
|
||||||
|
@ -20,9 +20,4 @@
|
||||||
you.
|
you.
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<form method="post">
|
|
||||||
{% csrf_token %}
|
|
||||||
{{ form|crispy }}
|
|
||||||
<button type="submit" class="btn btn-primary">Save</button>
|
|
||||||
</form>
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
{% extends 'map/base.html' %}
|
{% extends 'map/base_change.html' %}
|
||||||
{% load crispy_forms_filters %}
|
{% load crispy_forms_filters %}
|
||||||
|
|
||||||
{% block title %}Change your profile{% endblock %}
|
{% block title %}Change your profile{% endblock %}
|
||||||
{% block h1 %}Change your profile{% endblock %}
|
{% block h1 %}Change your profile{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block notice %}
|
||||||
<div class="alert alert-info">
|
<div class="alert alert-info">
|
||||||
<h4 class="alert-heading">Notice</h4>
|
<h4 class="alert-heading">Notice</h4>
|
||||||
<div>
|
<div>
|
||||||
|
@ -23,11 +23,9 @@
|
||||||
your data if you change your mind.
|
your data if you change your mind.
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<form method="post">
|
{% endblock %}
|
||||||
{% csrf_token %}
|
|
||||||
{{ form|crispy }}
|
{% block form-buttons %}
|
||||||
<button type="submit" class="btn btn-primary">Save</button>
|
<a href="{% url 'password_change' %}" class="btn btn-secondary">Change your password</a>
|
||||||
<a href="{% url 'password_change' %}" class="btn btn-secondary">Change your password</a>
|
<a href="{% url 'delete-profile' %}" class="btn btn-warning">Permanently delete your profile</a>
|
||||||
<a href="{% url 'delete-profile' %}" class="btn btn-warning">Permanently delete your profile</a>
|
|
||||||
</form>
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
15
map/templates/map/share_location.html
Normal file
15
map/templates/map/share_location.html
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
{% extends 'map/base_change.html' %}
|
||||||
|
{% load crispy_forms_filters %}
|
||||||
|
|
||||||
|
{% block title %}Share your location{% endblock %}
|
||||||
|
{% block h1 %}Share your location{% endblock %}
|
||||||
|
|
||||||
|
{% block notice %}
|
||||||
|
<div class="alert alert-info">
|
||||||
|
<h4 class="alert-heading">Notice</h4>
|
||||||
|
<div>
|
||||||
|
Select here who you want to share your location to.
|
||||||
|
Only selected users will be able to see your marker on the map.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
|
@ -7,6 +7,7 @@ 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('share-location', views.LocationSharingView.as_view(), name='share-location'),
|
||||||
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'),
|
||||||
]
|
]
|
||||||
|
|
64
map/views.py
64
map/views.py
|
@ -4,7 +4,7 @@ from django.urls import reverse_lazy
|
||||||
from django.views import generic
|
from django.views import generic
|
||||||
|
|
||||||
from map import models
|
from map import models
|
||||||
from map.forms import LocationForm, ProfileForm
|
from map.forms import LocationForm, LocationSharingForm
|
||||||
from map.mixins import QuickActionsMixin
|
from map.mixins import QuickActionsMixin
|
||||||
|
|
||||||
|
|
||||||
|
@ -34,14 +34,20 @@ class MapView(LoginRequiredMixin, QuickActionsMixin, generic.DetailView):
|
||||||
'display': f'Add your location'
|
'display': f'Add your location'
|
||||||
}]
|
}]
|
||||||
|
|
||||||
|
actions.append({
|
||||||
|
'url': reverse_lazy('share-location'),
|
||||||
|
'category': 'secondary',
|
||||||
|
'display': 'Share your location'
|
||||||
|
})
|
||||||
|
|
||||||
return actions
|
return actions
|
||||||
|
|
||||||
|
|
||||||
class EditLocationView(LoginRequiredMixin, generic.UpdateView):
|
class EditLocationView(LoginRequiredMixin, QuickActionsMixin, generic.UpdateView):
|
||||||
model = models.FriendLocation
|
model = models.FriendLocation
|
||||||
context_object_name = 'location'
|
context_object_name = 'location'
|
||||||
template_name = 'map/change_location.html'
|
template_name = 'map/change_location.html'
|
||||||
|
success_url = reverse_lazy('map')
|
||||||
fields = [
|
fields = [
|
||||||
'latitude',
|
'latitude',
|
||||||
'longitude',
|
'longitude',
|
||||||
|
@ -49,7 +55,12 @@ class EditLocationView(LoginRequiredMixin, generic.UpdateView):
|
||||||
'end_date',
|
'end_date',
|
||||||
]
|
]
|
||||||
|
|
||||||
success_url = reverse_lazy('map')
|
def get_quick_actions(self):
|
||||||
|
return [{
|
||||||
|
'url': reverse_lazy('map'),
|
||||||
|
'category': 'secondary',
|
||||||
|
'display': 'Back to map'
|
||||||
|
}]
|
||||||
|
|
||||||
def get_object(self, queryset=None):
|
def get_object(self, queryset=None):
|
||||||
return self.request.user.location
|
return self.request.user.location
|
||||||
|
@ -59,12 +70,19 @@ class EditLocationView(LoginRequiredMixin, generic.UpdateView):
|
||||||
return super().get_success_url()
|
return super().get_success_url()
|
||||||
|
|
||||||
|
|
||||||
class AddLocationView(LoginRequiredMixin, generic.CreateView):
|
class AddLocationView(LoginRequiredMixin, QuickActionsMixin, generic.CreateView):
|
||||||
model = models.FriendLocation
|
model = models.FriendLocation
|
||||||
context_object_name = 'location'
|
context_object_name = 'location'
|
||||||
template_name = 'map/change_location.html'
|
template_name = 'map/change_location.html'
|
||||||
success_url = reverse_lazy('map')
|
success_url = reverse_lazy('map')
|
||||||
|
|
||||||
|
def get_quick_actions(self):
|
||||||
|
return [{
|
||||||
|
'url': reverse_lazy('map'),
|
||||||
|
'category': 'secondary',
|
||||||
|
'display': 'Back to map'
|
||||||
|
}]
|
||||||
|
|
||||||
def get_initial(self):
|
def get_initial(self):
|
||||||
initial = super().get_initial()
|
initial = super().get_initial()
|
||||||
initial = initial.copy()
|
initial = initial.copy()
|
||||||
|
@ -93,14 +111,24 @@ class DeleteLocationView(LoginRequiredMixin, generic.DeleteView):
|
||||||
return super().get_success_url()
|
return super().get_success_url()
|
||||||
|
|
||||||
|
|
||||||
class UpdateProfileView(LoginRequiredMixin, generic.UpdateView):
|
class UpdateProfileView(LoginRequiredMixin, QuickActionsMixin, generic.UpdateView):
|
||||||
model = models.Friend
|
model = models.Friend
|
||||||
context_object_name = 'friend'
|
context_object_name = 'friend'
|
||||||
template_name = 'map/change_profile.html'
|
template_name = 'map/change_profile.html'
|
||||||
success_url = reverse_lazy('map')
|
success_url = reverse_lazy('map')
|
||||||
|
fields = [
|
||||||
|
'username',
|
||||||
|
'first_name',
|
||||||
|
'last_name',
|
||||||
|
'email',
|
||||||
|
]
|
||||||
|
|
||||||
def get_form(self, form_class=None):
|
def get_quick_actions(self):
|
||||||
return ProfileForm(self.request, **self.get_form_kwargs())
|
return [{
|
||||||
|
'url': reverse_lazy('map'),
|
||||||
|
'category': 'secondary',
|
||||||
|
'display': 'Back to map'
|
||||||
|
}]
|
||||||
|
|
||||||
def get_object(self, queryset=None):
|
def get_object(self, queryset=None):
|
||||||
return self.request.user
|
return self.request.user
|
||||||
|
@ -110,6 +138,26 @@ class UpdateProfileView(LoginRequiredMixin, generic.UpdateView):
|
||||||
return super().get_success_url()
|
return super().get_success_url()
|
||||||
|
|
||||||
|
|
||||||
|
class LocationSharingView(LoginRequiredMixin, QuickActionsMixin, generic.UpdateView):
|
||||||
|
model = models.Friend
|
||||||
|
context_object_name = 'friend'
|
||||||
|
template_name = 'map/share_location.html'
|
||||||
|
success_url = reverse_lazy('map')
|
||||||
|
|
||||||
|
def get_quick_actions(self):
|
||||||
|
return [{
|
||||||
|
'url': reverse_lazy('map'),
|
||||||
|
'category': 'secondary',
|
||||||
|
'display': 'Back to map'
|
||||||
|
}]
|
||||||
|
|
||||||
|
def get_object(self, queryset=None):
|
||||||
|
return self.request.user
|
||||||
|
|
||||||
|
def get_form(self, form_class=None):
|
||||||
|
return LocationSharingForm(self.request, **self.get_form_kwargs())
|
||||||
|
|
||||||
|
|
||||||
class DeleteProfileView(LoginRequiredMixin, generic.DeleteView):
|
class DeleteProfileView(LoginRequiredMixin, generic.DeleteView):
|
||||||
model = models.Friend
|
model = models.Friend
|
||||||
context_object_name = 'friend'
|
context_object_name = 'friend'
|
||||||
|
|
Loading…
Reference in a new issue