views.py 12.2 KB
Newer Older
Sylvain Coulange's avatar
Sylvain Coulange committed
1
from django.shortcuts import render, HttpResponseRedirect
2
from . import textPhonographer as txtphono
3
from .models import Phonograph, Data, Entree, commitData
4
from django.http import JsonResponse
5
from .liaisons import *
6
from .english_spacyExceptions import getOneWordList
7
import json, spacy, subprocess, re
8

9
10
print('Chargement des modèles de langue...')
print('fr_core_news_md...')
11
nlpFr = spacy.load('fr_core_news_md')
Sylvain Coulange's avatar
Sylvain Coulange committed
12
13
14
15
16
17
# print('en_core_web_sm...')
# nlpEn = spacy.load("en_core_web_sm")
# print('zh_core_web_sm...')
# nlpZh = spacy.load("zh_core_web_sm")
# print('OK.')
# logFile = "../logs/dico_frwiktionary-20200301_v2.log"
Sylvain Coulange's avatar
Sylvain Coulange committed
18

19
20
21
22

## RÉCUPÉRATION DE LA LISTE DES EXCEPTIONS POUR L'ANGLAIS
asOneWord = getOneWordList()

Sylvain Coulange's avatar
Sylvain Coulange committed
23
def redirApp(request):
Sylvain Coulange's avatar
Sylvain Coulange committed
24
    return HttpResponseRedirect('/')
Sylvain Coulange's avatar
Sylvain Coulange committed
25

26
27
28
29
30
def main0(request):
    data = Data()
    data.update = updateTime()
    return render(request, 'coloriseur.html', {'data': data, 'pageLang':"fr"})

31
def main(request,pageLang,**mySettings):
32
33
    data = Data()
    data.update = updateTime()
34
    return render(request, 'coloriseur.html', {'data': data, 'pageLang':pageLang})
Sylvain Coulange's avatar
Sylvain Coulange committed
35

36
37
38
39
def colorize(request):
    colis = json.loads(request.body)
    text = colis['inText']
    lang = colis['lang']
Sylvain Coulange's avatar
Sylvain Coulange committed
40
41
42
43
    if lang == "fr":
        nlpText = nlpFr(text)
    elif lang == "en":
        nlpText = nlpEn(text)
Sylvain Coulange's avatar
Sylvain Coulange committed
44
45
    elif lang == "zh":
        nlpText = nlpZh(text)
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
    

    ######### traitement du tiret ############
    if lang == "fr":
        listeMots = []

        for i, mot in enumerate(nlpText):
            # Traiter les mots qui contiennent le '-'.
            # Ex : "-il", "Peut-être"
            if "-" in mot.text and len(mot.text) > 1 :
                temp = ""
                for l in mot.text :
                    if l != "-":
                        temp += l
                    else:
                        if temp == '':
                            listeMots.append("-")
                        else:
                            listeMots.append(temp)
                            listeMots.append("-")
                            temp = ""
                if temp != "":
                    listeMots.append(temp)
            # Traiter uniquement le tiret
            else:
                listeMots.append(mot.text)

        tiret = {} # EX : Vas-y ! Pouvait-il partir ? ==> {'Vas': 1, 'Pouvait': 5}
        for k,item in enumerate(listeMots):
            if item == "-" and k > 0 :
                tiret[listeMots[k-1]] = k
        print(tiret)

        # Remplacer tous les tirets dans le texte par le caractere espace
        if "-" in listeMots:
            text = text.replace('-', ' ')
        
        nlpText = nlpFr(text)
    #########################################
    
86
87
    outText = []

88
89
90
91
92
    # appeler la fonction pour savoir s'il y a une locution
    index = liaison_locution(text, nlpText)
    print("Index", index)

    for j, token in enumerate(nlpText):
93
94
95
96
97
98
99
        sdl = re.findall(r'\r\n',token.text)
        print("sdl =",sdl)
        if len(sdl) > 0:
            for s in sdl:
                print("Saut de ligne.")
                outText.append('§')
        else:
100
101
102
103
104

            thisTokenText = token.text

            # TRAITEMENT CONTRACTIONS ANGLAIS AUTRES gonna cannot gotta
            if lang == "en":
105
                if thisTokenText.lower() in asOneWord.keys() and nlpText[j+1].text.lower() == asOneWord[thisTokenText.lower()]:
106
107
                    print("CONCATÉNATION CONTRACTION ANGLAIS:", thisTokenText, nlpText[j+1].text)
                    thisTokenText = thisTokenText + nlpText[j+1].text
108
                elif thisTokenText.lower() in asOneWord.values() and nlpText[j-1].text.lower() in asOneWord.keys() and asOneWord[nlpText[j-1].text.lower()] == thisTokenText.lower():
109
110
111
112
                    continue # => si on est passé par le if à l'itération suivante, on passe au token suivant directement (ignorer "n't"..etc)


            print("Mot en entrée :",thisTokenText)
Sylvain Coulange's avatar
Sylvain Coulange committed
113
            if lang == "fr" or lang == "en":
114
115
116
117
118
119
120
121
122
123
124
125
                liaison = None

                ## TRAITEMENT LIAISON POUR FR
                if lang == "fr":
                    if j + 1 < len(nlpText):
                        # ici on met la liaison directement s'il s'agit d'une locution avec exception
                        if index != None and (index[0]+index[1]) == j:
                                bigram = (nlpText[j].text, nlpText[j+1].text)
                                liaison = index[2]
                                print("bigram de locution :",bigram)
                        # appel de la fonction obtenirM1M2
                        else:
126
                            bigram = obtenirM1M2(thisTokenText, nlpText[j+1].text)
127
128
129
130
131
132
133
                            print("bigram normal :",bigram)
                            # vérifie les règles de liaisons et denasalisation
                            if bigram != None:
                                print("bigram normal :",token.pos_,nlpText[j+1].pos_)
                                liaison = verifliaison(token, nlpText[j+1])
                                print("type de liaison : ",liaison)

134
                result = txtphono.traitement(thisTokenText,lang,liaison) # LIAISON : ajoute le booléen liaison en argument
Sylvain Coulange's avatar
Sylvain Coulange committed
135
136
137
138
139
140
141
142
143
144
145
146

                phonographieList = []
                for r in result:
                    phonographie = []
                    for i in r[0]:
                        ph = {}
                        ph['phon'] = i[0]
                        ph['graph'] = i[1]
                        phonographie.append(ph)
                    phonographieList.append((phonographie,r[1],r[2],r[3]))
                outText.append(phonographieList)
            
147
148
149
150
                ## SUITE LIAISON ##
                if lang == 'fr':
                    ## Affichage de la liaison hors du mot
                    juge = False
151
                    if len(tiret) > 0 and thisTokenText in tiret.keys() :
152
                        if liaison != None :
153
                            result1 = txtphono.traitement("-͜", lang, thisTokenText+liaison)
154
155
156
157
158
159
                            juge = True
                        elif liaison == None :
                            result1 = txtphono.traitement("-", lang, liaison)
                            juge = True
                    else:
                        if liaison != None:
160
                            result1 = txtphono.traitement("‿", lang, thisTokenText+liaison)
161
162
163
164
165
166
167
168
169
170
171
172
173
                            juge = True
                    if juge == True :
                        phonographieList = []
                        for r in result1:
                            phonographie = []
                            for i in r[0]:
                                ph = {}
                                ph['phon'] = i[0]
                                ph['graph'] = i[1]
                                phonographie.append(ph)
                            phonographieList.append((phonographie, r[1], r[2], r[3]))
                        outText.append(phonographieList)

Sylvain Coulange's avatar
Sylvain Coulange committed
174
            elif lang == "zh":
175
                result = txtphono.traitementzh(thisTokenText)
Sylvain Coulange's avatar
Sylvain Coulange committed
176
177
178
                outText.append(result)
            print("Résultat en sortie :", result)
               
179
180
181
182
183
    rep = {
        'outText': outText
    }
    return JsonResponse(rep)

184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217

def getPhonoOf(request):
    # Renvoie une liste(texte) de listes(phonographiesPossibles) de listes(phonographie) de phonèmes à partir d'un mot ou d'une expression
    # ex. input="chat" → output=[[[phon_s_maj, phon_a], [phon_ts_maj, phon_a, phon_t]]]
    # ex. input="le chat" → output= [
    #   [
    #       [phon_l,phon_2],
    #       [phon_e_maj,phon_l,phon_2]
    #   ],
    #   [
    #       [phon_s_maj, phon_a],
    #       [phon_ts_maj, phon_a, phon_t]
    #   ]
    # ]
     
    colis = json.loads(request.body)
    text = colis['inText']
    lang = colis['lang']
    if lang == "fr":
        nlpText = nlpFr(text)
    elif lang == "en":
        nlpText = nlpEn(text)
    outPhono = []

    for token in nlpText:
        sdl = re.findall(r'\r\n',token.text)
        print("sdl =",sdl)
        if len(sdl) > 0:
            for s in sdl:
                print("Saut de ligne.")
                outText.append('§')
        else:
            print("Mot en entrée :",token.text)
            if lang == "en":
Sylvain Coulange's avatar
Sylvain Coulange committed
218
                result = txtphono.traitement(token.text,lang)
219
            else:
220
                result = txtphono.traitement(token.text,lang,None)
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
            print(result)
        
            phonographieList = []
            for r in result:      
                phonoliste = []
                for i in r[0]:
                    phonoliste.append(i[0])
                    
                phonographieList.append(phonoliste)
            outPhono.append(phonographieList)
    rep = {
        'outText': outPhono
    }
    return JsonResponse(rep)

236
237
def updateTime():
    upd = str(subprocess.check_output(["git", "log", "-1", "--format=%cd", "--date=short"]))
238
    #ver = str(subprocess.check_output(["git", "rev-list", "--all", "--count"]))
Sylvain Coulange's avatar
Sylvain Coulange committed
239
    return 'Version 5.0 (mis à jour le '+upd[2:-3]+')'
Sylvain Coulange's avatar
Sylvain Coulange committed
240

241

Sylvain Coulange's avatar
Sylvain Coulange committed
242
def dicoView(request):
243
    print("Réception requête dicoView().")
244
245
    data = Entree()
    data.update = updateTime()
246
247
248
    data.nbMotsFr = txtphono.getLenDic('fr')
    data.nbMotsEn = txtphono.getLenDic('en')
    data.nbMotsZh = txtphono.getLenDic('zh')
249
250
251
    return render(request, 'editDicoHome.html', {'data': data})

def dicoViewFr(request):
Sylvain Coulange's avatar
Sylvain Coulange committed
252
    data = Entree()
253
    data.update = updateTime()
254
    data.lenDic = txtphono.getLenDic('fr')
255
    data.logStat = txtphono.getLogStat('fr')
256
257
258
259
260
261
    data.dicoLang = "fr"
    return render(request, 'editDico.html', {'data': data})

def dicoViewEn(request):
    data = Entree()
    data.update = updateTime()
262
    data.lenDic = txtphono.getLenDic('en')
263
    data.logStat = txtphono.getLogStat('en')
264
    data.dicoLang = "en"
Sylvain Coulange's avatar
Sylvain Coulange committed
265
266
    return render(request, 'editDico.html', {'data': data})

Sylvain Coulange's avatar
Sylvain Coulange committed
267
268
269
def dicoViewZh(request):
    data = Entree()
    data.update = updateTime()
270
    data.lenDic = txtphono.getLenDic('zh')
Sylvain Coulange's avatar
Sylvain Coulange committed
271
272
273
274
    data.logStat = txtphono.getLogStat('zh')
    data.dicoLang = "zh"
    return render(request, 'editDico.html', {'data': data})

275
def dicoReq(request):
276
    dicoLang = request.GET.get('dicoLang', None)
277
278
279
280
281
    mot = request.GET.get('mot', None)
    trans = request.GET.get('trans', None)
    motCond = request.GET.get('motCond', None)
    transCond = request.GET.get('transCond', None)
    
Sylvain Coulange's avatar
Sylvain Coulange committed
282
    rep = {
283
        "listeEntrees" : txtphono.getEntryByWord(m=mot,mc=motCond,t=trans,tc=transCond,lang=dicoLang)
Sylvain Coulange's avatar
Sylvain Coulange committed
284
285
286
    }
    return JsonResponse(rep)

287
288
289
290
291
292
293
294
295
296
def checkWord(request):
    w = request.GET.get('w', None)
    t = request.GET.get('t', None)
    lang = request.GET.get('lang', None)

    rep = {
        'rep': txtphono.checkIfWordExists(w,t,lang)
    }
    return JsonResponse(rep)

297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
def checkWordList(request):
    colis = json.loads(request.body)
    wordPhonoSpansList = colis['wordPhonoSpansList']
    lang = colis['lang']

    repList = []

    for w in wordPhonoSpansList:
        repList.append(txtphono.checkIfWordExists(w['w'],w['t'],lang))

    rep = {
        'rep': repList
    }
    return JsonResponse(rep)

Sylvain Coulange's avatar
Sylvain Coulange committed
312
313
314
315
316
317
318
def get_client_ip(request):
    x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
    if x_forwarded_for:
        ip = x_forwarded_for.split(',')[0]
    else:
        ip = request.META.get('REMOTE_ADDR')
    return ip
319

Sylvain Coulange's avatar
Sylvain Coulange committed
320
def editEntry(request):
Sylvain Coulange's avatar
Sylvain Coulange committed
321
322
323
324
325
    colis = json.loads(request.body)
    mot = colis['mot']
    lang = colis['lang']
    infos = colis['infos']
    print(infos)
Sylvain Coulange's avatar
Sylvain Coulange committed
326
    ipCli = get_client_ip(request)
Sylvain Coulange's avatar
Sylvain Coulange committed
327
328

    return JsonResponse(txtphono.modifEntry(ipCli,mot,infos,lang))
Sylvain Coulange's avatar
Sylvain Coulange committed
329

330
def newEntry(request):
331
332
    mot = request.GET.get('mot', None)
    trans = request.GET.get('trans', None)
333
    lang = request.GET.get('lang', None)
334
    ipCli = get_client_ip(request)
Sylvain Coulange's avatar
Sylvain Coulange committed
335
336

    return JsonResponse(txtphono.addEntry(ipCli,mot,trans,lang))
337

338
339
def supprEntry(request):
    mot = request.GET.get('mot', None)
340
    lang = request.GET.get('lang', None)
341
    ipCli = get_client_ip(request)
Sylvain Coulange's avatar
Sylvain Coulange committed
342
343

    return JsonResponse(txtphono.delEntry(ipCli,mot,lang))
344

345
def getLog(request):
Sylvain Coulange's avatar
Sylvain Coulange committed
346
347
    lang = request.GET.get('lang', None)
    rep = txtphono.sendMeLogPlease(lang)
348
349
350
351
352
353
354
355
356
357
358
359
    return JsonResponse({"logs":rep})

def addStat(request):
    colis = json.loads(request.body)
    app = colis["app"]
    module = colis["module"]
    ip = get_client_ip(request)
    lang = colis["lang"]

    txtphono.addStat(app, module, ip, lang)

    return JsonResponse({})