views.py 10.5 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
6
from .liaisons import *
import json, spacy, subprocess, re
7

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

def redirApp(request):
Sylvain Coulange's avatar
Sylvain Coulange committed
19
    return HttpResponseRedirect('/')
Sylvain Coulange's avatar
Sylvain Coulange committed
20

21
22
23
24
25
def main0(request):
    data = Data()
    data.update = updateTime()
    return render(request, 'coloriseur.html', {'data': data, 'pageLang':"fr"})

26
def main(request,pageLang,**mySettings):
27
28
    data = Data()
    data.update = updateTime()
29
    return render(request, 'coloriseur.html', {'data': data, 'pageLang':pageLang})
Sylvain Coulange's avatar
Sylvain Coulange committed
30

31
32
33
34
def colorize(request):
    colis = json.loads(request.body)
    text = colis['inText']
    lang = colis['lang']
Sylvain Coulange's avatar
Sylvain Coulange committed
35
36
37
38
    if lang == "fr":
        nlpText = nlpFr(text)
    elif lang == "en":
        nlpText = nlpEn(text)
Sylvain Coulange's avatar
Sylvain Coulange committed
39
40
    elif lang == "zh":
        nlpText = nlpZh(text)
41
42
43
44
45
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
    

    ######### 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)
    #########################################
    
81
82
    outText = []

83
84
85
86
87
    # 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):
88
89
90
91
92
93
94
95
        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)
Sylvain Coulange's avatar
Sylvain Coulange committed
96
            if lang == "fr" or lang == "en":
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
                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:
                            bigram = obtenirM1M2(token.text, nlpText[j+1].text)
                            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)

                result = txtphono.traitement(token.text,lang,liaison) # LIAISON : ajoute le booléen liaison en argument
Sylvain Coulange's avatar
Sylvain Coulange committed
118
119
120
121
122
123
124
125
126
127
128
129

                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)
            
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
                ## SUITE LIAISON ##
                if lang == 'fr':
                    ## Affichage de la liaison hors du mot
                    juge = False
                    if len(tiret) > 0 and token.text in tiret.keys() :
                        if liaison != None :
                            result1 = txtphono.traitement("-͜", lang, token.text+liaison)
                            juge = True
                        elif liaison == None :
                            result1 = txtphono.traitement("-", lang, liaison)
                            juge = True
                    else:
                        if liaison != None:
                            result1 = txtphono.traitement("‿", lang, token.text+liaison)
                            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
157
158
159
160
161
            elif lang == "zh":
                result = txtphono.traitementzh(token.text)
                outText.append(result)
            print("Résultat en sortie :", result)
               
162
163
164
165
166
    rep = {
        'outText': outText
    }
    return JsonResponse(rep)

167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200

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
201
                result = txtphono.traitement(token.text,lang)
202
            else:
Sylvain Coulange's avatar
Sylvain Coulange committed
203
                result = txtphono.traitement(token.text,lang)
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
            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)

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

224

Sylvain Coulange's avatar
Sylvain Coulange committed
225
def dicoView(request):
226
    print("Réception requête dicoView().")
227
228
    data = Entree()
    data.update = updateTime()
229
230
231
    data.nbMotsFr = txtphono.getLenDic('fr')
    data.nbMotsEn = txtphono.getLenDic('en')
    data.nbMotsZh = txtphono.getLenDic('zh')
232
233
234
    return render(request, 'editDicoHome.html', {'data': data})

def dicoViewFr(request):
Sylvain Coulange's avatar
Sylvain Coulange committed
235
    data = Entree()
236
    data.update = updateTime()
237
    data.lenDic = txtphono.getLenDic('fr')
238
    data.logStat = txtphono.getLogStat('fr')
239
240
241
242
243
244
    data.dicoLang = "fr"
    return render(request, 'editDico.html', {'data': data})

def dicoViewEn(request):
    data = Entree()
    data.update = updateTime()
245
    data.lenDic = txtphono.getLenDic('en')
246
    data.logStat = txtphono.getLogStat('en')
247
    data.dicoLang = "en"
Sylvain Coulange's avatar
Sylvain Coulange committed
248
249
    return render(request, 'editDico.html', {'data': data})

Sylvain Coulange's avatar
Sylvain Coulange committed
250
251
252
def dicoViewZh(request):
    data = Entree()
    data.update = updateTime()
253
    data.lenDic = txtphono.getLenDic('zh')
Sylvain Coulange's avatar
Sylvain Coulange committed
254
255
256
257
    data.logStat = txtphono.getLogStat('zh')
    data.dicoLang = "zh"
    return render(request, 'editDico.html', {'data': data})

258
def dicoReq(request):
259
    dicoLang = request.GET.get('dicoLang', None)
260
261
262
263
264
    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
265
    rep = {
266
        "listeEntrees" : txtphono.getEntryByWord(m=mot,mc=motCond,t=trans,tc=transCond,lang=dicoLang)
Sylvain Coulange's avatar
Sylvain Coulange committed
267
268
269
270
271
272
273
274
275
276
    }
    return JsonResponse(rep)

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
277

Sylvain Coulange's avatar
Sylvain Coulange committed
278
def editEntry(request):
Sylvain Coulange's avatar
Sylvain Coulange committed
279
280
281
282
283
    colis = json.loads(request.body)
    mot = colis['mot']
    lang = colis['lang']
    infos = colis['infos']
    print(infos)
Sylvain Coulange's avatar
Sylvain Coulange committed
284
    ipCli = get_client_ip(request)
Sylvain Coulange's avatar
Sylvain Coulange committed
285
286

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

288
def newEntry(request):
289
290
    mot = request.GET.get('mot', None)
    trans = request.GET.get('trans', None)
291
    lang = request.GET.get('lang', None)
292
    ipCli = get_client_ip(request)
Sylvain Coulange's avatar
Sylvain Coulange committed
293
294

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

296
297
def supprEntry(request):
    mot = request.GET.get('mot', None)
298
    lang = request.GET.get('lang', None)
299
    ipCli = get_client_ip(request)
Sylvain Coulange's avatar
Sylvain Coulange committed
300
301

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

303
def getLog(request):
Sylvain Coulange's avatar
Sylvain Coulange committed
304
305
306
    lang = request.GET.get('lang', None)
    rep = txtphono.sendMeLogPlease(lang)
    return JsonResponse({"logs":rep})