11 Commits

77 changed files with 322 additions and 59156 deletions

View File

@@ -9,12 +9,16 @@ defusedxml==0.7.1
Django==4.0.3 Django==4.0.3
django-allauth==0.50.0 django-allauth==0.50.0
django-crispy-forms==1.14.0 django-crispy-forms==1.14.0
django-filter==21.1
djangorestframework==3.13.1
djangorestframework-gis==0.18
idna==3.3 idna==3.3
oauthlib==3.2.0 oauthlib==3.2.0
psycopg2==2.9.3 psycopg2==2.9.3
pycparser==2.21 pycparser==2.21
PyJWT==2.3.0 PyJWT==2.3.0
python3-openid==3.2.0 python3-openid==3.2.0
pytz==2022.1
requests==2.27.1 requests==2.27.1
requests-oauthlib==1.3.1 requests-oauthlib==1.3.1
sqlparse==0.4.2 sqlparse==0.4.2

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-04-19 22:02+0300\n" "POT-Creation-Date: 2022-04-21 18:39+0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -19,154 +19,25 @@ msgstr ""
"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n" "%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n"
"%100>=11 && n%100<=14)? 2 : 3);\n" "%100>=11 && n%100<=14)? 2 : 3);\n"
#: .\templates\account\account_inactive.html:5
#: .\templates\account\account_inactive.html:8
msgid "Account Inactive"
msgstr ""
#: .\templates\account\account_inactive.html:10 #: maps/apps.py:8
msgid "This account is inactive." msgid "Maps"
msgstr "" msgstr "Карты"
#: .\templates\account\email.html:5 .\templates\account\email.html:8 #: maps/models.py:16
msgid "E-mail Addresses" msgid "facility"
msgstr "" msgstr "предприятие"
#: .\templates\account\email.html:10 #: maps/models.py:17
msgid "The following e-mail addresses are associated with your account:" msgid "facilities"
msgstr "" msgstr "предприятия"
#: .\templates\account\email.html:24 #: templates/account/login.html:8 templates/account/login.html:17
msgid "Verified" #: templates/account/login.html:44 templates/common/base.html:47
msgstr ""
#: .\templates\account\email.html:26
msgid "Unverified"
msgstr ""
#: .\templates\account\email.html:28
msgid "Primary"
msgstr ""
#: .\templates\account\email.html:34
msgid "Make Primary"
msgstr ""
#: .\templates\account\email.html:35
msgid "Re-send Verification"
msgstr ""
#: .\templates\account\email.html:36
msgid "Remove"
msgstr ""
#: .\templates\account\email.html:43
msgid "Warning:"
msgstr ""
#: .\templates\account\email.html:43
msgid ""
"You currently do not have any e-mail address set up. You should really add "
"an e-mail address so you can receive notifications, reset your password, etc."
msgstr ""
#: .\templates\account\email.html:48
msgid "Add E-mail Address"
msgstr ""
#: .\templates\account\email.html:53
msgid "Add E-mail"
msgstr ""
#: .\templates\account\email.html:63
msgid "Do you really want to remove the selected e-mail address?"
msgstr ""
#: .\templates\account\email\base_message.txt:1
#, python-format
msgid "Hello from %(site_name)s!"
msgstr ""
#: .\templates\account\email\base_message.txt:5
#, python-format
msgid ""
"Thank you for using %(site_name)s!\n"
"%(site_domain)s"
msgstr ""
#: .\templates\account\email\email_confirmation_message.txt:5
#, python-format
msgid ""
"You're receiving this e-mail because user %(user_display)s has given your e-"
"mail address to register an account on %(site_domain)s.\n"
"\n"
"To confirm this is correct, go to %(activate_url)s"
msgstr ""
#: .\templates\account\email\email_confirmation_subject.txt:3
msgid "Please Confirm Your E-mail Address"
msgstr ""
#: .\templates\account\email\password_reset_key_message.txt:4
msgid ""
"You're receiving this e-mail because you or someone else has requested a "
"password for your user account.\n"
"It can be safely ignored if you did not request a password reset. Click the "
"link below to reset your password."
msgstr ""
#: .\templates\account\email\password_reset_key_message.txt:9
#, python-format
msgid "In case you forgot, your username is %(username)s."
msgstr ""
#: .\templates\account\email\password_reset_key_subject.txt:3
#: .\templates\account\email\unknown_account_subject.txt:3
msgid "Password Reset E-mail"
msgstr ""
#: .\templates\account\email\unknown_account_message.txt:4
#, python-format
msgid ""
"You are receiving this e-mail because you or someone else has requested a\n"
"password for your user account. However, we do not have any record of a "
"user\n"
"with email %(email)s in our database.\n"
"\n"
"This mail can be safely ignored if you did not request a password reset.\n"
"\n"
"If it was you, you can sign up for an account using the link below."
msgstr ""
#: .\templates\account\email_confirm.html:6
#: .\templates\account\email_confirm.html:10
msgid "Confirm E-mail Address"
msgstr ""
#: .\templates\account\email_confirm.html:16
#, python-format
msgid ""
"Please confirm that <a href=\"mailto:%(email)s\">%(email)s</a> is an e-mail "
"address for user %(user_display)s."
msgstr ""
#: .\templates\account\email_confirm.html:20
msgid "Confirm"
msgstr ""
#: .\templates\account\email_confirm.html:27
#, python-format
msgid ""
"This e-mail confirmation link expired or is invalid. Please <a href="
"\"%(email_url)s\">issue a new e-mail confirmation request</a>."
msgstr ""
#: .\templates\account\login.html:8 .\templates\account\login.html:17
#: .\templates\account\login.html:44 .\templates\common\base.html:38
msgid "Sign In" msgid "Sign In"
msgstr "" msgstr ""
#: .\templates\account\login.html:19 #: templates/account/login.html:19
#, python-format #, python-format
msgid "" msgid ""
"Please sign in with one\n" "Please sign in with one\n"
@@ -175,212 +46,55 @@ msgid ""
" for a %(site_name)s account and sign in below:" " for a %(site_name)s account and sign in below:"
msgstr "" msgstr ""
#: .\templates\account\login.html:29 #: templates/account/login.html:29
msgid "or" msgid "or"
msgstr "" msgstr ""
#: .\templates\account\login.html:36 #: templates/account/login.html:36
#, python-format #, python-format
msgid "" msgid ""
"If you have not created an account yet, then please\n" "If you have not created an account yet, then please\n"
" <a href=\"%(signup_url)s\">sign up</a> first." " <a href=\"%(signup_url)s\">sign up</a> first."
msgstr "" msgstr ""
"Если у вас ещё нет учётной записи, пожалуйста, сначала " "Если у вас ещё нет учётной записи, пожалуйста, сначала <a href="
"<a href=\"%(signup_url)s\">зарегистрируйтесь</a>." "\"%(signup_url)s\">зарегистрируйтесь</a>."
#: .\templates\account\login.html:45 #: templates/account/login.html:45
#: .\templates\account\password_change.html:14
msgid "Forgot Password?" msgid "Forgot Password?"
msgstr "" msgstr ""
#: .\templates\account\logout.html:5 .\templates\account\logout.html:8 #: templates/account/logout.html:5 templates/account/logout.html:14
#: .\templates\account\logout.html:17 .\templates\common\base.html:33 #: templates/account/logout.html:19 templates/common/base.html:42
msgid "Sign Out" msgid "Sign Out"
msgstr "" msgstr ""
#: .\templates\account\logout.html:10 #: templates/account/logout.html:15
msgid "Are you sure you want to sign out?" msgid "Are you sure you want to sign out?"
msgstr "" msgstr ""
#: .\templates\account\messages\cannot_delete_primary_email.txt:2 #: templates/account/signup.html:7
#, python-format
msgid "You cannot remove your primary e-mail address (%(email)s)."
msgstr ""
#: .\templates\account\messages\email_confirmation_sent.txt:2
#, python-format
msgid "Confirmation e-mail sent to %(email)s."
msgstr ""
#: .\templates\account\messages\email_confirmed.txt:2
#, python-format
msgid "You have confirmed %(email)s."
msgstr ""
#: .\templates\account\messages\email_deleted.txt:2
#, python-format
msgid "Removed e-mail address %(email)s."
msgstr ""
#: .\templates\account\messages\logged_in.txt:4
#, python-format
msgid "Successfully signed in as %(name)s."
msgstr ""
#: .\templates\account\messages\logged_out.txt:2
msgid "You have signed out."
msgstr ""
#: .\templates\account\messages\password_changed.txt:2
msgid "Password successfully changed."
msgstr ""
#: .\templates\account\messages\password_set.txt:2
msgid "Password successfully set."
msgstr ""
#: .\templates\account\messages\primary_email_set.txt:2
msgid "Primary e-mail address set."
msgstr ""
#: .\templates\account\messages\unverified_primary_email.txt:2
msgid "Your primary e-mail address must be verified."
msgstr ""
#: .\templates\account\password_change.html:5
#: .\templates\account\password_change.html:8
#: .\templates\account\password_change.html:13
#: .\templates\account\password_reset_from_key.html:4
#: .\templates\account\password_reset_from_key.html:7
#: .\templates\account\password_reset_from_key_done.html:4
#: .\templates\account\password_reset_from_key_done.html:7
msgid "Change Password"
msgstr ""
#: .\templates\account\password_reset.html:6
#: .\templates\account\password_reset.html:10
#: .\templates\account\password_reset_done.html:6
#: .\templates\account\password_reset_done.html:9
msgid "Password Reset"
msgstr ""
#: .\templates\account\password_reset.html:15
msgid ""
"Forgotten your password? Enter your e-mail address below, and we'll send you "
"an e-mail allowing you to reset it."
msgstr ""
#: .\templates\account\password_reset.html:20
msgid "Reset My Password"
msgstr ""
#: .\templates\account\password_reset.html:23
msgid "Please contact us if you have any trouble resetting your password."
msgstr ""
#: .\templates\account\password_reset_done.html:15
msgid ""
"We have sent you an e-mail. If you have not received it please check your "
"spam folder. Otherwise contact us if you do not receive it in a few minutes."
msgstr ""
#: .\templates\account\password_reset_from_key.html:7
msgid "Bad Token"
msgstr ""
#: .\templates\account\password_reset_from_key.html:11
#, python-format
msgid ""
"The password reset link was invalid, possibly because it has already been "
"used. Please request a <a href=\"%(passwd_reset_url)s\">new password reset</"
"a>."
msgstr ""
#: .\templates\account\password_reset_from_key.html:16
msgid "change password"
msgstr ""
#: .\templates\account\password_reset_from_key_done.html:8
msgid "Your password is now changed."
msgstr ""
#: .\templates\account\password_set.html:5
#: .\templates\account\password_set.html:8
#: .\templates\account\password_set.html:13
msgid "Set Password"
msgstr ""
#: .\templates\account\signup.html:5
msgid "Signup" msgid "Signup"
msgstr "" msgstr ""
#: .\templates\account\signup.html:8 .\templates\account\signup.html:18 #: templates/account/signup.html:16 templates/account/signup.html:22
#: .\templates\common\base.html:41 #: templates/common/base.html:50
msgid "Sign Up" msgid "Sign Up"
msgstr "" msgstr ""
#: .\templates\account\signup.html:10 #: templates/account/signup.html:17
#, python-format #, python-format
msgid "" msgid ""
"Already have an account? Then please <a href=\"%(login_url)s\">sign in</a>." "Already have an account? Then please <a href=\"%(login_url)s\">sign in</a>."
msgstr "" msgstr ""
#: .\templates\account\signup_closed.html:5 #: templates/common/base.html:28
#: .\templates\account\signup_closed.html:8 msgid "Map"
msgid "Sign Up Closed" msgstr "Карта"
msgstr ""
#: .\templates\account\signup_closed.html:10 #: templates/common/base.html:39
msgid "We are sorry, but the sign up is currently closed." msgid "Admin page"
msgstr "" msgstr "Админка"
#: .\templates\account\snippets\already_logged_in.html:5 #: templates/common/base.html:41
msgid "Note"
msgstr ""
#: .\templates\account\snippets\already_logged_in.html:5
#, python-format
msgid "you are already logged in as %(user_display)s."
msgstr ""
#: .\templates\account\verification_sent.html:5
#: .\templates\account\verification_sent.html:8
#: .\templates\account\verified_email_required.html:5
#: .\templates\account\verified_email_required.html:8
msgid "Verify Your E-mail Address"
msgstr ""
#: .\templates\account\verification_sent.html:10
msgid ""
"We have sent an e-mail to you for verification. Follow the link provided to "
"finalize the signup process. If you do not see the verification e-mail in "
"your main inbox, check your spam folder. Please contact us if you do not "
"receive the verification e-mail within a few minutes."
msgstr ""
#: .\templates\account\verified_email_required.html:12
msgid ""
"This part of the site requires us to verify that\n"
"you are who you claim to be. For this purpose, we require that you\n"
"verify ownership of your e-mail address. "
msgstr ""
#: .\templates\account\verified_email_required.html:16
msgid ""
"We have sent an e-mail to you for\n"
"verification. Please click on the link inside that e-mail. If you do not see "
"the verification e-mail in your main inbox, check your spam folder. "
"Otherwise\n"
"contact us if you do not receive it within a few minutes."
msgstr ""
#: .\templates\account\verified_email_required.html:20
#, python-format
msgid ""
"<strong>Note:</strong> you can still <a href=\"%(email_url)s\">change your e-"
"mail address</a>."
msgstr ""
#: .\templates\common\base.html:32
msgid "Change E-mail" msgid "Change E-mail"
msgstr "Сменить E-mail" msgstr "Сменить E-mail"

View File

13
wheretogo/maps/admin.py Normal file
View File

@@ -0,0 +1,13 @@
from django.contrib.gis.db import models
from django.forms.widgets import Textarea
from django.contrib import admin
from maps.models import Facility
class FacilityAdmin(admin.ModelAdmin):
formfield_overrides = {models.PointField: {"widget": Textarea}}
admin.site.register(Facility, FacilityAdmin)

8
wheretogo/maps/api.py Normal file
View File

@@ -0,0 +1,8 @@
from rest_framework import routers
from maps.viewsets import FacilityViewSet
router = routers.DefaultRouter()
router.register(r"facilities", FacilityViewSet)
urlpatterns = router.urls

8
wheretogo/maps/apps.py Normal file
View File

@@ -0,0 +1,8 @@
from django.apps import AppConfig
from django.utils.translation import gettext_lazy as _
class MapConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "maps"
verbose_name = _("Maps")

View File

@@ -0,0 +1,29 @@
# Generated by Django 4.0.3 on 2022-04-21 11:59
import django.contrib.gis.db.models.fields
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Facility',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=200)),
('address', models.CharField(max_length=100)),
('city', models.CharField(max_length=50)),
('location', django.contrib.gis.db.models.fields.PointField(blank=True, null=True, srid=4326)),
],
options={
'verbose_name': 'facility',
'verbose_name_plural': 'Facilities',
},
),
]

View File

@@ -0,0 +1,17 @@
# Generated by Django 4.0.3 on 2022-04-21 15:29
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('maps', '0001_initial'),
]
operations = [
migrations.AlterModelOptions(
name='facility',
options={'verbose_name': 'facility', 'verbose_name_plural': 'facilities'},
),
]

View File

20
wheretogo/maps/models.py Normal file
View File

@@ -0,0 +1,20 @@
from django.contrib.gis.db import models as gis_models
from django.utils.translation import gettext_lazy as _
from django.db import models
class Facility(models.Model):
name = models.CharField(max_length=200)
address = models.CharField(max_length=100)
city = models.CharField(max_length=50)
location = gis_models.PointField(
null=True,
blank=True,
)
class Meta:
verbose_name = _("facility")
verbose_name_plural = _("facilities")
def __unicode__(self):
return self.name

View File

@@ -0,0 +1,11 @@
from rest_framework_gis import serializers
from maps.models import Facility
class FacilitySerializer(serializers.GeoFeatureModelSerializer):
class Meta:
fields = ("id", "name", "address", "city")
geo_field = "location"
model = Facility

3
wheretogo/maps/tests.py Normal file
View File

@@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

8
wheretogo/maps/urls.py Normal file
View File

@@ -0,0 +1,8 @@
from django.urls import path
from maps.views import MapView
app_name = "maps"
urlpatterns = [
path("map/", MapView.as_view(), name="map"),
]

6
wheretogo/maps/views.py Normal file
View File

@@ -0,0 +1,6 @@
from django.views.generic.base import TemplateView
class MapView(TemplateView):
template_name = "maps/map.html"

View File

@@ -0,0 +1,13 @@
from rest_framework import viewsets
from rest_framework_gis import filters
from maps.models import Facility
from maps.serializers import FacilitySerializer
class FacilityViewSet(viewsets.ReadOnlyModelViewSet):
bbox_filter_field = "location"
filter_backends = (filters.InBBoxFilter,)
queryset = Facility.objects.all()
serializer_class = FacilitySerializer

View File

@@ -0,0 +1,3 @@
.navbar {
height: 7%;
}

View File

Before

Width:  |  Height:  |  Size: 9.4 KiB

After

Width:  |  Height:  |  Size: 9.4 KiB

View File

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

View File

Before

Width:  |  Height:  |  Size: 8.4 KiB

After

Width:  |  Height:  |  Size: 8.4 KiB

View File

Before

Width:  |  Height:  |  Size: 486 B

After

Width:  |  Height:  |  Size: 486 B

View File

Before

Width:  |  Height:  |  Size: 973 B

After

Width:  |  Height:  |  Size: 973 B

View File

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,426 +0,0 @@
/*!
* Bootstrap Reboot v5.0.2 (https://getbootstrap.com/)
* Copyright 2011-2021 The Bootstrap Authors
* Copyright 2011-2021 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)
*/
*,
*::before,
*::after {
box-sizing: border-box;
}
@media (prefers-reduced-motion: no-preference) {
:root {
scroll-behavior: smooth;
}
}
body {
margin: 0;
font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
font-size: 1rem;
font-weight: 400;
line-height: 1.5;
color: #212529;
background-color: #fff;
-webkit-text-size-adjust: 100%;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
hr {
margin: 1rem 0;
color: inherit;
background-color: currentColor;
border: 0;
opacity: 0.25;
}
hr:not([size]) {
height: 1px;
}
h6, h5, h4, h3, h2, h1 {
margin-top: 0;
margin-bottom: 0.5rem;
font-weight: 500;
line-height: 1.2;
}
h1 {
font-size: calc(1.375rem + 1.5vw);
}
@media (min-width: 1200px) {
h1 {
font-size: 2.5rem;
}
}
h2 {
font-size: calc(1.325rem + 0.9vw);
}
@media (min-width: 1200px) {
h2 {
font-size: 2rem;
}
}
h3 {
font-size: calc(1.3rem + 0.6vw);
}
@media (min-width: 1200px) {
h3 {
font-size: 1.75rem;
}
}
h4 {
font-size: calc(1.275rem + 0.3vw);
}
@media (min-width: 1200px) {
h4 {
font-size: 1.5rem;
}
}
h5 {
font-size: 1.25rem;
}
h6 {
font-size: 1rem;
}
p {
margin-top: 0;
margin-bottom: 1rem;
}
abbr[title],
abbr[data-bs-original-title] {
-webkit-text-decoration: underline dotted;
text-decoration: underline dotted;
cursor: help;
-webkit-text-decoration-skip-ink: none;
text-decoration-skip-ink: none;
}
address {
margin-bottom: 1rem;
font-style: normal;
line-height: inherit;
}
ol,
ul {
padding-left: 2rem;
}
ol,
ul,
dl {
margin-top: 0;
margin-bottom: 1rem;
}
ol ol,
ul ul,
ol ul,
ul ol {
margin-bottom: 0;
}
dt {
font-weight: 700;
}
dd {
margin-bottom: 0.5rem;
margin-left: 0;
}
blockquote {
margin: 0 0 1rem;
}
b,
strong {
font-weight: bolder;
}
small {
font-size: 0.875em;
}
mark {
padding: 0.2em;
background-color: #fcf8e3;
}
sub,
sup {
position: relative;
font-size: 0.75em;
line-height: 0;
vertical-align: baseline;
}
sub {
bottom: -0.25em;
}
sup {
top: -0.5em;
}
a {
color: #0d6efd;
text-decoration: underline;
}
a:hover {
color: #0a58ca;
}
a:not([href]):not([class]), a:not([href]):not([class]):hover {
color: inherit;
text-decoration: none;
}
pre,
code,
kbd,
samp {
font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
font-size: 1em;
direction: ltr /* rtl:ignore */;
unicode-bidi: bidi-override;
}
pre {
display: block;
margin-top: 0;
margin-bottom: 1rem;
overflow: auto;
font-size: 0.875em;
}
pre code {
font-size: inherit;
color: inherit;
word-break: normal;
}
code {
font-size: 0.875em;
color: #d63384;
word-wrap: break-word;
}
a > code {
color: inherit;
}
kbd {
padding: 0.2rem 0.4rem;
font-size: 0.875em;
color: #fff;
background-color: #212529;
border-radius: 0.2rem;
}
kbd kbd {
padding: 0;
font-size: 1em;
font-weight: 700;
}
figure {
margin: 0 0 1rem;
}
img,
svg {
vertical-align: middle;
}
table {
caption-side: bottom;
border-collapse: collapse;
}
caption {
padding-top: 0.5rem;
padding-bottom: 0.5rem;
color: #6c757d;
text-align: left;
}
th {
text-align: inherit;
text-align: -webkit-match-parent;
}
thead,
tbody,
tfoot,
tr,
td,
th {
border-color: inherit;
border-style: solid;
border-width: 0;
}
label {
display: inline-block;
}
button {
border-radius: 0;
}
button:focus:not(:focus-visible) {
outline: 0;
}
input,
button,
select,
optgroup,
textarea {
margin: 0;
font-family: inherit;
font-size: inherit;
line-height: inherit;
}
button,
select {
text-transform: none;
}
[role=button] {
cursor: pointer;
}
select {
word-wrap: normal;
}
select:disabled {
opacity: 1;
}
[list]::-webkit-calendar-picker-indicator {
display: none;
}
button,
[type=button],
[type=reset],
[type=submit] {
-webkit-appearance: button;
}
button:not(:disabled),
[type=button]:not(:disabled),
[type=reset]:not(:disabled),
[type=submit]:not(:disabled) {
cursor: pointer;
}
::-moz-focus-inner {
padding: 0;
border-style: none;
}
textarea {
resize: vertical;
}
fieldset {
min-width: 0;
padding: 0;
margin: 0;
border: 0;
}
legend {
float: left;
width: 100%;
padding: 0;
margin-bottom: 0.5rem;
font-size: calc(1.275rem + 0.3vw);
line-height: inherit;
}
@media (min-width: 1200px) {
legend {
font-size: 1.5rem;
}
}
legend + * {
clear: left;
}
::-webkit-datetime-edit-fields-wrapper,
::-webkit-datetime-edit-text,
::-webkit-datetime-edit-minute,
::-webkit-datetime-edit-hour-field,
::-webkit-datetime-edit-day-field,
::-webkit-datetime-edit-month-field,
::-webkit-datetime-edit-year-field {
padding: 0;
}
::-webkit-inner-spin-button {
height: auto;
}
[type=search] {
outline-offset: -2px;
-webkit-appearance: textfield;
}
/* rtl:raw:
[type="tel"],
[type="url"],
[type="email"],
[type="number"] {
direction: ltr;
}
*/
::-webkit-search-decoration {
-webkit-appearance: none;
}
::-webkit-color-swatch-wrapper {
padding: 0;
}
::file-selector-button {
font: inherit;
}
::-webkit-file-upload-button {
font: inherit;
-webkit-appearance: button;
}
output {
display: inline-block;
}
iframe {
border: 0;
}
summary {
display: list-item;
cursor: pointer;
}
progress {
vertical-align: baseline;
}
[hidden] {
display: none !important;
}
/*# sourceMappingURL=bootstrap-reboot.css.map */

File diff suppressed because one or more lines are too long

View File

@@ -1,8 +0,0 @@
/*!
* Bootstrap Reboot v5.0.2 (https://getbootstrap.com/)
* Copyright 2011-2021 The Bootstrap Authors
* Copyright 2011-2021 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)
*/*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}
/*# sourceMappingURL=bootstrap-reboot.min.css.map */

File diff suppressed because one or more lines are too long

View File

@@ -1,423 +0,0 @@
/*!
* Bootstrap Reboot v5.0.2 (https://getbootstrap.com/)
* Copyright 2011-2021 The Bootstrap Authors
* Copyright 2011-2021 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)
*/
*,
*::before,
*::after {
box-sizing: border-box;
}
@media (prefers-reduced-motion: no-preference) {
:root {
scroll-behavior: smooth;
}
}
body {
margin: 0;
font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
font-size: 1rem;
font-weight: 400;
line-height: 1.5;
color: #212529;
background-color: #fff;
-webkit-text-size-adjust: 100%;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
hr {
margin: 1rem 0;
color: inherit;
background-color: currentColor;
border: 0;
opacity: 0.25;
}
hr:not([size]) {
height: 1px;
}
h6, h5, h4, h3, h2, h1 {
margin-top: 0;
margin-bottom: 0.5rem;
font-weight: 500;
line-height: 1.2;
}
h1 {
font-size: calc(1.375rem + 1.5vw);
}
@media (min-width: 1200px) {
h1 {
font-size: 2.5rem;
}
}
h2 {
font-size: calc(1.325rem + 0.9vw);
}
@media (min-width: 1200px) {
h2 {
font-size: 2rem;
}
}
h3 {
font-size: calc(1.3rem + 0.6vw);
}
@media (min-width: 1200px) {
h3 {
font-size: 1.75rem;
}
}
h4 {
font-size: calc(1.275rem + 0.3vw);
}
@media (min-width: 1200px) {
h4 {
font-size: 1.5rem;
}
}
h5 {
font-size: 1.25rem;
}
h6 {
font-size: 1rem;
}
p {
margin-top: 0;
margin-bottom: 1rem;
}
abbr[title],
abbr[data-bs-original-title] {
-webkit-text-decoration: underline dotted;
text-decoration: underline dotted;
cursor: help;
-webkit-text-decoration-skip-ink: none;
text-decoration-skip-ink: none;
}
address {
margin-bottom: 1rem;
font-style: normal;
line-height: inherit;
}
ol,
ul {
padding-right: 2rem;
}
ol,
ul,
dl {
margin-top: 0;
margin-bottom: 1rem;
}
ol ol,
ul ul,
ol ul,
ul ol {
margin-bottom: 0;
}
dt {
font-weight: 700;
}
dd {
margin-bottom: 0.5rem;
margin-right: 0;
}
blockquote {
margin: 0 0 1rem;
}
b,
strong {
font-weight: bolder;
}
small {
font-size: 0.875em;
}
mark {
padding: 0.2em;
background-color: #fcf8e3;
}
sub,
sup {
position: relative;
font-size: 0.75em;
line-height: 0;
vertical-align: baseline;
}
sub {
bottom: -0.25em;
}
sup {
top: -0.5em;
}
a {
color: #0d6efd;
text-decoration: underline;
}
a:hover {
color: #0a58ca;
}
a:not([href]):not([class]), a:not([href]):not([class]):hover {
color: inherit;
text-decoration: none;
}
pre,
code,
kbd,
samp {
font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
font-size: 1em;
direction: ltr ;
unicode-bidi: bidi-override;
}
pre {
display: block;
margin-top: 0;
margin-bottom: 1rem;
overflow: auto;
font-size: 0.875em;
}
pre code {
font-size: inherit;
color: inherit;
word-break: normal;
}
code {
font-size: 0.875em;
color: #d63384;
word-wrap: break-word;
}
a > code {
color: inherit;
}
kbd {
padding: 0.2rem 0.4rem;
font-size: 0.875em;
color: #fff;
background-color: #212529;
border-radius: 0.2rem;
}
kbd kbd {
padding: 0;
font-size: 1em;
font-weight: 700;
}
figure {
margin: 0 0 1rem;
}
img,
svg {
vertical-align: middle;
}
table {
caption-side: bottom;
border-collapse: collapse;
}
caption {
padding-top: 0.5rem;
padding-bottom: 0.5rem;
color: #6c757d;
text-align: right;
}
th {
text-align: inherit;
text-align: -webkit-match-parent;
}
thead,
tbody,
tfoot,
tr,
td,
th {
border-color: inherit;
border-style: solid;
border-width: 0;
}
label {
display: inline-block;
}
button {
border-radius: 0;
}
button:focus:not(:focus-visible) {
outline: 0;
}
input,
button,
select,
optgroup,
textarea {
margin: 0;
font-family: inherit;
font-size: inherit;
line-height: inherit;
}
button,
select {
text-transform: none;
}
[role=button] {
cursor: pointer;
}
select {
word-wrap: normal;
}
select:disabled {
opacity: 1;
}
[list]::-webkit-calendar-picker-indicator {
display: none;
}
button,
[type=button],
[type=reset],
[type=submit] {
-webkit-appearance: button;
}
button:not(:disabled),
[type=button]:not(:disabled),
[type=reset]:not(:disabled),
[type=submit]:not(:disabled) {
cursor: pointer;
}
::-moz-focus-inner {
padding: 0;
border-style: none;
}
textarea {
resize: vertical;
}
fieldset {
min-width: 0;
padding: 0;
margin: 0;
border: 0;
}
legend {
float: right;
width: 100%;
padding: 0;
margin-bottom: 0.5rem;
font-size: calc(1.275rem + 0.3vw);
line-height: inherit;
}
@media (min-width: 1200px) {
legend {
font-size: 1.5rem;
}
}
legend + * {
clear: right;
}
::-webkit-datetime-edit-fields-wrapper,
::-webkit-datetime-edit-text,
::-webkit-datetime-edit-minute,
::-webkit-datetime-edit-hour-field,
::-webkit-datetime-edit-day-field,
::-webkit-datetime-edit-month-field,
::-webkit-datetime-edit-year-field {
padding: 0;
}
::-webkit-inner-spin-button {
height: auto;
}
[type=search] {
outline-offset: -2px;
-webkit-appearance: textfield;
}
[type="tel"],
[type="url"],
[type="email"],
[type="number"] {
direction: ltr;
}
::-webkit-search-decoration {
-webkit-appearance: none;
}
::-webkit-color-swatch-wrapper {
padding: 0;
}
::file-selector-button {
font: inherit;
}
::-webkit-file-upload-button {
font: inherit;
-webkit-appearance: button;
}
output {
display: inline-block;
}
iframe {
border: 0;
}
summary {
display: list-item;
cursor: pointer;
}
progress {
vertical-align: baseline;
}
[hidden] {
display: none !important;
}
/*# sourceMappingURL=bootstrap-reboot.rtl.css.map */

File diff suppressed because one or more lines are too long

View File

@@ -1,8 +0,0 @@
/*!
* Bootstrap Reboot v5.0.2 (https://getbootstrap.com/)
* Copyright 2011-2021 The Bootstrap Authors
* Copyright 2011-2021 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)
*/*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-right:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-right:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:right}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:right;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:right}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}[type=email],[type=number],[type=tel],[type=url]{direction:ltr}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}
/*# sourceMappingURL=bootstrap-reboot.rtl.min.css.map */

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,11 @@
html,
body {
height: 100%;
width: 100%;
overflow-x: hidden;
}
#map {
box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);
height: 93vh;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

View File

@@ -0,0 +1,77 @@
const copy = "© <a href='https://www.openstreetmap.org/copyright'>OpenStreetMap</a> contributors";
const url = "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png";
const osm = L.tileLayer(url, { attribution: copy });
const map = L.map("map", { layers: [osm], minZoom: 5 });
map.
locate()
.on("locationfound", (e) => map.setView(e.latlng, 12))
.on("locationerror", () => map.setView([0, 0], 5));
async function loadFacilities() {
const facilities_url = `/api/facilities/?in_bbox=${map.getBounds().toBBoxString()}`
const response = await fetch(facilities_url)
const geojson = await response.json()
return geojson
}
async function renderFacilities() {
const facilities = await loadFacilities();
L.geoJSON(facilities, {
onEachFeature: function (feature) {
var facilityMarkerStyle = L.Icon.extend({
options: {
iconSize: [20, 20],
}
});
var facilityMarker = new facilityMarkerStyle({ iconUrl: document.getElementById("facilityMarkerURL").innerHTML });
var lat = feature.geometry.coordinates[1];
var lon = feature.geometry.coordinates[0];
L.marker([lat, lon], { icon: facilityMarker }).bindPopup(feature.properties.name).addTo(map);
}
});
}
map.on("moveend", renderFacilities);
var clickMarker;
map.on("click", function (e) {
const { lat, lng } = e.latlng;
const get_addr_api = `https://nominatim.openstreetmap.org/reverse.php?lat=${lat}&lon=${lng}&zoom=18&format=jsonv2`;
fetchAddressData(get_addr_api).then((data) => {
var { city, house_number, road } = data.address;
if (clickMarker != undefined) {
map.removeLayer(clickMarker);
};
clickMarker = L.marker([data.lat, data.lon],).addTo(map);
var popupText = '<p>' + city + ', ' + road
if (house_number) {
popupText += ', ' + house_number
}
popupText += '</p>'
clickMarker.bindPopup(popupText).openPopup();
});
async function fetchAddressData(url) {
try {
const response = await fetch(url);
const data = await response.json();
return data;
} catch (err) {
console.error(err);
}
};
})

View File

@@ -7,12 +7,17 @@
<head> <head>
<title>{% block head_title %}{% endblock %}</title> <title>{% block head_title %}{% endblock %}</title>
<link rel="icon" type="image/x-icon" href="{% static 'img/favicon.ico' %}"> <link rel="icon" type="image/x-icon" href="{% static 'common/img/favicon.ico' %}">
<link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet"
<script type = "text/javascript" src="{% static 'js/bootstrap.bundle.min.js' %}"></script> integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC"
{% csrf_token %} crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js"
integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM"
crossorigin="anonymous"></script>
<link rel="stylesheet" type="text/css" href="{% static 'common/css/base.css' %}" />
{% block extra_head %} {% block extra_head %}
{% endblock %} {% endblock %}
{% csrf_token %}
</head> </head>
<nav class="navbar navbar-expand-lg navbar-dark bg-dark"> <nav class="navbar navbar-expand-lg navbar-dark bg-dark">
@@ -20,6 +25,9 @@
<a class="navbar-brand" href="/">WhereToGo</a> <a class="navbar-brand" href="/">WhereToGo</a>
<div class="collapse navbar-collapse" id="navbarNavDropdown"> <div class="collapse navbar-collapse" id="navbarNavDropdown">
<ul class="navbar-nav me-auto mb-2 mb-lg-0"> <ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link" href="{% url 'maps:map' %}">{% trans "Map" %}</a>
</li>
</ul> </ul>
<ul class="navbar-nav ms-auto mb-2 mb-lg-0"> <ul class="navbar-nav ms-auto mb-2 mb-lg-0">
{% if user.is_authenticated %} {% if user.is_authenticated %}
@@ -28,6 +36,9 @@
{{ user.username }} {{ user.username }}
</a> </a>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="navbarDropdownMenuLink"> <ul class="dropdown-menu dropdown-menu-end" aria-labelledby="navbarDropdownMenuLink">
{% if user.is_superuser %}
<li><a class="dropdown-item" href="{% url 'admin:index' %}">{% trans "Admin page" %}</a></li>
{% endif %}
<li><a class="dropdown-item" href="{% url 'account_email' %}">{% trans "Change E-mail" %}</a></li> <li><a class="dropdown-item" href="{% url 'account_email' %}">{% trans "Change E-mail" %}</a></li>
<li><a class="dropdown-item" href="{% url 'account_logout' %}">{% trans "Sign Out" %}</a></li> <li><a class="dropdown-item" href="{% url 'account_logout' %}">{% trans "Sign Out" %}</a></li>
</ul> </ul>
@@ -41,9 +52,6 @@
</li> </li>
{% endif %} {% endif %}
</ul> </ul>
<form class="d-flex">
</form>
</div> </div>
</div> </div>
</nav> </nav>

View File

@@ -0,0 +1,36 @@
{% extends "common/base.html" %}
{% load static %}
{% block head_title %}WhereToGo{% endblock %}
{% block extra_head %}
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.8.0/dist/leaflet.css"
integrity="sha512-hoalWLoI8r4UszCkZ5kL8vayOGVae1oxXe/2A4AO6J9+580uKHDO3JdHb7NzwwzK5xr/Fs0W40kiNHxM9vyTtQ=="
crossorigin=""/>
<script src="https://unpkg.com/leaflet@1.8.0/dist/leaflet.js"
integrity="sha512-BB3hKbKWOc9Ez/TAwyWxNXeoV9c1v6FIeYiBieIWkpLjauysF18NzgR1MBNBXf8/KABdlkX68nAhlwcDFLGPCQ=="
crossorigin=""></script>
<link rel="stylesheet" type="text/css" href="{% static 'maps/css/map.css' %}" />
{% endblock %}
{% block content %}
<div class="container-fluid m-0 p-0">
<div class="row">
<div class="col-9 p-0">
<div id="map"></div>
</div>
<div class="col-3 p-0">
<div class="panel">
<button>Тест</button>
</div>
</div>
</div>
</div>
</div>
<span id="facilityMarkerURL" style="display: none;">{% static "maps/img/place.png" %}</span>
{% endblock %}
{% block scripts %}
<script src="{% static 'maps/js/map.js' %}"></script>
{% endblock %}

View File

@@ -32,11 +32,15 @@ INSTALLED_APPS = [
"django.contrib.sessions", "django.contrib.sessions",
"django.contrib.messages", "django.contrib.messages",
"django.contrib.staticfiles", "django.contrib.staticfiles",
"django.contrib.gis",
"rest_framework",
"rest_framework_gis",
"crispy_forms", "crispy_forms",
"crispy_bootstrap5", "crispy_bootstrap5",
"allauth", "allauth",
"allauth.account", "allauth.account",
"allauth.socialaccount", "allauth.socialaccount",
"maps",
] ]
SITE_ID = 1 SITE_ID = 1
@@ -131,6 +135,7 @@ CRISPY_TEMPLATE_PACK = "bootstrap5"
LOGIN_REDIRECT_URL = "/" LOGIN_REDIRECT_URL = "/"
ACCOUNT_EMAIL_REQUIRED = True ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_EMAIL_VERIFICATION = "none"
MESSAGE_TAGS = { MESSAGE_TAGS = {
messages.DEBUG: "alert-info", messages.DEBUG: "alert-info",

View File

@@ -3,7 +3,7 @@
DATABASES = { DATABASES = {
"default": { "default": {
"ENGINE": "django.db.backends.postgresql_psycopg2", "ENGINE": "django.contrib.gis.db.backends.postgis",
"NAME": "wheretogo", "NAME": "wheretogo",
"USER": "wheretogo", "USER": "wheretogo",
"PASSWORD": "", "PASSWORD": "",

View File

@@ -7,6 +7,8 @@ from django.conf.urls.static import static
urlpatterns = [ urlpatterns = [
path("admin/", admin.site.urls), path("admin/", admin.site.urls),
path("api/", include("maps.api")),
path("accounts/", include("allauth.urls")), path("accounts/", include("allauth.urls")),
path("", TemplateView.as_view(template_name="common/index.html")), path("", TemplateView.as_view(template_name="common/index.html")),
path("maps/", include("maps.urls", namespace="maps")),
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) ] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)