{% trans 'Set position coordinates' %}
+{% trans 'Please select the position to set to these coordinates:' %}
+ {% include 'site/fragment_location.html' with location=coordinates %} + +diff --git a/src/c3nav/mapdata/migrations/0083_auto_20191227_1642.py b/src/c3nav/mapdata/migrations/0083_auto_20191227_1642.py new file mode 100644 index 00000000..25e1514c --- /dev/null +++ b/src/c3nav/mapdata/migrations/0083_auto_20191227_1642.py @@ -0,0 +1,31 @@ +# Generated by Django 2.2.8 on 2019-12-27 15:42 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('mapdata', '0082_dynamiclocation_position'), + ] + + operations = [ + migrations.RemoveField( + model_name='position', + name='last_location_update', + ), + migrations.RemoveField( + model_name='position', + name='location_id', + ), + migrations.AddField( + model_name='position', + name='coordinates_id', + field=models.CharField(max_length=48, null=True, verbose_name='coordinates'), + ), + migrations.AddField( + model_name='position', + name='last_coordinates_update', + field=models.DateTimeField(null=True, verbose_name='last coordinates update'), + ), + ] diff --git a/src/c3nav/mapdata/models/locations.py b/src/c3nav/mapdata/models/locations.py index c966442c..18ff500d 100644 --- a/src/c3nav/mapdata/models/locations.py +++ b/src/c3nav/mapdata/models/locations.py @@ -496,8 +496,8 @@ class Position(models.Model): owner = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) name = models.CharField(_('name'), max_length=32) secret = models.CharField(_('secret'), unique=True, max_length=32, default=get_position_secret) - last_location_update = models.DateTimeField(_('last location update'), null=True) - location_id = models.CharField(_('location'), null=True, max_length=48) + last_coordinates_update = models.DateTimeField(_('last coordinates update'), null=True) + coordinates_id = models.CharField(_('coordinates'), null=True, max_length=48) api_secret = models.CharField(_('api secret'), max_length=64, default=get_position_api_secret) coordinates = LocationById() diff --git a/src/c3nav/site/forms.py b/src/c3nav/site/forms.py index 45489819..6ce023b6 100644 --- a/src/c3nav/site/forms.py +++ b/src/c3nav/site/forms.py @@ -1,5 +1,7 @@ +from operator import attrgetter + from django.db import transaction -from django.forms import ModelForm +from django.forms import Form, ModelChoiceField, ModelForm from django.utils.translation import ugettext_lazy as _ from c3nav.mapdata.forms import I18nModelFormMixin @@ -53,3 +55,12 @@ class PositionForm(ModelForm): class Meta: model = Position fields = ['name'] + + +class PositionSetForm(Form): + position = ModelChoiceField(Position.objects.none()) + + def __init__(self, request, *args, **kwargs): + super().__init__(*args, **kwargs) + self.fields['position'].queryset = Position.objects.filter(owner=request.user) + self.fields['position'].label_from_instance = attrgetter('name') diff --git a/src/c3nav/site/static/site/css/c3nav.scss b/src/c3nav/site/static/site/css/c3nav.scss index 5a0b048e..3e9f58eb 100644 --- a/src/c3nav/site/static/site/css/c3nav.scss +++ b/src/c3nav/site/static/site/css/c3nav.scss @@ -1290,7 +1290,7 @@ main form > p, #modal form > p { resize: none; height: 100px; } - select { + select[multiple] { height: 100px; } } diff --git a/src/c3nav/site/static/site/js/c3nav.js b/src/c3nav/site/static/site/js/c3nav.js index adef336d..3333a08a 100644 --- a/src/c3nav/site/static/site/js/c3nav.js +++ b/src/c3nav/site/static/site/js/c3nav.js @@ -1361,21 +1361,24 @@ c3nav = { _click_anywhere: function(e) { if (e.originalEvent.target.id !== 'map') return; var popup = L.popup(c3nav._add_map_padding({className: 'location-popup', maxWidth: 500}, 'autoPanPaddingTopLeft', 'autoPanPaddingBottomRight')), - level = c3nav._levelControl.currentLevel, - name = 'c:'+String(c3nav.level_labels_by_id[level])+':'+Math.round(e.latlng.lng*100)/100+':'+Math.round(e.latlng.lat*100)/100; + name = c3nav._latlng_to_name(e.latlng); var buttons = $('#anywhere-popup-buttons').clone(); - buttons.find('.report').attr('href', '/report/l/' + name + '/'); + buttons.find('.report').attr('href', '/report/l/' + name + '/'); + buttons.find('.set-position').attr('href', '/positions/set/' + name + '/'); popup.setLatLng(e.latlng).setContent(buttons.html()); c3nav._click_anywhere_popup = popup; popup.on('remove', function() { c3nav._click_anywhere_popup = null }).openOn(c3nav.map); }, + _latlng_to_name: function(latlng) { + var level = c3nav._levelControl.currentLevel; + return 'c:'+String(c3nav.level_labels_by_id[level])+':'+Math.round(latlng.lng*100)/100+':'+Math.round(latlng.lat*100)/100; + }, _click_anywhere_load: function(nearby) { if (!c3nav._click_anywhere_popup) return; var latlng = c3nav._click_anywhere_popup.getLatLng(); c3nav._click_anywhere_popup.remove(); var popup = L.popup().setLatLng(latlng).setContent('
'), - level = c3nav._levelControl.currentLevel, - name = 'c:'+String(c3nav.level_labels_by_id[level])+':'+Math.round(latlng.lng*100)/100+':'+Math.round(latlng.lat*100)/100; + name = c3nav._latlng_to_name(latlng); c3nav._click_anywhere_popup = popup; popup.on('remove', function() { c3nav._click_anywhere_popup = null }).openOn(c3nav.map); $.getJSON('/api/locations/'+name+'/', function(data) { @@ -1621,6 +1624,7 @@ c3nav = { var $user = $('header #user'); $user.find('span').text(data.title); $user.find('small').text(data.subtitle || ''); + $('.position-buttons').toggle(data.has_positions); if (window.mobileclient) mobileclient.setUserData(JSON.stringify(data)); }, diff --git a/src/c3nav/site/templates/site/map.html b/src/c3nav/site/templates/site/map.html index c6b41c8e..beee9ddd 100644 --- a/src/c3nav/site/templates/site/map.html +++ b/src/c3nav/site/templates/site/map.html @@ -42,6 +42,12 @@ {% trans 'Show nearby locations' %} +