Compare commits

...

15 Commits

Author SHA1 Message Date
Ariel Rin
2bd2c09c23 Version Bump 2.9.2 2021-10-30 05:23:48 +00:00
Ariel Rin
c1cf859ec9 Merge branch 'srp-provider' into 'v2.9.x'
Follow up test fixes missed from !1358

See merge request allianceauth/allianceauth!1361
2021-10-30 05:22:38 +00:00
Ariel Rin
1ebf864998 adapt tests 2021-10-30 05:22:38 +00:00
Ariel Rin
0948e34e48 Merge branch 'transifex' into 'v2.9.x'
Update from Transifex

See merge request allianceauth/allianceauth!1360
2021-10-30 04:54:00 +00:00
Ariel Rin
f9a1ea9c83 Update from Transifex 2021-10-30 04:54:00 +00:00
Ariel Rin
d02a8ebc1b Merge branch 'dependencies' into 'v2.9.x'
Dependencies, CDN imports, CSS optimization

See merge request allianceauth/allianceauth!1350
2021-10-30 04:35:55 +00:00
Ariel Rin
5c2625b648 Dependencies, CDN imports, CSS optimization 2021-10-30 04:35:55 +00:00
Ariel Rin
13174d006e Merge branch 'issue/1211-feature-request-optimer-labels' into 'v2.9.x'
Add types and description to optimers

Closes #1211

See merge request allianceauth/allianceauth!1357
2021-10-30 04:34:49 +00:00
Peter Pfeufer
2c59cc4cc3 Add types and description to optimers 2021-10-30 04:34:49 +00:00
Ariel Rin
41c81d3226 Merge branch 'chunkupdateerrortype' into 'v2.9.x'
Correct logging of affiliation endpoint to Info not Error

See merge request allianceauth/allianceauth!1359
2021-10-30 04:32:12 +00:00
Ariel Rin
2ec7d3b4d9 Merge branch 'srp-provider' into 'v2.9.x'
Decouple allianceauth.srp ESI Provider from allianceauth.eveonline

See merge request allianceauth/allianceauth!1358
2021-10-30 04:29:28 +00:00
Ariel Rin
b607b73598 chunk updates to be info, not error 2021-10-30 12:43:49 +10:00
Ariel Rin
f52791cd1f document swagger spec operations 2021-10-27 18:18:23 +10:00
Ariel Rin
d829facbd4 use own esi provider for itemtypes 2021-10-27 18:14:18 +10:00
Ariel Rin
44ac3a9ff2 decouple srp provider from eveonline 2021-10-27 17:54:14 +10:00
37 changed files with 356 additions and 153 deletions

View File

@@ -1,7 +1,7 @@
# This will make sure the app is always imported when # This will make sure the app is always imported when
# Django starts so that shared_task will use this app. # Django starts so that shared_task will use this app.
__version__ = '2.9.1' __version__ = '2.9.2'
__title__ = 'Alliance Auth' __title__ = 'Alliance Auth'
__url__ = 'https://gitlab.com/allianceauth/allianceauth' __url__ = 'https://gitlab.com/allianceauth/allianceauth'
NAME = f'{__title__} v{__version__}' NAME = f'{__title__} v{__version__}'

View File

@@ -49,7 +49,6 @@ def run_model_update():
for alliance in EveAllianceInfo.objects.all().values('alliance_id'): for alliance in EveAllianceInfo.objects.all().values('alliance_id'):
update_alliance.apply_async(args=[alliance['alliance_id']], priority=TASK_PRIORITY) update_alliance.apply_async(args=[alliance['alliance_id']], priority=TASK_PRIORITY)
#update existing character models if required
# update existing character models # update existing character models
character_ids = EveCharacter.objects.all().values_list('character_id', flat=True) character_ids = EveCharacter.objects.all().values_list('character_id', flat=True)
for character_ids_chunk in chunks(character_ids, CHUNK_SIZE): for character_ids_chunk in chunks(character_ids, CHUNK_SIZE):
@@ -67,7 +66,7 @@ def update_character_chunk(character_ids_chunk: list):
character_names = providers.provider.client.Universe\ character_names = providers.provider.client.Universe\
.post_universe_names(ids=character_ids_chunk).result() .post_universe_names(ids=character_ids_chunk).result()
except: except:
logger.error("Failed to bulk update characters. Attempting single updates") logger.info("Failed to bulk update characters. Attempting single updates")
for character_id in character_ids_chunk: for character_id in character_ids_chunk:
update_character.apply_async( update_character.apply_async(
args=[character_id], priority=TASK_PRIORITY args=[character_id], priority=TASK_PRIORITY

View File

@@ -2,12 +2,12 @@
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package. # This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
# #
# Translators: # Translators:
# Erik Kalkoken <erik.kalkoken@gmail.com>, 2020 # Erik Kalkoken <erik.kalkoken@gmail.com>, 2020
# Peter Pfeufer <rounon.dax@terra-nanotech.de>, 2021
# Joel Falknau <ozirascal@gmail.com>, 2021 # Joel Falknau <ozirascal@gmail.com>, 2021
# # Peter Pfeufer <rounon.dax@terra-nanotech.de>, 2021
#
#, fuzzy #, fuzzy
msgid "" msgid ""
msgstr "" msgstr ""
@@ -15,7 +15,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-10-26 18:36+1000\n" "POT-Creation-Date: 2021-10-26 18:36+1000\n"
"PO-Revision-Date: 2020-02-18 03:14+0000\n" "PO-Revision-Date: 2020-02-18 03:14+0000\n"
"Last-Translator: Joel Falknau <ozirascal@gmail.com>, 2021\n" "Last-Translator: Peter Pfeufer <rounon.dax@terra-nanotech.de>, 2021\n"
"Language-Team: German (https://www.transifex.com/alliance-auth/teams/107430/de/)\n" "Language-Team: German (https://www.transifex.com/alliance-auth/teams/107430/de/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@@ -2132,7 +2132,7 @@ msgstr "Strukturen Typ"
#: allianceauth/timerboard/form.py:62 #: allianceauth/timerboard/form.py:62
msgid "Timer Type" msgid "Timer Type"
msgstr "" msgstr "Timer Typ"
#: allianceauth/timerboard/form.py:63 #: allianceauth/timerboard/form.py:63
#: allianceauth/timerboard/templates/timerboard/view.html:33 #: allianceauth/timerboard/templates/timerboard/view.html:33
@@ -2163,15 +2163,15 @@ msgstr "Auf Corp beschränkt"
#: allianceauth/timerboard/models.py:14 #: allianceauth/timerboard/models.py:14
msgid "Not Specified" msgid "Not Specified"
msgstr "" msgstr "Keine Angabe"
#: allianceauth/timerboard/models.py:15 #: allianceauth/timerboard/models.py:15
msgid "Shield" msgid "Shield"
msgstr "" msgstr "Schild"
#: allianceauth/timerboard/models.py:16 #: allianceauth/timerboard/models.py:16
msgid "Armor" msgid "Armor"
msgstr "" msgstr "Panzerung"
#: allianceauth/timerboard/models.py:17 #: allianceauth/timerboard/models.py:17
msgid "Hull" msgid "Hull"
@@ -2179,15 +2179,15 @@ msgstr "Hülle"
#: allianceauth/timerboard/models.py:18 #: allianceauth/timerboard/models.py:18
msgid "Final" msgid "Final"
msgstr "" msgstr "Final"
#: allianceauth/timerboard/models.py:19 #: allianceauth/timerboard/models.py:19
msgid "Anchoring" msgid "Anchoring"
msgstr "" msgstr "Ankernd"
#: allianceauth/timerboard/models.py:20 #: allianceauth/timerboard/models.py:20
msgid "Unanchoring" msgid "Unanchoring"
msgstr "" msgstr "Entankernd"
#: allianceauth/timerboard/templates/timerboard/timer_confirm_delete.html:11 #: allianceauth/timerboard/templates/timerboard/timer_confirm_delete.html:11
msgid "Delete Timer" msgid "Delete Timer"

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: 2021-10-26 18:36+1000\n" "POT-Creation-Date: 2021-10-30 14:36+1000\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"
@@ -34,12 +34,12 @@ msgstr ""
msgid "Email" msgid "Email"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:74 #: allianceauth/authentication/models.py:79
#, python-format #, python-format
msgid "State changed to: %s" msgid "State changed to: %s"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:75 #: allianceauth/authentication/models.py:80
#, python-format #, python-format
msgid "Your user's state is now: %(state)s" msgid "Your user's state is now: %(state)s"
msgstr "" msgstr ""
@@ -58,29 +58,29 @@ msgid ""
" " " "
msgstr "" msgstr ""
#: allianceauth/authentication/templates/authentication/dashboard.html:81 #: allianceauth/authentication/templates/authentication/dashboard.html:102
msgid "No main character set." msgid "No main character set."
msgstr "" msgstr ""
#: allianceauth/authentication/templates/authentication/dashboard.html:88 #: allianceauth/authentication/templates/authentication/dashboard.html:109
msgid "Add Character" msgid "Add Character"
msgstr "" msgstr ""
#: allianceauth/authentication/templates/authentication/dashboard.html:92 #: allianceauth/authentication/templates/authentication/dashboard.html:113
msgid "Change Main" msgid "Change Main"
msgstr "" msgstr ""
#: allianceauth/authentication/templates/authentication/dashboard.html:101 #: allianceauth/authentication/templates/authentication/dashboard.html:122
msgid "Group Memberships" msgid "Group Memberships"
msgstr "" msgstr ""
#: allianceauth/authentication/templates/authentication/dashboard.html:121 #: allianceauth/authentication/templates/authentication/dashboard.html:142
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticscorpview.html:23 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticscorpview.html:23
#: allianceauth/hrapplications/templates/hrapplications/view.html:41 #: allianceauth/hrapplications/templates/hrapplications/view.html:41
msgid "Characters" msgid "Characters"
msgstr "" msgstr ""
#: allianceauth/authentication/templates/authentication/dashboard.html:129 #: allianceauth/authentication/templates/authentication/dashboard.html:150
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:73 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:73
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:24 #: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:24
#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:15 #: allianceauth/groupmanagement/templates/groupmanagement/groups.html:15
@@ -89,13 +89,13 @@ msgstr ""
msgid "Name" msgid "Name"
msgstr "" msgstr ""
#: allianceauth/authentication/templates/authentication/dashboard.html:130 #: allianceauth/authentication/templates/authentication/dashboard.html:151
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticsview.html:23 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticsview.html:23
#: allianceauth/hrapplications/templates/hrapplications/view.html:46 #: allianceauth/hrapplications/templates/hrapplications/view.html:46
msgid "Corp" msgid "Corp"
msgstr "" msgstr ""
#: allianceauth/authentication/templates/authentication/dashboard.html:131 #: allianceauth/authentication/templates/authentication/dashboard.html:152
#: allianceauth/corputils/templates/corputils/corpstats.html:76 #: allianceauth/corputils/templates/corputils/corpstats.html:76
#: allianceauth/hrapplications/templates/hrapplications/view.html:47 #: allianceauth/hrapplications/templates/hrapplications/view.html:47
msgid "Alliance" msgid "Alliance"

View File

@@ -2,12 +2,14 @@
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package. # This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
# #
# Translators: # Translators:
# François LACROIX-DURANT <umbre@fallenstarscreations.com>, 2020 # François LACROIX-DURANT <umbre@fallenstarscreations.com>, 2020
# Philippe Querin-Laporte <philippe.querin@hotmail.com>, 2020 # Philippe Querin-Laporte <philippe.querin@hotmail.com>, 2020
# Keven D. <theenarki@gmail.com>, 2020 # Keven D. <theenarki@gmail.com>, 2020
# # Idea ., 2021
# Mickael PATTE, 2021
#
#, fuzzy #, fuzzy
msgid "" msgid ""
msgstr "" msgstr ""
@@ -15,7 +17,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-10-26 18:36+1000\n" "POT-Creation-Date: 2021-10-26 18:36+1000\n"
"PO-Revision-Date: 2020-02-18 03:14+0000\n" "PO-Revision-Date: 2020-02-18 03:14+0000\n"
"Last-Translator: Keven D. <theenarki@gmail.com>, 2020\n" "Last-Translator: Mickael PATTE, 2021\n"
"Language-Team: French (France) (https://www.transifex.com/alliance-auth/teams/107430/fr_FR/)\n" "Language-Team: French (France) (https://www.transifex.com/alliance-auth/teams/107430/fr_FR/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@@ -69,7 +71,7 @@ msgstr ""
#: allianceauth/authentication/templates/authentication/dashboard.html:81 #: allianceauth/authentication/templates/authentication/dashboard.html:81
msgid "No main character set." msgid "No main character set."
msgstr "Aucun personnage principal choisi." msgstr "Aucun personnage principal sélectionné."
#: allianceauth/authentication/templates/authentication/dashboard.html:88 #: allianceauth/authentication/templates/authentication/dashboard.html:88
msgid "Add Character" msgid "Add Character"
@@ -77,7 +79,7 @@ msgstr "Ajouter un Personnage"
#: allianceauth/authentication/templates/authentication/dashboard.html:92 #: allianceauth/authentication/templates/authentication/dashboard.html:92
msgid "Change Main" msgid "Change Main"
msgstr "Changer Personnage Principal" msgstr "Changer de Personnage Principal"
#: allianceauth/authentication/templates/authentication/dashboard.html:101 #: allianceauth/authentication/templates/authentication/dashboard.html:101
msgid "Group Memberships" msgid "Group Memberships"
@@ -580,7 +582,7 @@ msgstr "Gestion de groupe"
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:5 #: allianceauth/groupmanagement/templates/groupmanagement/audit.html:5
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:14 #: allianceauth/groupmanagement/templates/groupmanagement/audit.html:14
msgid "Audit Log" msgid "Audit Log"
msgstr "" msgstr "Journal d'audit"
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:20 #: allianceauth/groupmanagement/templates/groupmanagement/audit.html:20
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:21 #: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:21
@@ -618,11 +620,11 @@ msgstr "Acteur"
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:47 #: allianceauth/groupmanagement/templates/groupmanagement/audit.html:47
msgid "Removed" msgid "Removed"
msgstr "" msgstr "Supprimé"
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:59 #: allianceauth/groupmanagement/templates/groupmanagement/audit.html:59
msgid "All times displayed are EVE/UTC." msgid "All times displayed are EVE/UTC."
msgstr "" msgstr "Toutes les heures affichées sont EVE/UTC."
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:66 #: allianceauth/groupmanagement/templates/groupmanagement/audit.html:66
msgid "No entries found for this group." msgid "No entries found for this group."
@@ -642,13 +644,13 @@ msgstr "Organisation"
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:50 #: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:50
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:76 #: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:76
msgid "Group leader" msgid "Group leader"
msgstr "" msgstr "Chef de groupe"
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:61 #: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:61
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:80 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:80
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:136 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:136
msgid "(unknown)" msgid "(unknown)"
msgstr "" msgstr "(inconnu)"
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:66 #: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:66
msgid "Remove from group" msgid "Remove from group"
@@ -1061,19 +1063,19 @@ msgstr "Ajouter un Commentaire"
#: allianceauth/notifications/models.py:21 #: allianceauth/notifications/models.py:21
msgid "danger" msgid "danger"
msgstr "" msgstr "danger"
#: allianceauth/notifications/models.py:22 #: allianceauth/notifications/models.py:22
msgid "warning" msgid "warning"
msgstr "" msgstr "attention"
#: allianceauth/notifications/models.py:23 #: allianceauth/notifications/models.py:23
msgid "info" msgid "info"
msgstr "" msgstr "information"
#: allianceauth/notifications/models.py:24 #: allianceauth/notifications/models.py:24
msgid "success" msgid "success"
msgstr "" msgstr "succès"
#: allianceauth/notifications/templates/notifications/list.html:5 #: allianceauth/notifications/templates/notifications/list.html:5
#: allianceauth/notifications/templates/notifications/list.html:9 #: allianceauth/notifications/templates/notifications/list.html:9
@@ -1134,7 +1136,7 @@ msgstr "Impossible de trouver l'alerte."
#: allianceauth/notifications/views.py:83 #: allianceauth/notifications/views.py:83
msgid "Marked all notifications as read." msgid "Marked all notifications as read."
msgstr "" msgstr "Toutes les notifications ont été marquées comme lues."
#: allianceauth/notifications/views.py:91 #: allianceauth/notifications/views.py:91
msgid "Deleted all read notifications." msgid "Deleted all read notifications."
@@ -1182,7 +1184,7 @@ msgstr "Heure Locale"
#: allianceauth/optimer/templates/optimer/fleetoptable.html:15 #: allianceauth/optimer/templates/optimer/fleetoptable.html:15
msgid "FC" msgid "FC"
msgstr "" msgstr "Commandant de flotte"
#: allianceauth/optimer/templates/optimer/management.html:6 #: allianceauth/optimer/templates/optimer/management.html:6
msgid "Fleet Operation Management" msgid "Fleet Operation Management"
@@ -1294,39 +1296,39 @@ msgstr "États"
#: allianceauth/project_template/project_name/settings/base.py:88 #: allianceauth/project_template/project_name/settings/base.py:88
msgid "English" msgid "English"
msgstr "" msgstr "Anglais"
#: allianceauth/project_template/project_name/settings/base.py:89 #: allianceauth/project_template/project_name/settings/base.py:89
msgid "German" msgid "German"
msgstr "" msgstr "Allemand"
#: allianceauth/project_template/project_name/settings/base.py:90 #: allianceauth/project_template/project_name/settings/base.py:90
msgid "Spanish" msgid "Spanish"
msgstr "" msgstr "Espagnol"
#: allianceauth/project_template/project_name/settings/base.py:91 #: allianceauth/project_template/project_name/settings/base.py:91
msgid "Chinese Simplified" msgid "Chinese Simplified"
msgstr "" msgstr "Chinois simplifié"
#: allianceauth/project_template/project_name/settings/base.py:92 #: allianceauth/project_template/project_name/settings/base.py:92
msgid "Russian" msgid "Russian"
msgstr "" msgstr "Russe"
#: allianceauth/project_template/project_name/settings/base.py:93 #: allianceauth/project_template/project_name/settings/base.py:93
msgid "Korean" msgid "Korean"
msgstr "" msgstr "Coréen"
#: allianceauth/project_template/project_name/settings/base.py:94 #: allianceauth/project_template/project_name/settings/base.py:94
msgid "French" msgid "French"
msgstr "" msgstr "Français"
#: allianceauth/project_template/project_name/settings/base.py:95 #: allianceauth/project_template/project_name/settings/base.py:95
msgid "Japanese" msgid "Japanese"
msgstr "" msgstr "Japonais"
#: allianceauth/project_template/project_name/settings/base.py:96 #: allianceauth/project_template/project_name/settings/base.py:96
msgid "Italian" msgid "Italian"
msgstr "" msgstr "Italien"
#: allianceauth/services/abstract.py:72 #: allianceauth/services/abstract.py:72
msgid "That service account already exists" msgid "That service account already exists"
@@ -1335,7 +1337,7 @@ msgstr "Ce compte de service existe déjà."
#: allianceauth/services/abstract.py:103 #: allianceauth/services/abstract.py:103
#, python-brace-format #, python-brace-format
msgid "Successfully set your {self.service_name} password" msgid "Successfully set your {self.service_name} password"
msgstr "" msgstr "Mot de passe {} créé avec succès."
#: allianceauth/services/auth_hooks.py:12 #: allianceauth/services/auth_hooks.py:12
msgid "Services" msgid "Services"
@@ -1415,7 +1417,7 @@ msgstr ""
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:5 #: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:5
msgid "Discord" msgid "Discord"
msgstr "" msgstr "Discord"
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:18 #: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:18
msgid "Join the Discord server" msgid "Join the Discord server"
@@ -1603,15 +1605,15 @@ msgstr "%s non trouvé sur le serveur."
#: allianceauth/services/modules/teamspeak3/templates/admin/teamspeak3/authts/change_list.html:9 #: allianceauth/services/modules/teamspeak3/templates/admin/teamspeak3/authts/change_list.html:9
msgid "Update TS3 groups" msgid "Update TS3 groups"
msgstr "" msgstr "Mise à jour des groupes TS3"
#: allianceauth/services/modules/teamspeak3/templates/services/teamspeak3/teamspeakjoin.html:6 #: allianceauth/services/modules/teamspeak3/templates/services/teamspeak3/teamspeakjoin.html:6
msgid "Verify Teamspeak" msgid "Verify Teamspeak"
msgstr "" msgstr "Vérifier Teamspeak"
#: allianceauth/services/modules/teamspeak3/templates/services/teamspeak3/teamspeakjoin.html:11 #: allianceauth/services/modules/teamspeak3/templates/services/teamspeak3/teamspeakjoin.html:11
msgid "Verify Teamspeak Identity" msgid "Verify Teamspeak Identity"
msgstr "" msgstr "Vérifier l'identité Teamspeak"
#: allianceauth/services/modules/teamspeak3/templates/services/teamspeak3/teamspeakjoin.html:14 #: allianceauth/services/modules/teamspeak3/templates/services/teamspeak3/teamspeakjoin.html:14
msgid "Join Server" msgid "Join Server"
@@ -1639,18 +1641,18 @@ msgstr "Compte TeamSpeak3 désactivé"
#: allianceauth/services/modules/teamspeak3/views.py:97 #: allianceauth/services/modules/teamspeak3/views.py:97
msgid "Reset TeamSpeak3 permission key." msgid "Reset TeamSpeak3 permission key."
msgstr "" msgstr "Réinitialisez la clé d'autorisation TeamSpeak3."
#: allianceauth/services/modules/xenforo/views.py:30 #: allianceauth/services/modules/xenforo/views.py:30
msgid "Activated XenForo account." msgid "Activated XenForo account."
msgstr "" msgstr "Compte XenForo activé"
#: allianceauth/services/modules/xenforo/views.py:40 #: allianceauth/services/modules/xenforo/views.py:40
#: allianceauth/services/modules/xenforo/views.py:52 #: allianceauth/services/modules/xenforo/views.py:52
#: allianceauth/services/modules/xenforo/views.py:73 #: allianceauth/services/modules/xenforo/views.py:73
#: allianceauth/services/modules/xenforo/views.py:94 #: allianceauth/services/modules/xenforo/views.py:94
msgid "An error occurred while processing your XenForo account." msgid "An error occurred while processing your XenForo account."
msgstr "" msgstr "Une erreur est survenue durant la gestion de votre compte XenForo."
#: allianceauth/services/modules/xenforo/views.py:50 #: allianceauth/services/modules/xenforo/views.py:50
msgid "Deactivated XenForo account." msgid "Deactivated XenForo account."
@@ -1716,7 +1718,7 @@ msgstr ""
#: allianceauth/services/templates/services/services.html:10 #: allianceauth/services/templates/services/services.html:10
msgid "Available Services" msgid "Available Services"
msgstr "" msgstr "Services disponibles"
#: allianceauth/services/templates/services/services.html:15 #: allianceauth/services/templates/services/services.html:15
msgid "Service" msgid "Service"
@@ -1746,15 +1748,15 @@ msgstr "Information additionnelle"
#: allianceauth/srp/form.py:16 #: allianceauth/srp/form.py:16
msgid "Killboard Link (zkillboard.com or kb.evetools.org)" msgid "Killboard Link (zkillboard.com or kb.evetools.org)"
msgstr "" msgstr "Lien ZkillBoard ()"
#: allianceauth/srp/form.py:34 #: allianceauth/srp/form.py:34
msgid "Invalid Link. Please use zkillboard.com or kb.evetools.org" msgid "Invalid Link. Please use zkillboard.com or kb.evetools.org"
msgstr "" msgstr "Lien non valide. Veuillez utiliser zkillboard.com ou kb.evetools.org"
#: allianceauth/srp/form.py:46 #: allianceauth/srp/form.py:46
msgid "Invalid Link. Please post a direct link to a killmail." msgid "Invalid Link. Please post a direct link to a killmail."
msgstr "" msgstr "Lien non valide. Veuillez poster un lien direct vers un Killmail."
#: allianceauth/srp/form.py:53 #: allianceauth/srp/form.py:53
msgid "After Action Report Link" msgid "After Action Report Link"
@@ -1762,12 +1764,12 @@ msgstr ""
#: allianceauth/srp/templates/srp/add.html:6 #: allianceauth/srp/templates/srp/add.html:6
msgid "SRP Fleet Create" msgid "SRP Fleet Create"
msgstr "" msgstr "SRP de flotte crée"
#: allianceauth/srp/templates/srp/add.html:14 #: allianceauth/srp/templates/srp/add.html:14
#: allianceauth/srp/templates/srp/add.html:24 #: allianceauth/srp/templates/srp/add.html:24
msgid "Create SRP Fleet" msgid "Create SRP Fleet"
msgstr "" msgstr "Créer SRP de flotte"
#: allianceauth/srp/templates/srp/add.html:27 #: allianceauth/srp/templates/srp/add.html:27
msgid "Give this link to the line members" msgid "Give this link to the line members"
@@ -1775,15 +1777,15 @@ msgstr "Donner ce lien aux membres de la flotte"
#: allianceauth/srp/templates/srp/data.html:52 #: allianceauth/srp/templates/srp/data.html:52
msgid "SRP Fleet Data" msgid "SRP Fleet Data"
msgstr "" msgstr "Données de flotte SRP"
#: allianceauth/srp/templates/srp/data.html:57 #: allianceauth/srp/templates/srp/data.html:57
msgid "Mark Incomplete" msgid "Mark Incomplete"
msgstr "" msgstr "Marquer incomplet"
#: allianceauth/srp/templates/srp/data.html:61 #: allianceauth/srp/templates/srp/data.html:61
msgid "Mark Completed" msgid "Mark Completed"
msgstr "" msgstr "Marquer Complet"
#: allianceauth/srp/templates/srp/data.html:73 #: allianceauth/srp/templates/srp/data.html:73
#: allianceauth/srp/templates/srp/data.html:160 #: allianceauth/srp/templates/srp/data.html:160
@@ -1799,7 +1801,7 @@ msgstr "Coût en ISK total:"
#: allianceauth/srp/templates/srp/data.html:82 #: allianceauth/srp/templates/srp/data.html:82
#: allianceauth/srp/templates/srp/data.html:169 #: allianceauth/srp/templates/srp/data.html:169
msgid "Are you sure you want to delete SRP requests?" msgid "Are you sure you want to delete SRP requests?"
msgstr "" msgstr "Êtes-vous sûr de vouloir supprimer la requête de SRP ?"
#: allianceauth/srp/templates/srp/data.html:91 #: allianceauth/srp/templates/srp/data.html:91
msgid "Pilot Name" msgid "Pilot Name"
@@ -1819,11 +1821,13 @@ msgstr "Valeur des pertes zKillboard"
#: allianceauth/srp/templates/srp/data.html:96 #: allianceauth/srp/templates/srp/data.html:96
msgid "SRP ISK Cost" msgid "SRP ISK Cost"
msgstr "" msgstr "Coût en ISK SRP"
#: allianceauth/srp/templates/srp/data.html:97 #: allianceauth/srp/templates/srp/data.html:97
msgid "Click value to edit Enter to save & next ESC to cancel" msgid "Click value to edit Enter to save & next ESC to cancel"
msgstr "" msgstr ""
"Cliquez sur la valeur pour modifier, Entrée pour enregistrer & Échap pour "
"annuler"
#: allianceauth/srp/templates/srp/data.html:100 #: allianceauth/srp/templates/srp/data.html:100
msgid "Post Time" msgid "Post Time"
@@ -2045,11 +2049,13 @@ msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:76 #: allianceauth/templates/allianceauth/admin-status/overview.html:76
msgid "Task Queue" msgid "Task Queue"
msgstr "" msgstr "File d'attente des tâches"
#: allianceauth/templates/allianceauth/admin-status/overview.html:93 #: allianceauth/templates/allianceauth/admin-status/overview.html:93
msgid "Error retrieving task queue length" msgid "Error retrieving task queue length"
msgstr "" msgstr ""
"Erreur lors de la récupération de la longueur de la file d'attente des "
"tâches"
#: allianceauth/templates/allianceauth/admin-status/overview.html:95 #: allianceauth/templates/allianceauth/admin-status/overview.html:95
#, python-format #, python-format
@@ -2060,7 +2066,7 @@ msgstr[1] ""
#: allianceauth/templates/allianceauth/night-toggle.html:6 #: allianceauth/templates/allianceauth/night-toggle.html:6
msgid "Night Mode" msgid "Night Mode"
msgstr "" msgstr "Mode Nuit"
#: allianceauth/templates/allianceauth/top-menu-admin.html:9 #: allianceauth/templates/allianceauth/top-menu-admin.html:9
msgid "Admin" msgid "Admin"
@@ -2077,7 +2083,7 @@ msgstr ""
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:10 #: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:10
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:14 #: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:14
msgid "User Menu" msgid "User Menu"
msgstr "" msgstr "Menu Utilisateur"
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:56 #: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:56
msgid "Logout" msgid "Logout"
@@ -2125,7 +2131,7 @@ msgstr "Type de structure"
#: allianceauth/timerboard/form.py:62 #: allianceauth/timerboard/form.py:62
msgid "Timer Type" msgid "Timer Type"
msgstr "" msgstr "Type de timer"
#: allianceauth/timerboard/form.py:63 #: allianceauth/timerboard/form.py:63
#: allianceauth/timerboard/templates/timerboard/view.html:33 #: allianceauth/timerboard/templates/timerboard/view.html:33
@@ -2156,31 +2162,31 @@ msgstr "Limité à la Corporation"
#: allianceauth/timerboard/models.py:14 #: allianceauth/timerboard/models.py:14
msgid "Not Specified" msgid "Not Specified"
msgstr "" msgstr "Non Spécifié"
#: allianceauth/timerboard/models.py:15 #: allianceauth/timerboard/models.py:15
msgid "Shield" msgid "Shield"
msgstr "" msgstr "Bouclier"
#: allianceauth/timerboard/models.py:16 #: allianceauth/timerboard/models.py:16
msgid "Armor" msgid "Armor"
msgstr "" msgstr "Armure"
#: allianceauth/timerboard/models.py:17 #: allianceauth/timerboard/models.py:17
msgid "Hull" msgid "Hull"
msgstr "" msgstr "Coque"
#: allianceauth/timerboard/models.py:18 #: allianceauth/timerboard/models.py:18
msgid "Final" msgid "Final"
msgstr "" msgstr "Final"
#: allianceauth/timerboard/models.py:19 #: allianceauth/timerboard/models.py:19
msgid "Anchoring" msgid "Anchoring"
msgstr "" msgstr "Ancrage"
#: allianceauth/timerboard/models.py:20 #: allianceauth/timerboard/models.py:20
msgid "Unanchoring" msgid "Unanchoring"
msgstr "" msgstr "Désancrage"
#: allianceauth/timerboard/templates/timerboard/timer_confirm_delete.html:11 #: allianceauth/timerboard/templates/timerboard/timer_confirm_delete.html:11
msgid "Delete Timer" msgid "Delete Timer"

View File

@@ -13,7 +13,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: 2021-10-26 18:36+1000\n" "POT-Creation-Date: 2021-10-30 14:36+1000\n"
"PO-Revision-Date: 2020-02-18 03:14+0000\n" "PO-Revision-Date: 2020-02-18 03:14+0000\n"
"Last-Translator: Aaron BuBu <351793078@qq.com>, 2020\n" "Last-Translator: Aaron BuBu <351793078@qq.com>, 2020\n"
"Language-Team: Chinese Simplified (https://www.transifex.com/alliance-auth/teams/107430/zh-Hans/)\n" "Language-Team: Chinese Simplified (https://www.transifex.com/alliance-auth/teams/107430/zh-Hans/)\n"
@@ -39,12 +39,12 @@ msgstr "只有主要角色才能执行这个操作。在下面添加一个"
msgid "Email" msgid "Email"
msgstr "电子邮箱" msgstr "电子邮箱"
#: allianceauth/authentication/models.py:74 #: allianceauth/authentication/models.py:79
#, python-format #, python-format
msgid "State changed to: %s" msgid "State changed to: %s"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:75 #: allianceauth/authentication/models.py:80
#, python-format #, python-format
msgid "Your user's state is now: %(state)s" msgid "Your user's state is now: %(state)s"
msgstr "" msgstr ""
@@ -63,29 +63,29 @@ msgid ""
" " " "
msgstr "" msgstr ""
#: allianceauth/authentication/templates/authentication/dashboard.html:81 #: allianceauth/authentication/templates/authentication/dashboard.html:102
msgid "No main character set." msgid "No main character set."
msgstr "没有主要角色组" msgstr "没有主要角色组"
#: allianceauth/authentication/templates/authentication/dashboard.html:88 #: allianceauth/authentication/templates/authentication/dashboard.html:109
msgid "Add Character" msgid "Add Character"
msgstr "添加角色" msgstr "添加角色"
#: allianceauth/authentication/templates/authentication/dashboard.html:92 #: allianceauth/authentication/templates/authentication/dashboard.html:113
msgid "Change Main" msgid "Change Main"
msgstr "修改主要角色" msgstr "修改主要角色"
#: allianceauth/authentication/templates/authentication/dashboard.html:101 #: allianceauth/authentication/templates/authentication/dashboard.html:122
msgid "Group Memberships" msgid "Group Memberships"
msgstr "用户组成员" msgstr "用户组成员"
#: allianceauth/authentication/templates/authentication/dashboard.html:121 #: allianceauth/authentication/templates/authentication/dashboard.html:142
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticscorpview.html:23 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticscorpview.html:23
#: allianceauth/hrapplications/templates/hrapplications/view.html:41 #: allianceauth/hrapplications/templates/hrapplications/view.html:41
msgid "Characters" msgid "Characters"
msgstr "角色" msgstr "角色"
#: allianceauth/authentication/templates/authentication/dashboard.html:129 #: allianceauth/authentication/templates/authentication/dashboard.html:150
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:73 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:73
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:24 #: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:24
#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:15 #: allianceauth/groupmanagement/templates/groupmanagement/groups.html:15
@@ -94,13 +94,13 @@ msgstr "角色"
msgid "Name" msgid "Name"
msgstr "角色名" msgstr "角色名"
#: allianceauth/authentication/templates/authentication/dashboard.html:130 #: allianceauth/authentication/templates/authentication/dashboard.html:151
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticsview.html:23 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticsview.html:23
#: allianceauth/hrapplications/templates/hrapplications/view.html:46 #: allianceauth/hrapplications/templates/hrapplications/view.html:46
msgid "Corp" msgid "Corp"
msgstr "所在公司" msgstr "所在公司"
#: allianceauth/authentication/templates/authentication/dashboard.html:131 #: allianceauth/authentication/templates/authentication/dashboard.html:152
#: allianceauth/corputils/templates/corputils/corpstats.html:76 #: allianceauth/corputils/templates/corputils/corpstats.html:76
#: allianceauth/hrapplications/templates/hrapplications/view.html:47 #: allianceauth/hrapplications/templates/hrapplications/view.html:47
msgid "Alliance" msgid "Alliance"

View File

@@ -1,5 +1,6 @@
from django.contrib import admin from django.contrib import admin
from allianceauth.optimer.models import OpTimer from allianceauth.optimer.models import OpTimer, OpTimerType
admin.site.register(OpTimerType)
admin.site.register(OpTimer) admin.site.register(OpTimer)

View File

@@ -1,11 +1,34 @@
from django import forms from django import forms
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from allianceauth.optimer.form_widgets import DataListWidget
class OpForm(forms.Form): class OpForm(forms.Form):
"""
Create/Edit Fleet Operation Form
"""
doctrine = forms.CharField(max_length=254, required=True, label=_('Doctrine')) doctrine = forms.CharField(max_length=254, required=True, label=_('Doctrine'))
system = forms.CharField(max_length=254, required=True, label=_("System")) system = forms.CharField(max_length=254, required=True, label=_("System"))
start = forms.DateTimeField(required=True, label=_("Start Time")) start = forms.DateTimeField(required=True, label=_("Start Time"))
duration = forms.CharField(max_length=254, required=True, label=_("Duration"))
operation_name = forms.CharField(max_length=254, required=True, label=_("Operation Name")) operation_name = forms.CharField(max_length=254, required=True, label=_("Operation Name"))
type = forms.CharField(required=False, label=_("Operation Type"))
fc = forms.CharField(max_length=254, required=True, label=_("Fleet Commander")) fc = forms.CharField(max_length=254, required=True, label=_("Fleet Commander"))
duration = forms.CharField(max_length=254, required=True, label=_("Duration"))
description = forms.CharField(
widget=forms.Textarea(attrs={"rows": 10, "cols": 20, "input_type": "textarea"}),
required=False,
label=_("Additional Info"),
help_text=_("(Optional) Describe the operation with a couple of short words."),
)
def __init__(self, *args, **kwargs):
_data_list = kwargs.pop('data_list', None)
super().__init__(*args, **kwargs)
# Add the DataListWidget to our type field
self.fields['type'].widget = DataListWidget(
data_list=_data_list, name='data-list'
)

View File

@@ -0,0 +1,45 @@
"""
Form Widgets
"""
from django import forms
class DataListWidget(forms.TextInput):
"""
DataListWidget
Draws an HTML5 datalist form field
"""
def __init__(self, data_list, name, *args, **kwargs):
super().__init__(*args, **kwargs)
self._name = name
self._list = data_list
self.attrs.update({"list": "list__%s" % self._name})
def render(self, name, value, attrs=None, renderer=None):
"""
Render the DataList
:param name:
:type name:
:param value:
:type value:
:param attrs:
:type attrs:
:param renderer:
:type renderer:
:return:
:rtype:
"""
text_html = super().render(name, value, attrs=attrs)
data_list = '<datalist id="list__%s">' % self._name
for item in self._list:
data_list += '<option value="%s">' % item
data_list += "</datalist>"
return text_html + data_list

View File

@@ -0,0 +1,50 @@
# Generated by Django 3.2.8 on 2021-10-26 16:20
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
("optimer", "0004_on_delete"),
]
operations = [
migrations.CreateModel(
name="OpTimerType",
fields=[
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("type", models.CharField(default="", max_length=254)),
],
options={
"ordering": ["type"],
"default_permissions": (),
},
),
migrations.AlterModelOptions(
name="optimer",
options={"default_permissions": (), "ordering": ["start"]},
),
migrations.AddField(
model_name="optimer",
name="description",
field=models.TextField(blank=True, default=""),
),
migrations.AddField(
model_name="optimer",
name="type",
field=models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.SET_NULL,
to="optimer.optimertype",
),
),
]

View File

@@ -6,9 +6,25 @@ from django.utils import timezone
from allianceauth.eveonline.models import EveCharacter from allianceauth.eveonline.models import EveCharacter
class OpTimerType(models.Model):
"""
Optimer Type
"""
type = models.CharField(max_length=254, default="")
def __str__(self):
return self.type
class Meta:
ordering = ['type']
default_permissions = ()
class OpTimer(models.Model): class OpTimer(models.Model):
class Meta: class Meta:
ordering = ['start'] ordering = ['start']
default_permissions = ()
doctrine = models.CharField(max_length=254, default="") doctrine = models.CharField(max_length=254, default="")
system = models.CharField(max_length=254, default="") system = models.CharField(max_length=254, default="")
@@ -17,7 +33,10 @@ class OpTimer(models.Model):
operation_name = models.CharField(max_length=254, default="") operation_name = models.CharField(max_length=254, default="")
fc = models.CharField(max_length=254, default="") fc = models.CharField(max_length=254, default="")
post_time = models.DateTimeField(default=timezone.now) post_time = models.DateTimeField(default=timezone.now)
eve_character = models.ForeignKey(EveCharacter, null=True, on_delete=models.SET_NULL) eve_character = models.ForeignKey(EveCharacter, null=True,
on_delete=models.SET_NULL)
description = models.TextField(blank=True, default="")
type = models.ForeignKey(OpTimerType, null=True, on_delete=models.SET_NULL)
def __str__(self): def __str__(self):
return self.operation_name return self.operation_name

View File

@@ -6,37 +6,48 @@
<table class="table"> <table class="table">
<thead> <thead>
<tr> <tr>
<th class="text-center col-lg-3">{% translate "Operation Name" %}</th> <th>{% translate "Operation Name" %}</th>
<th class="text-center col lg-2">{% translate "Doctrine" %}</th> <th>{% translate "Description" %}</th>
<th class="text-center col-lg-1">{% translate "Form Up System" %}</th> <th>{% translate "Doctrine" %}</th>
<th class="text-center col-lg-1">{% translate "Start Time" %}</th> <th>{% translate "Form Up System" %}</th>
<th class="text-center col-lg-1">{% translate "Local Time" %}</th> <th>{% translate "Start Time" %}</th>
<th class="text-center col-lg-1">{% translate "Duration" %}</th> <th>{% translate "Local Time" %}</th>
<th class="text-center col-lg-1">{% translate "FC" %}</th> <th>{% translate "Duration" %}</th>
<th>{% translate "FC" %}</th>
{% if perms.auth.optimer_management %} {% if perms.auth.optimer_management %}
<th class="text-center col-lg-1">{% translate "Creator" %}</th> {# <th>{% translate "Creator" %}</th>#}
<th class="text-center col-lg-2">{% translate "Action" %}</th> <th class="text-right" style="width: 150px;">{% translate "Action" %}</th>
{% endif %} {% endif %}
</tr> </tr>
</thead> </thead>
{% for ops in timers %} {% for ops in timers %}
<tbody> <tbody>
<tr> <tr>
<td class="text-center">{{ ops.operation_name }}</td> <td>
<td class="text-center">{{ ops.doctrine }}</td> {{ ops.operation_name }}
<td class="text-center"> {% if ops.type %}
<br>({{ ops.type }})
{% endif %}
</td>
<td>{{ ops.description }}</td>
<td>{{ ops.doctrine }}</td>
<td>
<a href="{{ ops.system|dotlan_solar_system_url }}">{{ ops.system }}</a> <a href="{{ ops.system|dotlan_solar_system_url }}">{{ ops.system }}</a>
</td> </td>
<td class="text-center" nowrap>{{ ops.start | date:"Y-m-d H:i" }}</td> <td nowrap>{{ ops.start | date:"Y-m-d H:i" }}</td>
<td class="text-center" nowrap><div id="localtime{{ ops.id }}"></div><div id="countdown{{ ops.id }}"></div></td> <td nowrap><div id="localtime{{ ops.id }}"></div><div id="countdown{{ ops.id }}"></div></td>
<td class="text-center">{{ ops.duration }}</td> <td>{{ ops.duration }}</td>
<td class="text-center">{{ ops.fc }}</td> <td>{{ ops.fc }}</td>
{% if perms.auth.optimer_management %} {% if perms.auth.optimer_management %}
<td class="text-center">{{ ops.eve_character }}</td> {# <td>{{ ops.eve_character }}</td>#}
<td class="text-center"> <td class="text-right">
<a href="{% url 'optimer:remove' ops.id %}" class="btn btn-danger"> <a href="{% url 'optimer:remove' ops.id %}" class="btn btn-danger">
<span class="glyphicon glyphicon-remove"></span> <span class="glyphicon glyphicon-remove"></span>
</a><a href="{% url 'optimer:edit' ops.id %}" class="btn btn-info"><span class="glyphicon glyphicon-pencil"></span></a> </a>
<a href="{% url 'optimer:edit' ops.id %}" class="btn btn-info">
<span class="glyphicon glyphicon-pencil"></span>
</a>
</td> </td>
{% endif %} {% endif %}
</tr> </tr>

View File

@@ -24,14 +24,14 @@
<br /> <br />
</div> </div>
<h4><b>{% translate "Next Timers" %}</b></h4> <h4><b>{% translate "Next Fleet Operations" %}</b></h4>
{% if future_timers %} {% if future_timers %}
{% include "optimer/fleetoptable.html" with timers=future_timers %} {% include "optimer/fleetoptable.html" with timers=future_timers %}
{% else %} {% else %}
<div class="alert alert-warning text-center">{% translate "No upcoming timers." %}</div> <div class="alert alert-warning text-center">{% translate "No upcoming timers." %}</div>
{% endif %} {% endif %}
<h4><b>{% translate "Past Timers" %}</b></h4> <h4><b>{% translate "Past Fleet Operations" %}</b></h4>
{% if past_timers %} {% if past_timers %}
{% include "optimer/fleetoptable.html" with timers=past_timers %} {% include "optimer/fleetoptable.html" with timers=past_timers %}
{% else %} {% else %}

View File

@@ -9,7 +9,7 @@ from django.utils import timezone
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from .form import OpForm from .form import OpForm
from .models import OpTimer from .models import OpTimer, OpTimerType
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -18,7 +18,7 @@ logger = logging.getLogger(__name__)
@permission_required('auth.optimer_view') @permission_required('auth.optimer_view')
def optimer_view(request): def optimer_view(request):
logger.debug("optimer_view called by user %s" % request.user) logger.debug("optimer_view called by user %s" % request.user)
base_query = OpTimer.objects.select_related('eve_character') base_query = OpTimer.objects.select_related('eve_character', 'type')
render_items = {'optimer': base_query.all(), render_items = {'optimer': base_query.all(),
'future_timers': base_query.filter( 'future_timers': base_query.filter(
start__gte=timezone.now()), start__gte=timezone.now()),
@@ -33,9 +33,21 @@ def optimer_view(request):
def add_optimer_view(request): def add_optimer_view(request):
logger.debug("add_optimer_view called by user %s" % request.user) logger.debug("add_optimer_view called by user %s" % request.user)
if request.method == 'POST': if request.method == 'POST':
form = OpForm(request.POST) form = OpForm(request.POST, data_list=OpTimerType.objects.all())
logger.debug("Request type POST contains form valid: %s" % form.is_valid()) logger.debug("Request type POST contains form valid: %s" % form.is_valid())
if form.is_valid(): if form.is_valid():
optimer_type = None
if form.cleaned_data['type'] != '':
try:
optimer_type = OpTimerType.objects.get(
type__iexact=form.cleaned_data['type']
)
except OpTimerType.DoesNotExist:
optimer_type = OpTimerType.objects.create(
type=form.cleaned_data['type']
)
# Get Current Time # Get Current Time
post_time = timezone.now() post_time = timezone.now()
# Get character # Get character
@@ -50,13 +62,15 @@ def add_optimer_view(request):
op.fc = form.cleaned_data['fc'] op.fc = form.cleaned_data['fc']
op.create_time = post_time op.create_time = post_time
op.eve_character = character op.eve_character = character
op.type = optimer_type
op.description = form.cleaned_data['description']
op.save() op.save()
logger.info(f"User {request.user} created op timer with name {op.operation_name}") logger.info(f"User {request.user} created op timer with name {op.operation_name}")
messages.success(request, _('Created operation timer for %(opname)s.') % {"opname": op.operation_name}) messages.success(request, _('Created operation timer for %(opname)s.') % {"opname": op.operation_name})
return redirect("optimer:view") return redirect("optimer:view")
else: else:
logger.debug("Returning new opForm") logger.debug("Returning new opForm")
form = OpForm() form = OpForm(data_list=OpTimerType.objects.all())
render_items = {'form': form} render_items = {'form': form}
@@ -80,10 +94,23 @@ def edit_optimer(request, optimer_id):
logger.debug(f"edit_optimer called by user {request.user} for optimer id {optimer_id}") logger.debug(f"edit_optimer called by user {request.user} for optimer id {optimer_id}")
op = get_object_or_404(OpTimer, id=optimer_id) op = get_object_or_404(OpTimer, id=optimer_id)
if request.method == 'POST': if request.method == 'POST':
form = OpForm(request.POST) form = OpForm(request.POST, data_list=OpTimerType.objects.all())
logger.debug("Received POST request containing update optimer form, is valid: %s" % form.is_valid()) logger.debug("Received POST request containing update optimer form, is valid: %s" % form.is_valid())
if form.is_valid(): if form.is_valid():
character = request.user.profile.main_character character = request.user.profile.main_character
optimer_type = None
if form.cleaned_data['type'] != '':
try:
optimer_type = OpTimerType.objects.get(
type__iexact=form.cleaned_data['type']
)
except OpTimerType.DoesNotExist:
optimer_type = OpTimerType.objects.create(
type=form.cleaned_data['type']
)
op.doctrine = form.cleaned_data['doctrine'] op.doctrine = form.cleaned_data['doctrine']
op.system = form.cleaned_data['system'] op.system = form.cleaned_data['system']
op.start = form.cleaned_data['start'] op.start = form.cleaned_data['start']
@@ -91,6 +118,8 @@ def edit_optimer(request, optimer_id):
op.operation_name = form.cleaned_data['operation_name'] op.operation_name = form.cleaned_data['operation_name']
op.fc = form.cleaned_data['fc'] op.fc = form.cleaned_data['fc']
op.eve_character = character op.eve_character = character
op.type = optimer_type
op.description = form.cleaned_data['description']
logger.info(f"User {request.user} updating optimer id {optimer_id} ") logger.info(f"User {request.user} updating optimer id {optimer_id} ")
op.save() op.save()
messages.success(request, _('Saved changes to operation timer for %(opname)s.') % {"opname": op.operation_name}) messages.success(request, _('Saved changes to operation timer for %(opname)s.') % {"opname": op.operation_name})
@@ -103,6 +132,8 @@ def edit_optimer(request, optimer_id):
'duration': op.duration, 'duration': op.duration,
'operation_name': op.operation_name, 'operation_name': op.operation_name,
'fc': op.fc, 'fc': op.fc,
'description': op.description,
'type': op.type
} }
form = OpForm(initial=data) form = OpForm(initial=data, data_list=OpTimerType.objects.all())
return render(request, 'optimer/update.html', context={'form': form}) return render(request, 'optimer/update.html', context={'form': form})

View File

@@ -5,7 +5,7 @@ import requests
from django.contrib.auth.models import User from django.contrib.auth.models import User
from allianceauth import NAME from allianceauth import NAME
from allianceauth.eveonline.providers import provider from allianceauth.srp.providers import esi
from .models import SrpUserRequest from .models import SrpUserRequest
@@ -32,8 +32,7 @@ class SRPManager:
if result: if result:
killmail_id = result['killmail_id'] killmail_id = result['killmail_id']
killmail_hash = result['zkb']['hash'] killmail_hash = result['zkb']['hash']
c = provider.client km = esi.client.Killmails.get_killmails_killmail_id_killmail_hash(
km = c.Killmails.get_killmails_killmail_id_killmail_hash(
killmail_id=killmail_id, killmail_id=killmail_id,
killmail_hash=killmail_hash killmail_hash=killmail_hash
).result() ).result()

View File

@@ -0,0 +1,18 @@
import os
from esi.clients import EsiClientProvider
from allianceauth import __version__
SWAGGER_SPEC = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'swagger.json')
"""
Swagger spec operations:
get_killmails_killmail_id_killmail_hash
get_universe_types_type_id
"""
esi = EsiClientProvider(
spec_file=SWAGGER_SPEC,
app_info_text=("allianceauth v" + __version__)
)

File diff suppressed because one or more lines are too long

View File

@@ -36,7 +36,7 @@ class TestSrpManager(TestCase):
expected = 81973979 expected = 81973979
self.assertEqual(int(SRPManager.get_kill_id(link)), expected) self.assertEqual(int(SRPManager.get_kill_id(link)), expected)
@patch(MODULE_PATH + '.provider') @patch(MODULE_PATH + '.esi')
@patch(MODULE_PATH + '.requests.get') @patch(MODULE_PATH + '.requests.get')
def test_can_get_kill_data(self, mock_get, mock_provider): def test_can_get_kill_data(self, mock_get, mock_provider):
mock_get.return_value.json.return_value = load_data( mock_get.return_value.json.return_value = load_data(
@@ -60,7 +60,7 @@ class TestSrpManager(TestCase):
with self.assertRaises(ValueError): with self.assertRaises(ValueError):
SRPManager.get_kill_data(81973979) SRPManager.get_kill_data(81973979)
@patch(MODULE_PATH + '.provider') @patch(MODULE_PATH + '.esi')
@patch(MODULE_PATH + '.requests.get') @patch(MODULE_PATH + '.requests.get')
def test_invalid_id_for_esi_raises_exception( def test_invalid_id_for_esi_raises_exception(
self, mock_get, mock_provider self, mock_get, mock_provider

View File

@@ -11,7 +11,7 @@ from django.utils import timezone
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.db.models import Sum from django.db.models import Sum
from allianceauth.authentication.decorators import permissions_required from allianceauth.authentication.decorators import permissions_required
from allianceauth.eveonline.providers import provider from allianceauth.srp.providers import esi
from allianceauth.notifications import notify from allianceauth.notifications import notify
from .form import SrpFleetMainForm from .form import SrpFleetMainForm
from .form import SrpFleetMainUpdateForm from .form import SrpFleetMainUpdateForm
@@ -201,7 +201,8 @@ def srp_request_view(request, fleet_srp):
return redirect("srp:management") return redirect("srp:management")
if request.user.character_ownerships.filter(character__character_id=str(victim_id)).exists(): if request.user.character_ownerships.filter(character__character_id=str(victim_id)).exists():
srp_request.srp_ship_name = provider.get_itemtype(ship_type_id).name item_type = esi.client.Universe.get_universe_types_type_id(type_id=ship_type_id).result()
srp_request.srp_ship_name = item_type['name']
srp_request.kb_total_loss = ship_value srp_request.kb_total_loss = ship_value
srp_request.post_time = post_time srp_request.post_time = post_time
srp_request.save() srp_request.save()

View File

@@ -1,9 +1,9 @@
// Alliance Auth customisations of the bootswatch Darkly theme // Alliance Auth customisations of the bootswatch Darkly theme
// To build a new CSS file you need to `npm install -g less less-plugin-clean-css` // To build a new CSS file you need to `npm install -g less less-plugin-clean-css`
// Then `lessc --clean-css darkly.less darkly.min.css` // Then `lessc --clean-css="--advanced" darkly.less darkly.min.css`
@import "https://raw.githubusercontent.com/thomaspark/bootswatch/v3/bower_components/bootstrap/less/bootstrap.less"; @import "https://raw.githubusercontent.com/thomaspark/bootswatch/v3/bower_components/bootstrap/less/bootstrap.less";
@import "https://raw.githubusercontent.com/thomaspark/bootswatch/v3/darkly/variables.less"; @import "https://raw.githubusercontent.com/thomaspark/bootswatch/v3/darkly/variables.less";
@import "https://raw.githubusercontent.com/thomaspark/bootswatch/v3/darkly/bootswatch.less"; @import "https://raw.githubusercontent.com/thomaspark/bootswatch/fa207fbbc80bd74339e179b054a322b092be98f6/darkly/bootswatch.less";
@import "../bootstrap-locals.less"; @import "../bootstrap-locals.less";
@import "../flatly-shared.less"; @import "../flatly-shared.less";

File diff suppressed because one or more lines are too long

View File

@@ -1,10 +1,10 @@
// Alliance Auth customisations of the bootswatch Flatly theme // Alliance Auth customisations of the bootswatch Flatly theme
// To build a new CSS file you need to `npm install -g less less-plugin-clean-css` // To build a new CSS file you need to `npm install -g less less-plugin-clean-css`
// Then `lessc --clean-css flatly.less flatly.min.css` // Then `lessc --clean-css="--advanced" flatly.less flatly.min.css`
@import "https://raw.githubusercontent.com/thomaspark/bootswatch/v3/bower_components/bootstrap/less/bootstrap.less"; @import "https://raw.githubusercontent.com/thomaspark/bootswatch/v3/bower_components/bootstrap/less/bootstrap.less";
@import "https://raw.githubusercontent.com/thomaspark/bootswatch/v3/flatly/variables.less"; @import "https://raw.githubusercontent.com/thomaspark/bootswatch/v3/flatly/variables.less";
@import "https://raw.githubusercontent.com/thomaspark/bootswatch/v3/flatly/bootswatch.less"; @import "https://raw.githubusercontent.com/thomaspark/bootswatch/fa207fbbc80bd74339e179b054a322b092be98f6/flatly/bootswatch.less";
@import "../bootstrap-locals.less"; @import "../bootstrap-locals.less";
@import "../flatly-shared.less"; @import "../flatly-shared.less";

File diff suppressed because one or more lines are too long

View File

@@ -4,15 +4,14 @@
{% if debug %} {% if debug %}
<!-- In template debug, loading less file instead of CSS --> <!-- In template debug, loading less file instead of CSS -->
<link rel="stylesheet/less" type="text/css" href="{% static 'css/themes/darkly/darkly.less' %}" /> <link rel="stylesheet/less" type="text/css" href="{% static 'css/themes/darkly/darkly.less' %}" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/less.js/2.7.3/less.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/less.js/4.1.2/less.min.js" integrity="sha512-eXBn7AaMbUOWb3PSDhwcjByoM89FeO1SF9Jww6kqPYQkBrGZvqAKFbtqLHh5O95rYA/AOtWZ0QRO2S6rP+KsUw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script> {% else %}
{% else %}
<link rel="stylesheet" type="text/css" href="{% static 'css/themes/darkly/darkly.min.css' %}" /> <link rel="stylesheet" type="text/css" href="{% static 'css/themes/darkly/darkly.min.css' %}" />
{% endif %} {% endif %}
{% else %} {% else %}
{% if debug %} {% if debug %}
<!-- In template debug, loading less file instead of CSS --> <!-- In template debug, loading less file instead of CSS -->
<link rel="stylesheet/less" type="text/css" href="{% static 'css/themes/flatly/flatly.less' %}" /> <link rel="stylesheet/less" type="text/css" href="{% static 'css/themes/flatly/flatly.less' %}" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/less.js/2.7.3/less.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/less.js/4.1.2/less.min.js" integrity="sha512-eXBn7AaMbUOWb3PSDhwcjByoM89FeO1SF9Jww6kqPYQkBrGZvqAKFbtqLHh5O95rYA/AOtWZ0QRO2S6rP+KsUw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
{% else %} {% else %}
<link rel="stylesheet" type="text/css" href="{% static 'css/themes/flatly/flatly.min.css' %}" /> <link rel="stylesheet" type="text/css" href="{% static 'css/themes/flatly/flatly.min.css' %}" />
{% endif %} {% endif %}

View File

@@ -1,4 +1,4 @@
<!-- Start Bootstrap + jQuery js from cdnjs --> <!-- Start Bootstrap + jQuery js from cdnjs -->
<script type="application/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js" integrity="sha512-894YE6QWD5I59HgZOGReFYm4dnWc1Qt5NtvYSaNcOP+u1T9qYdvdihz0PPSiiqn/+/3e7Jo4EaG7TubfWGUrMQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script type="application/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js" integrity="sha512-oBTprMeNEKCnqfuqKd6sbvFzmFQtlXS3e0C/RGFV0hD6QzhHV+ODfaQbAlmY6/q0ubbwlAM/nCJjkrgA3waLzg==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<!-- End Bootstrap + jQuery js from cdnjs --> <!-- End Bootstrap + jQuery js from cdnjs -->

View File

@@ -1,3 +1,3 @@
<!-- Start Datatables-css from cdnjs --> <!-- Start Datatables-css from cdnjs -->
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/datatables/1.10.21/css/dataTables.bootstrap.min.css"/> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/datatables/1.10.21/css/dataTables.bootstrap.min.css" integrity="sha512-BMbq2It2D3J17/C7aRklzOODG1IQ3+MHw3ifzBHMBwGO/0yUqYmsStgBjI0z5EYlaDEFnvYV7gNYdD3vFLRKsA==" crossorigin="anonymous" referrerpolicy="no-referrer" />
<!-- End Datatables-css from cdnjs --> <!-- End Datatables-css from cdnjs -->

View File

@@ -1,4 +1,4 @@
<!-- Start Datatables-js from cdnjs --> <!-- Start Datatables-js from cdnjs -->
<script type="application/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/datatables/1.10.21/js/jquery.dataTables.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/datatables/1.10.21/js/jquery.dataTables.min.js" integrity="sha512-BkpSL20WETFylMrcirBahHfSnY++H2O1W+UnEEO4yNIl+jI2+zowyoGJpbtk6bx97fBXf++WJHSSK2MV4ghPcg==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script type="application/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/datatables/1.10.21/js/dataTables.bootstrap.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/datatables/1.10.21/js/dataTables.bootstrap.min.js" integrity="sha512-F0E+jKGaUC90odiinxkfeS3zm9uUT1/lpusNtgXboaMdA3QFMUez0pBmAeXGXtGxoGZg3bLmrkSkbK1quua4/Q==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<!-- End Datatables-js from cdnjs --> <!-- End Datatables-js from cdnjs -->

View File

@@ -1,3 +1,3 @@
<!-- Start FontAwesome CSS from cdnjs --> <!-- Start FontAwesome CSS from cdnjs -->
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.14.0/css/all.min.css"/> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css" integrity="sha512-1ycn6IcaQQ40/MKBW2W4Rhis/DbILU74C1vSrLJxCq57o941Ym01SwNsOMqvEBFlcgUa6xLiPY/NS5R+E6ztJQ==" crossorigin="anonymous" referrerpolicy="no-referrer" />
<!-- End FontAwesome CSS from cdnjs --> <!-- End FontAwesome CSS from cdnjs -->

View File

@@ -1,3 +1,3 @@
<!-- Start jQuery-DateTimePicker CSS from cdnjs --> <!-- Start jQuery-DateTimePicker CSS from cdnjs -->
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/jquery-datetimepicker/2.5.20/jquery.datetimepicker.min.css"/> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jquery-datetimepicker/2.5.20/jquery.datetimepicker.min.css" integrity="sha512-f0tzWhCwVFS3WeYaofoLWkTP62ObhewQ1EZn65oSYDZUg1+CyywGKkWzm8BxaJj5HGKI72PnMH9jYyIFz+GH7g==" crossorigin="anonymous" referrerpolicy="no-referrer" />
<!-- End jQuery-DateTimePicker CSS from cdnjs --> <!-- End jQuery-DateTimePicker CSS from cdnjs -->

View File

@@ -1,3 +1,3 @@
<!-- Start jQuery-DateTimePicker JS from cdnjs --> <!-- Start jQuery-DateTimePicker JS from cdnjs -->
<script type="application/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery-datetimepicker/2.5.20/jquery.datetimepicker.full.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-datetimepicker/2.5.20/jquery.datetimepicker.full.min.js" integrity="sha512-AIOTidJAcHBH2G/oZv9viEGXRqDNmfdPVPYOYKGy3fti0xIplnlgMHUGfuNRzC6FkzIo0iIxgFnr9RikFxK+sw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<!-- End jQuery-DateTimePicker JS from cdnjs --> <!-- End jQuery-DateTimePicker JS from cdnjs -->

View File

@@ -1,4 +1,4 @@
{% load static %} {% load static %}
<!-- Start jQuery visibility js --> <!-- Start jQuery visibility js -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-visibility/1.0.11/jquery-visibility.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-visibility/1.0.11/jquery-visibility.min.js" integrity="sha512-kL8M4N4KLFJ4ydyfbBiXU1InCR6zs8jm8NR1BXykgFmMhVO3RS9bvoMHnVwoPe+i6NRvfydNlweatKee85Df3A==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<!-- End jQuery visibility js --> <!-- End jQuery visibility js -->

View File

@@ -1,7 +1,7 @@
<!-- Start Moment.js from cdnjs --> <!-- Start Moment.js from cdnjs -->
<script type="application/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.27.0/moment.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js" integrity="sha512-qTXRIMyZIFb8iQcfjXWCO8+M5Tbc38Qi5WzdPOYZHIlZpzBHG3L3by84BBBOiRGiEb7KKtAOAs5qYdUiZiQNNQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
{% if locale and LANGUAGE_CODE != 'en' %} {% if locale and LANGUAGE_CODE != 'en' %}
<!-- Moment.JS Not EN-en --> <!-- Moment.JS Not EN-en -->
<script type="application/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.27.0/locale/{{ LANGUAGE_CODE }}.js"></script> <script type="application/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/locale/{{ LANGUAGE_CODE }}.js"></script>
{% endif %} {% endif %}
<!-- End Moment JS from cdnjs --> <!-- End Moment JS from cdnjs -->

View File

@@ -1,3 +1,3 @@
<!-- Start X-editable JS from cdnjs --> <!-- Start X-editable JS from cdnjs -->
<script type="application/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/x-editable/1.5.1/bootstrap3-editable/js/bootstrap-editable.min.js"></script> <<script src="https://cdnjs.cloudflare.com/ajax/libs/x-editable/1.5.1/bootstrap3-editable/js/bootstrap-editable.min.js" integrity="sha512-Mvqhe3YIUElH6VT0CFmUeRgYMrLvCGd2mvYCnJOf2nL9FvRBK74qRgTn7u0zSqA5cHiGxy83bwuhl1ASbS9M/w==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<!-- End X-editable JS from cdnjs --> <!-- End X-editable JS from cdnjs -->

View File

@@ -1,3 +1,3 @@
<!-- Start X-editable CSS from cdnjs --> <!-- Start X-editable CSS from cdnjs -->
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/x-editable/1.5.1/bootstrap3-editable/css/bootstrap-editable.css"/> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/x-editable/1.5.1/bootstrap3-editable/css/bootstrap-editable.css" integrity="sha512-e0rbO6UJET0zDdXOHjwc6D44UpeKumn7cU7XR/fa4S0/Jso0bZqcCqlIF6mtvcimMbf846mkv8aSWFnTwABr/g==" crossorigin="anonymous" referrerpolicy="no-referrer" />
<!-- End X-editable CSS from cdnjs --> <!-- End X-editable CSS from cdnjs -->

View File

@@ -15,14 +15,14 @@ install_requires = [
'python-slugify>=1.2', 'python-slugify>=1.2',
'requests-oauthlib', 'requests-oauthlib',
'semantic_version', 'semantic_version',
'packaging>=20.1,<21', 'packaging>=21.0,<22',
'beautifulsoup4', 'beautifulsoup4',
'redis>=3.3.1,<4.0.0', 'redis>=3.3.1,<4.0.0',
'celery>=4.3.0,<6.0.0,!=4.4.4', # 4.4.4 is missing a dependency 'celery>=4.3.0,<6.0.0,!=4.4.4', # 4.4.4 is missing a dependency
'celery_once>=2.0.1', 'celery_once>=2.0.1',
'django>=3.2.7,<4.0.0', 'django>=3.2.8,<4.0.0',
'django-bootstrap-form', 'django-bootstrap-form',
'django-registration>=3.1', 'django-registration>=3.1',
'django-sortedm2m', 'django-sortedm2m',