Skip to content

Commit

Permalink
Merge pull request #86 from datalab-mi/develop
Browse files Browse the repository at this point in the history
Develop
  • Loading branch information
leihuayi authored Sep 28, 2022
2 parents 7a1bb94 + 7f169f3 commit d9ecda9
Show file tree
Hide file tree
Showing 12 changed files with 156 additions and 36 deletions.
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
SHELL := /bin/bash
DOCKER := $(shell type -p docker)
DC := $(shell type -p docker-compose)
TAG := 1.3
TAG := 1.4
APP_NAME := basegun
REG := ghcr.io
ORG := datalab-mi
Expand Down
36 changes: 25 additions & 11 deletions backend/src/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,19 @@ def setup_logs(log_dir: str) -> logging.Logger:
return logger


def get_device(user_agent) -> str:
"""Explicitly give the device of a user-agent object
"""
if user_agent.is_mobile:
return "mobile"
elif user_agent.is_pc:
return "pc"
elif user_agent.is_tablet:
return "tablet"
else:
return "other"


####################
# SETUP #
####################
Expand Down Expand Up @@ -219,18 +232,11 @@ async def imageupload(

# prepare content logs
user_agent = parse(request.headers.get("user-agent"))
device = "other"
if user_agent.is_mobile:
device = "mobile"
elif user_agent.is_pc:
device = "pc"
elif user_agent.is_tablet:
device = "tablet"
extras_logging = {
"bg_date": datetime.now().isoformat(),
"bg_upload_time": round(time.time()-date, 2),
"bg_geolocation": geolocation,
"bg_device": device,
"bg_device": get_device(user_agent),
"bg_device_family": user_agent.device.family,
"bg_device_os": user_agent.os.family,
"bg_device_browser": user_agent.browser.family,
Expand Down Expand Up @@ -282,15 +288,23 @@ async def imageupload(


@app.post("/feedback")
async def log_feedback(request: Request):
async def log_feedback(request: Request, user_id: Union[str, None] = Cookie(None)):
res = await request.json()
user_agent = parse(request.headers.get("user-agent"))

extras_logging = {
"bg_date": datetime.now().isoformat(),
"bg_image_url": res["image_url"],
"bg_feedback_bool": res["feedback"],
"bg_confidence": res["confidence"],
"bg_label": res["label"],
"bg_confidence_level": res["confidence_level"]
"bg_confidence": res["confidence"],
"bg_confidence_level": res["confidence_level"],
"bg_user_id": user_id,
"bg_device": get_device(user_agent),
"bg_device_family": user_agent.device.family,
"bg_device_os": user_agent.os.family,
"bg_device_browser": user_agent.browser.family,
"bg_version": APP_VERSION,
}
logger.info("Identification feedback", extra=extras_logging)
return
6 changes: 6 additions & 0 deletions backend/tests/test_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,12 @@ def test_feedback_and_logs(self):
r = requests.get(self.url + "/logs")
self.assertEqual(r.status_code, 200)
log = r.json()[0]
self.assertEqual(
set(log.keys()),
set({'timestamp', '_bg_device', 'host', '_bg_feedback_bool', 'version', '_bg_device_os', '_bg_device_family',
'short_message', '_bg_confidence', '_bg_confidence_level', '_bg_date', '_bg_user_id', '_bg_label', '_bg_image_url',
'level', '_bg_device_browser', '_bg_version'})
)
self.assertEqual(log["level"], 6)
self.assertEqual(log["short_message"], "Identification feedback")
self.assertEqual(log["_bg_image_url"], "test")
Expand Down
2 changes: 1 addition & 1 deletion frontend/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion frontend/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "basegun",
"version": "1.3.5",
"version": "1.4.0",
"private": true,
"scripts": {
"serve": "vite preview",
Expand Down
Binary file added frontend/src/assets/logo_dnum.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added frontend/src/assets/logo_gendarmerie.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added frontend/src/assets/logo_police.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added frontend/src/assets/logo_scae.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
50 changes: 35 additions & 15 deletions frontend/src/components/ResultsComponent.vue
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,16 @@
</div>
<p class="fr-callout__title">Catégorie {{ cleanCategory }}</p>
<p class="fr-callout__text">Type d'arme : {{ cleanLabel }}</p>
<p class="callout-mention" v-html="cleanMention"></p>
</div>
</div>
<div v-if="store.confidence_level != 'low'">
<p class="fr-text--sm warning-msg">Cet avis n'emporte qu'une simple valeur de renseignement. Pour faire référence dans une procédure, il doit impérativement et réglementairement être validé par le biais d'un examen scientifique ou technique prévu par le code de procédure pénale.</p>
<div class="feedback">
<p class="feedback-text">Ce résultat vous semble-t-il correct ?</p>
<label class="feedback-click" @click="sendFeedback(true, $event)">👍</label>
<label class="feedback-click" @click="sendFeedback(false, $event)">👎</label>
</div>
<p class="fr-text--sm warning-msg">Cet avis n'emporte qu'une simple valeur de renseignement. Pour faire référence dans une procédure, il doit impérativement et réglementairement être validé par le biais d'un examen scientifique ou technique prévu par le code de procédure pénale.</p>
</div>
<div class="blank"></div>
<div class="footer-background footer-actions">
Expand All @@ -54,43 +55,53 @@
results: {
revolver: {
displayLabel: "revolver",
category: "B ou D"
category: "B ou D",
mention: "B - Soumise à autorisation<br \>D - Libre d'acquisition et de détention"
},
pistolet_semi_auto_moderne: {
displayLabel: "pistolet semi-automatique moderne",
category: "B"
category: "B",
mention: "Soumise à autorisation"
},
pistolet_a_percussion_silex: {
displayLabel: "pistolet à percussion ou à silex",
category: "D"
displayLabel: "pistolet à mécanisme ancien",
category: "D",
mention: "Libre d'acquisition et de détention"
},
autre_pistolet: {
displayLabel: "pistolet divers",
category: "A, B ou D"
category: "A, B ou D",
mention: "A - Interdite<br \>B - Soumise à autorisation<br \>D - Libre d'acquisition et de détention"
},
epaule_a_percussion_silex: {
displayLabel: "arme d'épaule à percussion ou à silex",
category: "D"
displayLabel: "arme d'épaule à mécanisme ancien",
category: "D",
mention: "Libre d'acquisition et de détention"
},
epaule_a_un_coup: {
displayLabel: "arme d'épaule à un coup par canon",
category: "C"
category: "C",
mention: "Soumise à déclaration"
},
epaule_a_levier_sous_garde: {
displayLabel: "arme d'épaule à levier de sous-garde",
category: "B ou C"
category: "B ou C",
mention: "B - Soumise à autorisation<br \>C - Soumise à déclaration"
},
epaule_a_verrou: {
displayLabel: "arme d'épaule à verrou",
category: "B ou C"
category: "B ou C",
mention: "B - Soumise à autorisation<br \>C - Soumise à déclaration"
},
epaule_a_pompe: {
displayLabel: "arme d'épaule à pompe",
category: "B ou C"
category: "B ou C",
mention: "B - Soumise à autorisation<br \>C - Soumise à déclaration"
},
autre_epaule: {
displayLabel: "arme d'épaule non manuelle",
category: "A, B ou C"
category: "A, B ou C",
mention: "A - Interdite<br \>B - Soumise à autorisation<br \>C - Soumise à déclaration"
}
}
}
Expand All @@ -101,6 +112,9 @@
},
cleanCategory() {
return this.results[`${store.label}`].category
},
cleanMention() {
return this.results[`${store.label}`].mention
}
},
methods: {
Expand Down Expand Up @@ -129,7 +143,6 @@
</script>

<style scoped>
.result {
margin: 0 auto;
max-width: 1000px;
Expand Down Expand Up @@ -172,7 +185,7 @@
margin-left: -4px;
}
.warning-text {
font-size: 12px;
font-size: 0.7rem;
font-style: italic;
line-height: 1rem;
margin-bottom: 12px;
Expand All @@ -184,11 +197,18 @@
.warning-msg {
line-height: 1.3rem!important;
}
.callout-mention {
margin-top: 10px;
font-style: italic;
font-size: 0.9rem;
line-height: 1.3rem;
}
.feedback {
display: flex;
align-items: center;
justify-content: center;
margin: 20px 0;
}
.feedback-text {
Expand Down
1 change: 0 additions & 1 deletion frontend/src/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import router from './router';
import VueDsfr from '@laruiss/vue-dsfr'
import '@laruiss/vue-dsfr/dist/vue-dsfr.css'
import '@laruiss/vue-dsfr/dist/vue-dsfr-fonts.css'

import { registerSW } from 'virtual:pwa-register'


Expand Down
93 changes: 87 additions & 6 deletions frontend/src/views/text_content/AboutTextContent.vue
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,105 @@
<div>
<p class="title-space">Basegun est un projet d'application par apprentissage automatique capable
d'identifier et de classifier de manière fiable et rapide une arme à feu.</p>
<p>Le projet a été initié en 2021 dans le contexte du programme Entrepreneurs d’Intérêt Général,
et est en cours de développement par le Laboratoire de la Donnée du Ministère de l'Intérieur.</p>
<p>Le projet a été initié en 2021 dans le contexte du programme
<a target="_blank" href="https://eig.etalab.gouv.fr/defis/basegun/" >Entrepreneurs d’Intérêt Général</a>.
</p>
<p>
Il continue actuellement sous la collaboration de 4 entités du Ministère de l'Intérieur:
</p>
<div>
<ul v-for="list in lists" :key="list.id" >
<li class="list"> {{ list.item }}</li>
</ul>
</div>
<p>A ce jour, Basegun permet de prendre en photo une arme à feu et d'obtenir un
résultat parmi 10 typologies possibles. Ce résultat donne une indication sur la ou les catégories légales
à laquelle l'arme appartient.</p>
<p class="fr-callout"><span class="fr-fi-alert-fill" aria-hidden="true"></span> Basegun ne prend pas encore en compte l'identification des armes non létales (factices,
à air comprimé, à blanc ou neutralisées).</p>

<div class="container-img">
<div v-for="img in imgs" :key="img.id">
<img class="img" :src="img.src" :alt="img.alt">

</div>
</div>
</div>
</template>

<script>
export default {
name: "AboutTextContent"
};
<script>
import logoDnum from '@/assets/logo_dnum.jpg'
import logoSCAE from'@/assets/logo_scae.png'
import logoPN from'@/assets/logo_police.png'
import logoGendarmerie from'@/assets/logo_gendarmerie.png'
export default {
name: "AboutTextContent",
data () {
return {
lists: [
{
item: "Le Datalab de la Direction du Numérique, pour le pilotage du projet et le développement de l'application ;"
},
{
item: "Le Service Central des Armes et Explosifs, pour un contrôle régulier via la connaissance métier des armes à feu ;"
},
{
item: "La Police et la Gendarmerie, pour des tests et suivis ponctuels de l'application."
}
],
imgs: [
{
alt: "Logo Ministère de l'interieur",
id: 'logo_dnum',
src: logoDnum
},
{
alt: "Logo SCAE",
id: 'logo_scae',
src: logoSCAE,
},
{
alt: "Logo Police Nationale",
id: 'logo_pn',
src: logoPN
},
{
alt: "Logo Gendarmerie",
id: 'logo_gendarmerie',
src: logoGendarmerie
}
]
}
}
}
</script>

<style scoped>
.title-space {
margin-top: 20px;
}
.container-img {
display: flex;
justify-content: center;
flex-direction: row;
flex-wrap: wrap;
align-items: center;
}
.img {
margin: 2em;
width: 6em;
height: auto;
}
.list {
margin-left: 2em;
list-style:square;
}
</style>

0 comments on commit d9ecda9

Please sign in to comment.