From 37b4d05da565546c7bd0ab06d64c2500f1bcc086 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Tue, 9 Apr 2019 09:42:09 +0200 Subject: [PATCH 1/6] (WIP) Allow to star map and retrieve starred maps --- umap/migrations/0009_star.py | 25 +++++++++++++ umap/models.py | 6 ++++ umap/static/umap/img/24-white.png | Bin 19000 -> 19711 bytes umap/static/umap/img/24-white.svg | 8 ++--- umap/static/umap/img/24.png | Bin 15600 -> 16878 bytes umap/static/umap/img/24.svg | 51 ++++++++++++++++++--------- umap/static/umap/js/umap.controls.js | 22 ++++++++++++ umap/static/umap/js/umap.forms.js | 4 +++ umap/static/umap/js/umap.js | 25 +++++++++++++ umap/static/umap/map.css | 6 ++++ umap/templates/auth/user_stars.html | 20 +++++++++++ umap/templates/umap/navigation.html | 1 + umap/tests/test_map_views.py | 20 ++++++++++- umap/urls.py | 10 ++++++ umap/views.py | 50 +++++++++++++++++++++++++- 15 files changed, 226 insertions(+), 22 deletions(-) create mode 100644 umap/migrations/0009_star.py create mode 100644 umap/templates/auth/user_stars.html diff --git a/umap/migrations/0009_star.py b/umap/migrations/0009_star.py new file mode 100644 index 00000000..7f2fec0e --- /dev/null +++ b/umap/migrations/0009_star.py @@ -0,0 +1,25 @@ +# Generated by Django 4.1.7 on 2023-05-05 18:02 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('umap', '0008_alter_map_settings'), + ] + + operations = [ + migrations.CreateModel( + name='Star', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('at', models.DateTimeField(auto_now=True)), + ('by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='stars', to=settings.AUTH_USER_MODEL)), + ('map', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='umap.map')), + ], + ), + ] diff --git a/umap/models.py b/umap/models.py index 2e317abc..de3071f8 100644 --- a/umap/models.py +++ b/umap/models.py @@ -349,3 +349,9 @@ class DataLayer(NamedModel): self.geojson.storage.delete(path) except FileNotFoundError: pass + + +class Star(models.Model): + at = models.DateTimeField(auto_now=True) + map = models.ForeignKey(Map, on_delete=models.CASCADE) + by = models.ForeignKey(settings.AUTH_USER_MODEL, related_name="stars", on_delete=models.CASCADE) diff --git a/umap/static/umap/img/24-white.png b/umap/static/umap/img/24-white.png index 95edf1d611571579ab5d36eceea62115e74820c4..e3a43024f476a7e06c067776a0050e08ae395483 100644 GIT binary patch literal 19711 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 SZqtqc00006d literal 19000 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 diff --git a/umap/static/umap/img/24-white.svg b/umap/static/umap/img/24-white.svg index 28c7fc4d..861e45f5 100644 --- a/umap/static/umap/img/24-white.svg +++ b/umap/static/umap/img/24-white.svg @@ -13,7 +13,7 @@ height="200" id="svg2" version="1.1" - inkscape:version="0.92.2 2405546, 2018-03-11" + inkscape:version="0.92.4 5da689c313, 2019-01-14" sodipodi:docname="24-white.svg" inkscape:export-filename="/home/ybon/Code/py/umap/umap/static/umap/img/24-white.png" inkscape:export-xdpi="96" @@ -27,9 +27,9 @@ borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" - inkscape:zoom="22.4" - inkscape:cx="124.98783" - inkscape:cy="45.00337" + inkscape:zoom="16" + inkscape:cx="119.65216" + inkscape:cy="34.240239" inkscape:document-units="px" inkscape:current-layer="layer1" showgrid="true" diff --git a/umap/static/umap/img/24.png b/umap/static/umap/img/24.png index c4a9bddfbefb9c36b9a290da6a7bdcfa43ebf499..d6c038fbcdc031ec6f1a416eec6635cf92899243 100644 GIT binary patch literal 16878 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 literal 15600 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 diff --git a/umap/static/umap/img/24.svg b/umap/static/umap/img/24.svg index 5835faf0..4cf1ac8d 100644 --- a/umap/static/umap/img/24.svg +++ b/umap/static/umap/img/24.svg @@ -2,22 +2,22 @@ + inkscape:export-ydpi="89.996864" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + inkscape:guide-bbox="true" + inkscape:showpageshadow="2" + inkscape:pagecheckerboard="0" + inkscape:deskcolor="#d1d1d1"> + + diff --git a/umap/static/umap/js/umap.controls.js b/umap/static/umap/js/umap.controls.js index 695b3de9..e9bb9dc5 100644 --- a/umap/static/umap/js/umap.controls.js +++ b/umap/static/umap/js/umap.controls.js @@ -1018,6 +1018,28 @@ L.U.AttributionControl = L.Control.Attribution.extend({ }, }) +L.U.StarControl = L.Control.extend({ + options: { + position: 'topleft', + }, + + onAdd: function (map) { + var status = map.options.starred ? ' starred' : '' + var container = L.DomUtil.create( + 'div', + 'leaflet-control-star umap-control' + status + ), + link = L.DomUtil.create('a', '', container) + link.href = '#' + link.title = L._('Star this map') + L.DomEvent.on(link, 'click', L.DomEvent.stop) + .on(link, 'click', map.star, map) + .on(link, 'dblclick', L.DomEvent.stopPropagation) + + return container + }, +}) + L.U.Search = L.PhotonSearch.extend({ initialize: function (map, input, options) { L.PhotonSearch.prototype.initialize.call(this, map, input, options) diff --git a/umap/static/umap/js/umap.forms.js b/umap/static/umap/js/umap.forms.js index eef555ce..7e7b7a06 100644 --- a/umap/static/umap/js/umap.forms.js +++ b/umap/static/umap/js/umap.forms.js @@ -1060,6 +1060,10 @@ L.U.FormBuilder = L.FormBuilder.extend({ handler: 'DataLayersControl', label: L._('Display the data layers control'), }, + starControl: { + handler: 'ControlChoice', + label: L._('Display the star map button'), + }, }, initialize: function (obj, fields, options) { diff --git a/umap/static/umap/js/umap.js b/umap/static/umap/js/umap.js index d9479f0e..b5a520e6 100644 --- a/umap/static/umap/js/umap.js +++ b/umap/static/umap/js/umap.js @@ -60,6 +60,7 @@ L.U.Map.include({ 'tilelayers', 'editinosm', 'datalayers', + 'star', ], initialize: function (el, geojson) { @@ -309,6 +310,7 @@ L.U.Map.include({ this._controls.search = new L.U.SearchControl() this._controls.embed = new L.Control.Embed(this, this.options.embedOptions) this._controls.tilelayers = new L.U.TileLayerControl(this) + this._controls.star = new L.U.StarControl(this) this._controls.editinosm = new L.Control.EditInOSM({ position: 'topleft', widgetOptions: { @@ -1283,6 +1285,7 @@ L.U.Map.include({ 'embedControl', 'measureControl', 'tilelayersControl', + 'starControl', 'easing', ], @@ -1369,6 +1372,28 @@ L.U.Map.include({ return (this.options.umap_id && this.getEditUrl()) || this.getCreateUrl() }, + star: function () { + if (!this.options.umap_id) + return this.ui.alert({ + content: L._('Please save the map first'), + level: 'error', + }) + let url = L.Util.template(this.options.urls.map_star, { + map_id: this.options.umap_id, + }) + this.post(url, { + context: this, + callback: function (data) { + this.options.starred = data.starred + let msg = data.starred + ? L._('Map has been starred') + : L._('Map has been unstarred') + this.ui.alert({ content: msg, level: 'info' }) + this.renderControls() + }, + }) + }, + geometry: function () { /* Return a GeoJSON geometry Object */ var latlng = this.latLng(this.options.center || this.getCenter()) diff --git a/umap/static/umap/map.css b/umap/static/umap/map.css index 91371c83..a3505e2b 100644 --- a/umap/static/umap/map.css +++ b/umap/static/umap/map.css @@ -88,6 +88,12 @@ a.umap-control-less { background-position: -80px -161px; box-shadow: 0 0 4px 0 black inset; } +.leaflet-control-star a { + background-position: -122px -162px; +} +.leaflet-control-star.starred a { + background-position: -82px -162px; +} .leaflet-control-search a { background-position: -41px -121px; display: block; diff --git a/umap/templates/auth/user_stars.html b/umap/templates/auth/user_stars.html new file mode 100644 index 00000000..47c3e569 --- /dev/null +++ b/umap/templates/auth/user_stars.html @@ -0,0 +1,20 @@ +{% extends "umap/content.html" %} + +{% load i18n %} + +{% block maincontent %} +
+

{% blocktrans %}Browse {{ current_user }}'s starred maps{% endblocktrans %}

+
+
+
+ {% if maps %} + {% include "umap/map_list.html" %} + {% else %} +
+ {% blocktrans %}{{ current_user }} has no starred maps yet.{% endblocktrans %} +
+ {% endif %} +
+
+{% endblock maincontent %} diff --git a/umap/templates/umap/navigation.html b/umap/templates/umap/navigation.html index 3282bc0b..acde349a 100644 --- a/umap/templates/umap/navigation.html +++ b/umap/templates/umap/navigation.html @@ -8,6 +8,7 @@
    {% if user.is_authenticated %}
  • {% trans "My maps" %} ({{ user }})
  • +
  • {% trans "Starred maps" %}
  • {% else %}
  • {% endif %} diff --git a/umap/tests/test_map_views.py b/umap/tests/test_map_views.py index aa237517..5266f0cd 100644 --- a/umap/tests/test_map_views.py +++ b/umap/tests/test_map_views.py @@ -5,7 +5,7 @@ from django.contrib.auth import get_user_model from django.urls import reverse from django.core.signing import Signer -from umap.models import DataLayer, Map +from umap.models import DataLayer, Map, Star from .base import login_required @@ -539,3 +539,21 @@ def test_search(client, map): url = reverse("search") response = client.get(url + "?q=Blé") assert "Blé dur" in response.content.decode() + + +def test_authenticated_user_can_star_map(client, map, user): + url = reverse('map_star', args=(map.pk,)) + client.login(username=user.username, password="123123") + assert Star.objects.filter(by=user).count() == 0 + response = client.post(url) + assert response.status_code == 200 + assert Star.objects.filter(by=user).count() == 1 + + +def test_anonymous_cannot_star_map(client, map): + url = reverse('map_star', args=(map.pk,)) + assert Star.objects.count() == 0 + response = client.post(url) + assert response.status_code == 302 + assert "login" in response["Location"] + assert Star.objects.count() == 0 diff --git a/umap/urls.py b/umap/urls.py index 0d4d3157..390912b5 100644 --- a/umap/urls.py +++ b/umap/urls.py @@ -4,6 +4,7 @@ from django.conf.urls.i18n import i18n_patterns from django.conf.urls.static import static from django.contrib import admin from django.contrib.auth import views as auth_views +from django.contrib.auth.decorators import login_required from django.contrib.staticfiles.urls import staticfiles_urlpatterns from django.views.decorators.cache import cache_control, cache_page, never_cache from django.views.decorators.csrf import ensure_csrf_cookie @@ -92,6 +93,14 @@ i18n_urls += decorated_patterns( [login_required_if_not_anonymous_allowed, never_cache], re_path(r"^map/create/$", views.MapCreate.as_view(), name="map_create"), ) +i18n_urls += decorated_patterns( + [login_required], + re_path( + r'^map/(?P[\d]+)/star/$', + views.MapStar.as_view(), + name='map_star' + ), +) i18n_urls += decorated_patterns( [map_permissions_check, never_cache], re_path( @@ -143,6 +152,7 @@ urlpatterns += i18n_patterns( re_path(r"^search/$", views.search, name="search"), re_path(r"^about/$", views.about, name="about"), re_path(r"^user/(?P.+)/$", views.user_maps, name="user_maps"), + re_path(r'^user/(?P[-_\w@]+)/stars/$', views.user_stars, name='user_stars'), re_path(r"", include(i18n_urls)), ) diff --git a/umap/views.py b/umap/views.py index 3c8f87c7..bebef708 100644 --- a/umap/views.py +++ b/umap/views.py @@ -45,7 +45,7 @@ from .forms import ( MapSettingsForm, UpdateMapPermissionsForm, ) -from .models import DataLayer, Licence, Map, Pictogram, TileLayer +from .models import DataLayer, Licence, Map, Pictogram, Star, TileLayer from .utils import get_uri_template, gzip_file, is_ajax try: @@ -180,6 +180,30 @@ class UserMaps(DetailView, PaginatorMixin): user_maps = UserMaps.as_view() +class UserStars(UserMaps): + template_name = "auth/user_stars.html" + + def get_context_data(self, **kwargs): + owner = self.request.user == self.object + manager = Map.objects if owner else Map.public + stars = Star.objects.filter(by=self.object).values("map") + maps = manager.filter(pk__in=stars) + if owner: + per_page = settings.UMAP_MAPS_PER_PAGE_OWNER + limit = 100 + else: + per_page = settings.UMAP_MAPS_PER_PAGE + limit = 50 + maps = maps.order_by('-modified_at')[:limit] + maps = self.paginate(maps, per_page) + kwargs.update({ + "maps": maps + }) + return kwargs + +user_stars = UserStars.as_view() + + class Search(TemplateView, PaginatorMixin): template_name = "umap/search.html" list_template_name = "umap/map_list.html" @@ -360,6 +384,7 @@ class MapDetailMixin: "allowEdit": self.is_edit_allowed(), "default_iconUrl": "%sumap/img/marker.png" % settings.STATIC_URL, # noqa "umap_id": self.get_umap_id(), + 'starred': self.is_starred(), "licences": dict((l.name, l.json) for l in Licence.objects.all()), "edit_statuses": [(i, str(label)) for i, label in Map.EDIT_STATUS], "share_statuses": [ @@ -404,6 +429,9 @@ class MapDetailMixin: def get_umap_id(self): return None + def is_starred(self): + return False + def get_geojson(self): return { "geometry": { @@ -489,6 +517,12 @@ class MapView(MapDetailMixin, PermissionsMixin, DetailView): map_settings["properties"]["permissions"] = self.get_permissions() return map_settings + def is_starred(self): + user = self.request.user + if not user.is_authenticated: + return False + return Star.objects.filter(by=user, map=self.object).exists() + class MapViewGeoJSON(MapView): def get_canonical_url(self): @@ -631,6 +665,20 @@ class MapClone(PermissionsMixin, View): return response +class MapStar(View): + + def post(self, *args, **kwargs): + map_inst = get_object_or_404(Map, pk=kwargs['map_id']) + qs = Star.objects.filter(map=map_inst, by=self.request.user) + if qs.exists(): + qs.delete() + status = False + else: + Star(map=map_inst, by=self.request.user).save() + status = True + return simple_json_response(starred=status) + + class MapShortUrl(RedirectView): query_string = True permanent = True From 1c5ffd8136cc931db895d6db20fbbc93ef64751b Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Fri, 5 May 2023 22:10:25 +0200 Subject: [PATCH 2/6] Update umap/views.py Co-authored-by: David Larlet <3556+davidbgk@users.noreply.github.com> --- umap/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/umap/views.py b/umap/views.py index bebef708..49a98f5f 100644 --- a/umap/views.py +++ b/umap/views.py @@ -674,7 +674,7 @@ class MapStar(View): qs.delete() status = False else: - Star(map=map_inst, by=self.request.user).save() + Star.objects.create(map=map_inst, by=self.request.user) status = True return simple_json_response(starred=status) From 8c113d9a193d288001473fd3f6fc030457878944 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Fri, 5 May 2023 22:13:10 +0200 Subject: [PATCH 3/6] Rename MapStar view in ToggleMapStarStatus --- umap/urls.py | 2 +- umap/views.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/umap/urls.py b/umap/urls.py index 390912b5..58beb6a4 100644 --- a/umap/urls.py +++ b/umap/urls.py @@ -97,7 +97,7 @@ i18n_urls += decorated_patterns( [login_required], re_path( r'^map/(?P[\d]+)/star/$', - views.MapStar.as_view(), + views.ToggleMapStarStatus.as_view(), name='map_star' ), ) diff --git a/umap/views.py b/umap/views.py index 49a98f5f..690525dd 100644 --- a/umap/views.py +++ b/umap/views.py @@ -665,7 +665,7 @@ class MapClone(PermissionsMixin, View): return response -class MapStar(View): +class ToggleMapStarStatus(View): def post(self, *args, **kwargs): map_inst = get_object_or_404(Map, pk=kwargs['map_id']) From 30f9612a124595a71c491eee7257906633933777 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Fri, 5 May 2023 22:24:52 +0200 Subject: [PATCH 4/6] Adapt star icon bg position after rebase --- umap/static/umap/map.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/umap/static/umap/map.css b/umap/static/umap/map.css index a3505e2b..525027d8 100644 --- a/umap/static/umap/map.css +++ b/umap/static/umap/map.css @@ -89,10 +89,10 @@ a.umap-control-less { box-shadow: 0 0 4px 0 black inset; } .leaflet-control-star a { - background-position: -122px -162px; + background-position: -118px -160px; } .leaflet-control-star.starred a { - background-position: -82px -162px; + background-position: -158px -160px; } .leaflet-control-search a { background-position: -41px -121px; From 40f40038f84602a8461b1f4d2e98fbb8883feaae Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Fri, 5 May 2023 22:51:35 +0200 Subject: [PATCH 5/6] Fix url order for retrieving user stars Since that initial PR, the username regex has been more gready. --- umap/tests/test_map_views.py | 12 ++++++++++++ umap/urls.py | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/umap/tests/test_map_views.py b/umap/tests/test_map_views.py index 5266f0cd..7a8f2f49 100644 --- a/umap/tests/test_map_views.py +++ b/umap/tests/test_map_views.py @@ -557,3 +557,15 @@ def test_anonymous_cannot_star_map(client, map): assert response.status_code == 302 assert "login" in response["Location"] assert Star.objects.count() == 0 + + +def test_user_can_see_their_star(client, map, user): + url = reverse('map_star', args=(map.pk,)) + client.login(username=user.username, password="123123") + assert Star.objects.filter(by=user).count() == 0 + response = client.post(url) + assert response.status_code == 200 + url = reverse('user_stars', args=(user.username,)) + response = client.get(url) + assert response.status_code == 200 + assert map.name in response.content.decode() diff --git a/umap/urls.py b/umap/urls.py index 58beb6a4..1c35bdb7 100644 --- a/umap/urls.py +++ b/umap/urls.py @@ -151,8 +151,8 @@ urlpatterns += i18n_patterns( ), re_path(r"^search/$", views.search, name="search"), re_path(r"^about/$", views.about, name="about"), + re_path(r"^user/(?P.+)/stars/$", views.user_stars, name='user_stars'), re_path(r"^user/(?P.+)/$", views.user_maps, name="user_maps"), - re_path(r'^user/(?P[-_\w@]+)/stars/$', views.user_stars, name='user_stars'), re_path(r"", include(i18n_urls)), ) From a2b1b7bc88ad5dd478ff234f21888d569b7d884b Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Mon, 15 May 2023 14:50:18 +0200 Subject: [PATCH 6/6] Refactor UserMaps and UserStars views --- umap/views.py | 51 ++++++++++++++++++++++++--------------------------- 1 file changed, 24 insertions(+), 27 deletions(-) diff --git a/umap/views.py b/umap/views.py index 690525dd..877e9501 100644 --- a/umap/views.py +++ b/umap/views.py @@ -154,18 +154,26 @@ class UserMaps(DetailView, PaginatorMixin): list_template_name = "umap/map_list.html" context_object_name = "current_user" + def is_owner(self): + return self.request.user == self.object + + @property + def per_page(self): + if self.is_owner(): + return settings.UMAP_MAPS_PER_PAGE_OWNER + return settings.UMAP_MAPS_PER_PAGE + + def get_map_queryset(self): + return Map.objects if self.is_owner() else Map.public + + def get_maps(self): + qs = self.get_map_queryset() + qs = qs.filter(Q(owner=self.object) | Q(editors=self.object)) + return qs.distinct().order_by("-modified_at") + def get_context_data(self, **kwargs): - owner = self.request.user == self.object - manager = Map.objects if owner else Map.public - maps = manager.filter(Q(owner=self.object) | Q(editors=self.object)) - if owner: - per_page = settings.UMAP_MAPS_PER_PAGE_OWNER - else: - per_page = settings.UMAP_MAPS_PER_PAGE - maps = maps.distinct().order_by("-modified_at") - maps = self.paginate(maps, per_page) - kwargs.update({"maps": maps}) - return super(UserMaps, self).get_context_data(**kwargs) + kwargs.update({"maps": self.paginate(self.get_maps(), self.per_page)}) + return super().get_context_data(**kwargs) def get_template_names(self): """ @@ -183,23 +191,12 @@ user_maps = UserMaps.as_view() class UserStars(UserMaps): template_name = "auth/user_stars.html" - def get_context_data(self, **kwargs): - owner = self.request.user == self.object - manager = Map.objects if owner else Map.public + def get_maps(self): + qs = self.get_map_queryset() stars = Star.objects.filter(by=self.object).values("map") - maps = manager.filter(pk__in=stars) - if owner: - per_page = settings.UMAP_MAPS_PER_PAGE_OWNER - limit = 100 - else: - per_page = settings.UMAP_MAPS_PER_PAGE - limit = 50 - maps = maps.order_by('-modified_at')[:limit] - maps = self.paginate(maps, per_page) - kwargs.update({ - "maps": maps - }) - return kwargs + qs = qs.filter(pk__in=stars) + return qs.order_by("-modified_at") + user_stars = UserStars.as_view()