universalsoftware/uchat
2
1import bot.uchat2from django.shortcuts import render3from .models import Language, Query, ParamModelForm, Param4from bot.forms import RenewBotForm, EditorForm, EditorListForm, ParamForm, ImportForm5from django.shortcuts import get_object_or_4046from django.http import HttpResponseRedirect7from django.urls import reverse8import datetime9from django.db import transaction10from openai import OpenAI11from django.contrib.auth.decorators import login_required, permission_required12import json13 14#bot.uchat.chroma_client.allow_reset = True15 16class chat(object): 17 ns = cs = "s0"18 reply = ctx = ""19 messages = context = []20 ctx_flag = True21 previous = ""22 oc = bot.uchat.oc23 def get_reply(self,jezik,query,max_results,flag):24 msg = query # + "Objasnite na " + jezik + ", "25 query_results = bot.uchat.collection.query(26 query_texts = [ msg ],27 n_results = max_results,28 where = { "$and": [ {"$and": [ { "$or": [ {"state": self.cs }, { "page": { "$nin": [ -1 ] } } ] } , { "used": False } ] } ,29 {"lang": jezik } ] },30 )31 if bot.uchat.DEBUG: print("Query results:\n", query_results, "jezik:", jezik)32 ln = len(query_results["documents"][0])33 if ln == 0:34 if bot.uchat.DEBUG: print("Odaberite drugi jezik")35 bot.uchat.collection.update(36 ids=[f"id{id}" for id in range(bot.uchat.collection.count())],37 metadatas=[{"used": False} for i in range(bot.uchat.collection.count())],38 )39 if len(self.messages)>0: self.messages = self.messages[0]40 new = reply = "Kako Vam još mogu pomoći?"41 self.ctx_flag = True42 self.ns = self.cs = "s0"43 return new44 else:45 context = []46 i_state = l_state = -147 for n in range(ln):48 if query_results["distances"][0][n] < (0.05+(bot.uchat.max_distance+bot.uchat.min_distance)/2):49 context += [ query_results["documents"][0][n] ]50 if i_state<0:51 l_state += 152 if query_results["metadatas"][0][n]['state'] != 'None':53 i_state = n54 else:55 if (query_results["metadatas"][0][n]['state'] != 'None') and (i_state<0):56 i_state = n57 if l_state<0:58 l_state = i_state = 059 ctx = query_results["documents"][0][0] 60 if self.cs != 'None':61 for n in range(1,len(context)): ctx += ", " + context[n]62 else:63 ctx = context[l_state]64 for n in range(len(context)):65 if l_state != n:66 ctx += ", " + context[n]67 ctx += "."68 match jezik:69 case 'hrvatski':70 o_jezik = 'hrvatskom'71 case 'slovenački':72 o_jezik = 'slovenačkom'73 case 'srpski':74 o_jezik = 'srpskom'75 case 'makedonski':76 o_jezik = 'makedonskom'77 if query_results["documents"][0][i_state]=="###":78 self.ctx_flag = False79 new = reply = "Kako Vam još mogu pomoći?"80 if bot.uchat.DEBUG: print("!!!###!!!")81 return "Ne razumem, ili je u pitanju greška."82 else:83 if ((query_results["distances"][0][i_state] > bot.uchat.max_distance)) and (self.cs == 'None'):84 self.ctx_flag = False85 if bot.uchat.DEBUG: print("Malo je nejasno šta je problem..")86 bot.uchat.collection.update(87 ids=[f"id{id}" for id in range(bot.uchat.collection.count())],88 metadatas=[{"used": False} for i in range(bot.uchat.collection.count())],89 )90 if len(messages)>0: messsages = messages[0]91 reply = "Malo je nejasno šta je problem - kako Vam još mogu pomoći?"92 self.ns = self.cs = "s0"93 return reply94 elif (query_results["distances"][0][i_state] < bot.uchat.min_distance):95 if self.cs != "None":96 self.ctx_flag = False97 else:98 self.ctx_flag = True99 new = reply=query_results["documents"][0][i_state]100 else:101 self.ctx_flag = True102 # reply=query_results["documents"][0][i_state]103 if (len(msg) < bot.uchat.min_len/4) or flag: self.ctx_flag = False104 id = query_results["ids"][0]105 meta = query_results["metadatas"][0]106 # ovo treba usloviti potrebnom input var ako treba107 if (meta[i_state]["state"] not in ['','s99']): meta[0]["used"] = True108 bot.uchat.collection.update( ids=id, metadatas=meta)109 self.ns = query_results["metadatas"][0][i_state]["next"]110 if self.messages==[]:111 self.messages = [ {"role": "system", "content": bot.uchat.system[jezik]} ]112 new_message = {"role": "user", "content": f"{msg} " + bot.uchat.msg_content[jezik] + " " + ctx + ". "}113 else:114 if self.ctx_flag:115 new_message = {"role": "user", "content": f"{msg}. " + bot.uchat.msg_content[jezik] + " " + ctx + ". "}116 else:117 new_message = {"role": "user", "content": f"{msg}."}118 self.messages.append(new_message)119 print("messages=", self.messages)120 if query_results["distances"][0][i_state] > bot.uchat.min_distance:121 completion = bot.uchat.oc.chat.completions.create(122 model = bot.uchat.model_id,123 messages=self.messages,124 temperature=bot.uchat.temperature,125 max_tokens=bot.uchat.max_tokens,126 top_p=bot.uchat.top_p,127 frequency_penalty=bot.uchat.frequency_penalty,128 presence_penalty=bot.uchat.presence_penalty,129 stop=["###","<|","|im_end|","|im_start|"],130 # do_sample=True,131 )132 if bot.uchat.DEBUG: print('msg=' + new_message['content'] + "\nMessages:\n", self.messages, flush=True)133 new_message = {"role": "assistant", "content": ""}134 new=completion.choices[0].message.content135 if new==self.previous:136 if bot.uchat.DEBUG: print("Same!!!")137 bot.uchat.collection.update(138 ids=[f"id{id}" for id in range(bot.uchat.collection.count())],139 metadatas=[{"used": False} for i in range(bot.uchat.collection.count())],140 )141 new_message["content"] = new = self.previous = reply = "Kako Vam još mogu pomoći?"142 self.ns = self.cs = "s0"143 self.messages = self.messages[0]144 else:145 new_message["content"] += completion.choices[0].message.content146 self.previous = new_message["content"]147 if bot.uchat.DEBUG: print(new, end="", flush=True)148 else:149 new_message = {"role": "assistant", "content": ""}150 new_message["content"] = reply151 new = reply152 self.messages.append(new_message)153 # Prevođenje na druge jezike:154 #match o_jezik:155 # case 'srpskom':156 # pass157 # case _ :158 # new_message = {"role": "user", "content": f"Napiši to na {o_jezik} jeziku."}159 # self.messages.append(new_message)160 # completion = bot.uchat.oc.chat.completions.create(161 # model = bot.uchat.model_id,162 # messages=self.messages,163 # temperature=bot.uchat.temperature,164 # max_tokens=bot.uchat.max_tokens,165 # top_p=bot.uchat.top_p,166 # frequency_penalty=bot.uchat.frequency_penalty,167 # presence_penalty=bot.uchat.presence_penalty,168 # stop=None,169 # # do_sample=True,170 # )171 # new=completion.choices[0].message.content172 # new_message = {"role": "user", "content": new}173 # self.messages.append(new_message)174 if (self.ns!='None'):175 if (self.ns != self.cs): self.cs=self.ns 176 if self.cs=='None': self.cs='s0' ; self.ctx_flag = False177 return new178 179def selected(jez,str):180 if jez==str:181 return 'selected'182 else:183 return ' '184 185def index(request):186 #num_books = Book.objects.all().count()187 # Number of visits to this view, as counted in the session variable.188 chat_inst = chat()189 request.session.set_expiry(300)190 jezik = request.session.get('jezik', 'srpski')191 num_visits = request.session.get('num_visits', 1)192 if num_visits == 0:193 if bot.uchat.DEBUG: print("Debug: ")194 request.session['num_visits'] = num_visits+1195 reply = request.session.get("replies", "Zdravo, kako Vam mogu pomoći?")196 if request.method == 'POST':197 # Create a form instance and populate it with data from the request (binding):198 form = RenewBotForm(request.POST)199 if form.is_valid():200 request.session['query'] = query = form.cleaned_data['query']201 jezik = form.cleaned_data['jezik']202 request.session['jezik'] = jezik203 nr = bot.uchat.max_results if num_visits < bot.uchat.max_results else 1+(num_visits % 2)204 #iif len(chat_inst.messages)>0:205 # request.session['messages'] = chat_inst.messages if num_visits % 2 == 1 else chat_inst.messages[0:0]206 chat_inst.messages = request.session.get('messages',[])207 chat_inst.cs = request.session.get('cs','s0')208 chat_inst.ns = request.session.get('ns','s0')209 if bot.uchat.max_conv < len(chat_inst.messages):210 new_reply = chat_inst.get_reply(jezik, query, nr, True)211 else:212 new_reply = chat_inst.get_reply(jezik, query, nr, False)213 request.session['messages'] = chat_inst.messages214 request.session['ns'] = chat_inst.ns215 request.session['cs'] = chat_inst.cs216 request.session['replies'] = reply + "\nKorisnik: " + query + "\n\nOdgovor: " + new_reply + "\n"217# q = QueryForm(request.POST)218 return HttpResponseRedirect(reverse("index"))219 else:220 if bot.uchat.DEBUG: print("Invalid form!", form.errors)221 else:222 form = RenewBotForm(initial={'query': 'Neki upit:'})223 query = request.session.get('query','...')224 jezik = request.session.get('jezik','srpski')225 #if len(chat_inst.messages)>0:226 # request.session['messages'] = chat_inat.messages227 #else:228 # request.session['messages'] = []229 return render(230 request,231 'index.html',232 context={233 'num_visits': num_visits,234 'reply': reply,235 'selected_hr': selected(jezik,'hrvatski'),236 'selected_sl': selected(jezik,'slovenački'),237 'selected_sr': selected(jezik,'srpski'),238 'selected_mk': selected(jezik,'makedonski'),239 }240 )241 242def reset(request):243 chat().messages = request.session.get('messages',[])244 chat().cs = "s0"245 chat().ns = "s0"246 chat().oc.close()247 bot.uchat.oc = oc = OpenAI(base_url="http://localhost:4891/v1", api_key="not-needed")248 ids = bot.uchat.collection.get()['ids']249 for id in ids: bot.uchat.collection.update(ids=[id], metadatas=[{'used': False}])250 jezik = request.session.get('jezik','srpski')251 request.session.flush()252 request.session['num_visits'] = 0253 return render(254 request,255 'index.html',256 context = {'num_visits': 0,257 'reply': 'Kako Vam mogu još pomoći?',258 'selected_hr': selected(jezik,'hrvatski'),259 'selected_sl': selected(jezik,'slovenački'),260 'selected_sr': selected(jezik,'srpski'),261 'selected_mk': selected(jezik,'makedonski'),262 }263 )264 265def editor(request):266 #pagesize = 10267 if request.method == "POST":268 form = EditorListForm(request.POST)269 form.is_valid()270 try:271 request.session['id'] = f_id = form.cleaned_data['f_id']272 except:273 request.session['id'] = f_id = ""274 try:275 request.session['state'] = f_state = form.cleaned_data['f_state']276 except:277 request.session['state'] = f_state = ""278 try:279 request.session['next'] = f_next = form.cleaned_data['f_next']280 except:281 request.session['next'] = f_next = ""282 try:283 request.session['page'] = f_page = form.cleaned_data['f_page']284 except:285 request.session['page'] = f_page = ""286 try:287 request.session['jezik'] = f_jezik = form.cleaned_data['f_jezik']288 except:289 request.session['jezik'] = f_jezik = ""290 try:291 request.session['docu'] = f_docu = form.cleaned_data['f_docu']292 except:293 request.session['docu'] = f_docu = ""294 return HttpResponseRedirect(reverse('bot'))295 else:296 f_jezik = jezik = request.session.get('jezik','')297 f_state = request.session.get('state','')298 f_next = request.session.get('next','')299 f_page = request.session.get('page','')300 f_docu = request.session.get('docu','')301 f_id = request.session.get('id','')302 meta = {}303 if f_state != "":304 meta = {"state": f_state}305 if f_next != "":306 if meta == {}:307 meta = {"next": f_next}308 else:309 meta = { "$and": [ meta, {"next": f_next} ] }310 if f_page !="":311 if meta == {}:312 meta = {"page": f_page}313 else:314 meta = { "$and": [ meta , {"page": f_page} ] }315 if f_jezik != "":316 if meta == {}:317 meta = {"lang": f_jezik}318 else:319 meta = { "$and": [ meta, {"lang": f_jezik} ] }320 if f_id == "":321 if f_docu =="":322 ids = bot.uchat.collection.get(where=meta)['ids']323 documents = bot.uchat.collection.get(where=meta)['documents']324 states = bot.uchat.collection.get(where=meta)['metadatas']325 else:326 ids = bot.uchat.collection.get(where=meta, where_document={"$contains": f_docu })['ids']327 documents = bot.uchat.collection.get(where=meta, where_document={"$contains": f_docu })['documents']328 states = bot.uchat.collection.get(where=meta, where_document={"$contains": f_docu })['metadatas']329 else:330 if f_docu == "":331 ids = bot.uchat.collection.get(ids=[f'id{f_id}'], where=meta)['ids']332 documents = bot.uchat.collection.get(ids=[f'id{f_id}'], where=meta)['documents']333 states = bot.uchat.collection.get(ids=[f'id{f_id}'], where=meta)['metadatas']334 else:335 ids = bot.uchat.collection.get(ids=[f'id{f_id}'], where=meta, where_document={"$contains": f_docu })['ids']336 documents = bot.uchat.collection.get(ids=[f'id{f_id}'], where=meta, where_document={"$contains": f_docu })['documents']337 states = bot.uchat.collection.get(ids=[f'id{f_id}'], where=meta, where_document={"$contains": f_docu })['metadatas']338 cnt = 0339 nr = len(documents)340 id_docs = []341 for doc in documents:342 try:343 lang = states[cnt]['lang']344 except:345 lang = "srpski"346 id_docs += [ [ids[cnt], states[cnt]['state'], states[cnt]['next'], states[cnt]['page'], lang, doc] ]347 cnt += 1348 id_docs.sort(key=lambda k: eval(k[0][2:]))349 return render(350 request,351 'index_editor.html',352 context = {'last': bot.uchat.last, 'nr': nr,353 'id_docs': id_docs,354 'documents': documents,355 'id': "",356 'selected_hr': selected(jezik,'hrvatski'),357 'selected_sl': selected(jezik,'slovenački'),358 'selected_sr': selected(jezik,'srpski'),359 'selected_mk': selected(jezik,'makedonski'),360 'f_id': f_id,361 'f_state': f_state,362 'f_next': f_next,363 'f_page': f_page,364 'f_docu': f_docu,365 'f_jezik': f_jezik,366 }367 )368 369def get_id(coll):370 for i in range(coll.count()):371 id = coll.get(ids=f'id{i}')['ids']372 if id==[]:373 return i374 return coll.count()375 376def editor_id(request, pk, pk2):377 last = bot.uchat.last378 state = next = uris = ""379 used = False380 page = -1381 if request.method == "POST":382 form = EditorForm(request.POST)383 if form.is_valid():384 id = form.cleaned_data['id'][2:]385 state = form.cleaned_data['state']386 next = form.cleaned_data['next']387 used = json.loads(form.cleaned_data['used'].lower())388 page = form.cleaned_data['page']389 docu = form.cleaned_data['docu']390 source = form.cleaned_data['source']391 jezik = form.cleaned_data['jezik']392 #request.session['jezik'] = jezik393 meta = {'state': state, 'next': next, 'used': used, 'page': page, 'source': source, 'lang': jezik}394 try:395 if pk2==0:396 bot.uchat.collection.update(397 ids = f'id{pk}',398 metadatas = meta,399 documents = docu400 )401 return HttpResponseRedirect(reverse('bot')+f'{pk}/0')402 elif pk2==1:403 if bot.uchat.last>1:404 new = get_id(bot.uchat.collection)405 bot.uchat.collection.add(406 ids = f'id{new}',407 metadatas = meta,408 documents = docu409 )410 bot.uchat.last += 1411 return HttpResponseRedirect(reverse('bot')+f'{new}/0')412 elif pk2==2:413 bot.uchat.collection.delete(ids = f'id{pk}')414 bot.uchat.last -= 1415 return HttpResponseRedirect(reverse('bot'))416 except:417 if bot.uchat.DEBUG: print("Errors:", form.errors)418 return HttpResponseRedirect(reverse('bot'))419 else:420 if bot.uchat.DEBUG: print("Invalid form!", form.errors)421 return HttpResponseRedirect(reverse('bot')+f'{pk}/0')422 else:423 if last>0:424 doc = bot.uchat.collection.get(ids=[f'id{pk}'])425 state = doc['metadatas'][0]['state']426 next = doc['metadatas'][0]['next']427 used = doc['metadatas'][0]['used']428 page = doc['metadatas'][0]['page']429 docu = doc['documents'][0]430 source = doc['metadatas'][0]['source']431 try:432 jezik = doc['metadatas'][0]['lang']433 except:434 jezik = request.session.get('jezik','srpski')435 return render(436 request,437 'index_editor.html',438 context = {'last': bot.uchat.last, 'nr': "",439 'state': state,440 'next': next,441 'used': used,442 'page': page,443 'docu': docu,444 'source': source,445 'id': pk,446 'selected_hr': selected(jezik,'hrvatski'),447 'selected_sl': selected(jezik,'slovenački'),448 'selected_sr': selected(jezik,'srpski'),449 'selected_mk': selected(jezik,'makedonski'),450 }451 )452 453def params_refresh(request):454 if request.method == "POST":455 form = ParamForm(request.POST)456 form.is_valid()457 request.session["jezik"] = form.cleaned_data['jezik']458 return HttpResponseRedirect(reverse('params'))459 else:460 return HttpResponseRedirect(reverse('params'))461 462def params(request):463 if request.method == "POST":464 form = ParamForm(request.POST)465 jezici = []466 edit_all = Param.objects.all()467 for edit in edit_all: jezici += [edit.jezik]468 mform = ParamModelForm(request.POST)469 try:470 form.is_valid()471 request.session["jezik"] = form.cleaned_data['jezik']472 jezik = request.session["jezik"]473 bot.uchat.ctxpre = form.cleaned_data['ctxpre']474 except:475 bot.uchat.ctxpre = ""476 try:477 bot.uchat.msg_content[jezik] = form.cleaned_data['msg_content']478 except:479 bot.uchat.msg_content[jezik] = ""480 try:481 bot.uchat.system[jezik] = form.cleaned_data['system']482 bot.uchat.min_len = form.cleaned_data['min_len']483 bot.uchat.CHUNK_SIZE = form.cleaned_data['CHUNK_SIZE']484 bot.uchat.CHUNK_OVERLAP = form.cleaned_data['CHUNK_OVERLAP']485 bot.uchat.max_results = form.cleaned_data['max_results']486 bot.uchat.EMBED_MODEL = form.cleaned_data['EMBED_MODEL']487 bot.uchat.model_id = form.cleaned_data['model_id']488 bot.uchat.max_conv = form.cleaned_data['max_conv']489 bot.uchat.min_distance = form.cleaned_data['min_distance']490 bot.uchat.max_distance = form.cleaned_data['max_distance']491 bot.uchat.temperature = form.cleaned_data['temperature']492 bot.uchat.max_tokens = form.cleaned_data['max_tokens']493 bot.uchat.top_p = form.cleaned_data['top_p']494 bot.uchat.frequency_penalty = form.cleaned_data['frequency_penalty']495 bot.uchat.presence_penalty = form.cleaned_data['presence_penalty']496 bot.uchat.DEBUG = json.loads(form.cleaned_data['DEBUG'].lower())497 except:498 if bot.uchat.DEBUG: print("Errors:", form.errors)499 if jezik in jezici:500 for edit in edit_all:501 if edit.jezik == jezik:502 edit.system = bot.uchat.system[jezik]503 edit.min_len = bot.uchat.min_len504 edit.CHUNK_SIZE = bot.uchat.CHUNK_SIZE505 edit.CHUNK_OVERLAP = bot.uchat.CHUNK_OVERLAP506 edit.max_results = bot.uchat.max_results507 edit.EMBED_MODEL = bot.uchat.EMBED_MODEL508 edit.model_id = bot.uchat.model_id509 edit.max_conv = bot.uchat.max_conv510 edit.min_distance = bot.uchat.min_distance511 edit.max_distance = bot.uchat.max_distance512 edit.temperature = bot.uchat.temperature513 edit.max_tokens = bot.uchat.max_tokens514 edit.top_p = bot.uchat.top_p515 edit.frequency_penalty = bot.uchat.frequency_penalty516 edit.presence_penalty = bot.uchat.presence_penalty517 edit.DEBUG = bot.uchat.DEBUG518 edit.jezik = jezik519 edit.msg_content = bot.uchat.msg_content[jezik]520 edit.ctxpre = bot.uchat.ctxpre521 edit.save()522 else:523 mform.save()524 return HttpResponseRedirect(reverse('params'))525 else:526 jezik = request.session.get('jezik','srpski')527 if jezik == '': jezik='srpski'528 edit_all = Param.objects.all()529 for edit in edit_all:530 if edit.jezik == jezik:531 bot.uchat.system[jezik] = edit.system532 bot.uchat.ctxpre = edit.ctxpre533 bot.uchat.msg_content[jezik] = edit.msg_content534 bot.uchat.min_len = edit.min_len535 bot.uchat.CHUNK_SIZE = edit.CHUNK_SIZE536 bot.uchat.CHUNK_OVERLAP = edit.CHUNK_OVERLAP537 bot.uchat.max_results = edit.max_results538 bot.uchat.EMBED_MODEL = edit.EMBED_MODEL539 bot.uchat.model_id = edit.model_id540 bot.uchat.min_distance = edit.min_distance541 bot.uchat.max_distance = edit.max_distance542 bot.uchat.max_conv = edit.max_conv543 bot.uchat.temperature = edit.temperature544 bot.uchat.top_p = edit.top_p545 bot.uchat.max_tokens = edit.max_tokens546 bot.uchat.presence_penalty = edit.presence_penalty547 bot.uchat.frequency_penalty = edit.frequency_penalty548 bot.uchat.DEBUG = edit.DEBUG549 return render(550 request,551 'index_params.html',552 context = {'system': bot.uchat.system[jezik],553 'ctrpre': bot.uchat.ctxpre,554 'msg_content': bot.uchat.msg_content[jezik],555 'min_len': bot.uchat.min_len,556 'CHUNK_SIZE': bot.uchat.CHUNK_SIZE,557 'CHUNK_OVERLAP': bot.uchat.CHUNK_OVERLAP,558 'max_results': bot.uchat.max_results,559 'EMBED_MODEL': bot.uchat.EMBED_MODEL, # "all-MiniLM-L6-v2",560 'model_id': bot.uchat.model_id, # model_id = "Yugo60-GPT-GGUF.Q4_K_M.gguf"561 'max_conv': bot.uchat.max_conv,562 'min_distance': bot.uchat.min_distance,563 'max_distance': bot.uchat.max_distance,564 'temperature': bot.uchat.temperature,565 'max_tokens': bot.uchat.max_tokens,566 'top_p': bot.uchat.top_p,567 'frequency_penalty': bot.uchat.frequency_penalty,568 'presence_penalty': bot.uchat.presence_penalty,569 'DEBUG': bot.uchat.DEBUG,570 'selected_hr': selected(jezik,'hrvatski'),571 'selected_sl': selected(jezik,'slovenački'),572 'selected_sr': selected(jezik,'srpski'),573 'selected_mk': selected(jezik,'makedonski'),574 }575 )576 577def importPdf(request):578 if request.method == "POST":579 form = ImportForm(request.POST)580 if form.is_valid():581 path = form.cleaned_data['path']582 jezik = form.cleaned_data['jezik']583 request.session['jezik'] = jezik584 request.session['path'] = path585 l_last = bot.uchat.last586 try:587 bot.uchat.load_docs(path, jezik)588 l_last = bot.uchat.last - l_last589 request.session['answer'] = f"Importovano {l_last} delova PDF dokumenta."590 except:591 if bot.uchat.DEBUG: print("Došlo je do problema sa importom PDF fajla.")592 request.session['answer'] = "Došlo je do problema sa importom PDF fajla."593 return HttpResponseRedirect(reverse('importpdf'))594 else:595 jezik = request.session.get('jezik','srpski')596 path = request.session.get('path','/Users/profile/...')597 answer = request.session.get('answer','')598 return render(599 request,600 'index_import.html',601 context = {'path': path,602 'answer': answer,603 'selected_hr': selected(jezik,'hrvatski'),604 'selected_sl': selected(jezik,'slovenački'),605 'selected_sr': selected(jezik,'srpski'),606 'selected_mk': selected(jezik,'makedonski'),607 }608 )609 610from django.views import generic611 612class BotView(generic.ListView):613 """View for a bot chat."""614 if bot.uchat.DEBUG: print ("Test!")615 model = Language 616 paginate_by = 5617 last = bot.uchat.last618 619class BotViewDetail(generic.DetailView):620 model = Language621 622##@login_required623##@permission_required('catalog.can_mark_returned', raise_exception=True)624 625 