Commit 6df6f35d92dcc69a3e9cb3a13929ce0cd8ffe7e7

Authored by Tomasz Bartosiak
1 parent 03d41d9a

semantics/management/commands/POL_role.py

semantics/saving.py
... ... @@ -15,11 +15,13 @@ def modify_frames(lemma_id, operations, user):
15 15 make_operations(operations)
16 16  
17 17 def make_operations(operations):
18   - translation = {'frame_id': {}, 'complement_id': {}, 'preference_id': {}}
  18 + translation = {'unit_id': {}, 'frame_id': {}, 'complement_id': {}, 'preference_id': {}}
19 19 for operation in operations:
20 20 if operation['operation'] == "create_frame":
21 21 luids = [int(m['id']) for m in operation['meanings']]
22 22 translation['frame_id'][int(operation['id'])] = create_frame(luids)
  23 + elif operation['operation'] == "add_unit":
  24 + translation['unit_id'][int(operation['unit']['id'])] = add_unit(operation['unit'])
23 25 elif operation['operation'] == "remove_frame":
24 26 if int(operation['id']) in translation['frame_id']:
25 27 frame_id = translation['frame_id'][int(operation['id'])]
... ... @@ -91,7 +93,7 @@ def make_operations(operations):
91 93 frame_id = translation['frame_id'][int(operation['frame_id'])]
92 94 else:
93 95 frame_id = int(operation['frame_id'])
94   - luids = [int(m) for m in operation['units']]
  96 + luids = [translation['unit_id'][int(m)] if int(m) in translation['unit_id'] else int(m) for m in operation['units']]
95 97 change_units(frame_id, luids)
96 98 elif operation['operation'] == "set_opinion":
97 99 if int(operation['frame_id']) in translation['frame_id']:
... ...
semantics/static/js/semantics_lexical_units.js
... ... @@ -166,6 +166,9 @@ function getMeaningsSelectionForFrame(frame_id) {
166 166 var display = "";
167 167 var id = "" + frame_id;
168 168  
  169 +
  170 + // podstawowe znaczenia
  171 + display += "<div>";
169 172 var i;
170 173 for (i = 0; i < lexical_units.length; i++) {
171 174 display += "<input type = \"checkbox\" name = \"meaning\" value = \"" + lexical_units[i].id + "\""
... ... @@ -182,10 +185,118 @@ function getMeaningsSelectionForFrame(frame_id) {
182 185 }
183 186 display += ">" + lexical_units[i].base + "-" + lexical_units[i].sense + "<br><div id=\"glossa_" + lexical_units[i].id + "\">" + lexical_units[i].glossa + "</div>"
184 187 }
  188 + display += "</div>";
  189 +
  190 + // znaczenia wielowyrazowe
  191 +
  192 + var lexicalisation = [];
  193 +
  194 + display += "<br/>";
  195 +
  196 + display += "<div>";
  197 +
  198 + var i;
  199 + var roles = frame_content[frame_id].display.roles;
  200 + for (i = 0; i < roles.length; i++) {
  201 + if (isPOL(frame_id, i)) {
  202 + var j;
  203 + for (j = 0; j < connected[roles[i].csv_class].length; j++) {
  204 + var options = [];
  205 + var sch = connected[roles[i].csv_class][j].split("pos")[0];
  206 + var pos = connected[roles[i].csv_class][j].split("arg")[0];
  207 + var k;
  208 + for (k = 0; k < schemas_content[sch].display.arguments[0].length; k++) {
  209 + if (schemas_content[sch].display.arguments[0][k].csv_class == pos) {
  210 + var l;
  211 + for (l = 0; l < schemas_content[sch].display.arguments[0][k].lex.length; l++) {
  212 + options.push(schemas_content[sch].display.arguments[0][k].lex[l]);
  213 + }
  214 + }
  215 + }
  216 + var temp; // TODO: temporal solution for multiple schemata
  217 + if (hasRefl(sch)) {
  218 + temp = [['siฤ™'], options]
  219 + } else {
  220 + temp = [options];
  221 + }
  222 + lexicalisation.push(temp);
  223 + }
  224 + }
  225 + }
  226 +
  227 + display += getFormForLexicalisation(lexicalisation);
  228 +
  229 + display += "</div>";
  230 +
  231 + return display;
  232 +}
  233 +
  234 +function getFormForLexicalisation(lexicalisation) {
  235 + var result = "";
  236 + var perms = permutations(lexicalisation);
  237 + var i;
  238 + for (i = 0; i < perms.length; i++) {
  239 + result += lexicalisationForm(cartesian(perms[i]));
  240 + }
  241 + return result;
  242 +}
  243 +
  244 +function permutations(llist) {
  245 + return llist;
  246 +/* if (list.length == 0) {
  247 + return [[]];
  248 + }
  249 + var i;
  250 + var result = [];
  251 + for (i = 0; i < list.length; i++) {
  252 + var shortlist = list.slice();
  253 + shortlist.splice(i, 1);
  254 + var perms = permutations(shortlist);
  255 + var j;
  256 + for (j = 0; j < perms.length; j++) {
  257 + var tmp = perms[j];
  258 + tmp.push(list[i]);
  259 + result.push(tmp);
  260 + }
  261 + }
  262 + return result;
  263 +*/
  264 +}
  265 +
  266 +function cartesian(llist) {
  267 + if (llist.length == 0) {
  268 + return [[]];
  269 + }
  270 + var result = [];
  271 + var shortllist = llist.slice();
  272 + shortllist.splice(shortllist.length - 1, 1);
  273 + var carts = cartesian(shortllist);
  274 + var i;
  275 + for (i = 0; i < llist[llist.length - 1].length; i++) {
  276 + var tail = llist[llist.length - 1][i];
  277 + var heads = carts.slice();
  278 + var j;
  279 + for (j = 0; j < heads.length; j++) {
  280 + var tmp = heads[j].slice();
  281 + tmp.push(tail);
  282 + //alert(tmp);
  283 + result.push(tmp);
  284 + }
  285 + }
  286 + return result;
  287 +}
185 288  
  289 +function lexicalisationForm(tokenised) {
  290 + var display = "";
  291 + var i;
  292 + for (i = 0; i < tokenised.length; i++) {
  293 + display += "<input type = \"checkbox\" name = \"mwe\" value = \"" + base + " " + tokenised[i].join(" ") + "\">"; // TODO: unikalne wartoล›ci, wartoล›ฤ‡ => dodanie odpowiedniej jednostki (nazwa jednostki w wartoล›ci?)
  294 + display += base + " " + tokenised[i].join(" ") + "<br\>";
  295 + }
186 296 return display;
187 297 }
188 298  
  299 +
189 300 // get readable form of lexical unit
190 301 function getLexicalUnit(luid) {
191 302 var i = indexOfId(lexical_units, luid);
... ... @@ -193,3 +304,24 @@ function getLexicalUnit(luid) {
193 304 var lu = lexical_units[i];
194 305 return lu.base + '-' + lu.sense;
195 306 }
  307 +
  308 +
  309 +function addPhraseologicalUnit(mwe, glossa, relation, to) {
  310 + var lu = {base: mwe, glossa: "" + glossa, definition: "", id: free_luid, luid: -1, refl: "false", glossa: glossa, pos: "czasownik", sense: "A", relation: relation, to: to, location: ""};
  311 + var operation = {operation: 'add_unit', unit:lu};
  312 + lexical_units.push(lu);
  313 + lexical_unit_examples[free_luid] = [];
  314 + frames_operations.push(operation);
  315 + free_luid -= 1;
  316 + return (free_luid + 1);
  317 +}
  318 +
  319 +function addPhraseologicalUnits(frame_id, old_units, mwes, glossa, relation, to) {
  320 + var i;
  321 + var units = [];
  322 + for (i = 0; i < mwes.length; i++) {
  323 + units.push(addPhraseologicalUnit(mwes[i], glossa, relation, to));
  324 + }
  325 + changeUnits(frame_id, old_units.concat(units));
  326 +}
  327 +
... ...
semantics/static/js/semantics_roles.js
1 1 var roles_display_table = ""; // roles table in html form
  2 +var roles_display_table_full = ""; // with lemma role
2 3 var role_name = []; // displayed names of roles
3 4 var role_color = []; // colors assigned to roles
4 5  
5   -function memorizeRoles(roles_display){
6   - var i, j, k;
7   - roles_display_table = '<table border="1" style="font-size: 11px">';
  6 +function rolesToHtml(roles_display, full){
  7 + var i, j, k, table;
  8 + table = '<table border="1" style="font-size: 11px">';
8 9 for (i = 0; i < roles_display.length; i++) {
9   - roles_display_table += '<tr>';
  10 + table += '<tr>';
10 11 for (j = 0; j < roles_display[i].length; j++) {
11   - roles_display_table += '<td rowspan="';
12   - roles_display_table += roles_display[i][j].rowspan;
13   - roles_display_table += '" colspan="';
14   - roles_display_table += roles_display[i][j].colspan;
15   - roles_display_table += '">';
  12 + table += '<td rowspan="';
  13 + table += roles_display[i][j].rowspan;
  14 + table += '" colspan="';
  15 + table += roles_display[i][j].colspan;
  16 + table += '">';
16 17 if (roles_display[i][j].caption != "None") {
17   - roles_display_table += "<b>"
18   - roles_display_table += roles_display[i][j].caption;
19   - roles_display_table += "</b>"
  18 + table += "<b>"
  19 + table += roles_display[i][j].caption;
  20 + table += "</b>"
20 21 }
21 22 for (k = 0; k < roles_display[i][j].roles.length; k++) {
22   - roles_display_table += '<div style=';
  23 + table += '<div style=';
23 24 if (roles_display[i][j].roles[k].color != 'None') {
24   - roles_display_table += '"background-color: rgb(' + roles_display[i][j].roles[k].color + ')';
  25 + table += '"background-color: rgb(' + roles_display[i][j].roles[k].color + ')';
25 26 } else {
26   - roles_display_table += '"background: linear-gradient(to ' + roles_display[i][j].roles[k].gradient + ', rgba(100,100,100,0.1), rgba(100,100,100,1))';
  27 + table += '"background: linear-gradient(to ' + roles_display[i][j].roles[k].gradient + ', rgba(100,100,100,0.1), rgba(100,100,100,1))';
27 28 }
28   - roles_display_table += '"><input type="checkbox" name="roles" value="';
29   - roles_display_table += roles_display[i][j].roles[k].id;
30   - roles_display_table += '"><label>';
31   - roles_display_table += roles_display[i][j].roles[k].rolename;
32   - roles_display_table += '</label></div>';
33   - role_name[roles_display[i][j].roles[k].id] = roles_display[i][j].roles[k].rolename;
34   - role_color[roles_display[i][j].roles[k].id] = {"color": roles_display[i][j].roles[k].color, "gradient": roles_display[i][j].roles[k].gradient};
  29 + table += '"><input type="checkbox" name="roles" value="';
  30 + table += roles_display[i][j].roles[k].id;
  31 + table += '"><label>';
  32 + table += roles_display[i][j].roles[k].rolename;
  33 + table += '</label></div>';
  34 + if (full) {
  35 + role_name[roles_display[i][j].roles[k].id] = roles_display[i][j].roles[k].rolename;
  36 + role_color[roles_display[i][j].roles[k].id] = {"color": roles_display[i][j].roles[k].color, "gradient": roles_display[i][j].roles[k].gradient};
  37 + }
35 38 }
36   - roles_display_table += '</td>';
  39 + table += '</td>';
37 40 }
38   - roles_display_table += '</tr>';
  41 + table += '</tr>';
39 42 }
40   - roles_display_table += '</table>';
  43 + table += '</table>';
  44 +
  45 + return table;
  46 +}
  47 +
  48 +function memorizeRoles(roles_display, roles_full){
  49 + roles_display_table = rolesToHtml(roles_display, false);
  50 + roles_display_table_full = rolesToHtml(roles_full, true);
41 51 }
42 52  
43 53 function getStyle(frame_id, complement_num) {
44 54 style_type = "";
45 55 style_color = "";
46 56 style_value = ""
47   - roles = frame_content[parseInt(frame_id)].display.roles[complement_num].argument;
  57 + var roles = frame_content[parseInt(frame_id)].display.roles[complement_num].argument;
48 58 var i;
49 59 for (i = 0; i < roles.length; i++) {
50 60 var color = role_color[roles[i]];
... ... @@ -63,3 +73,15 @@ function getStyle(frame_id, complement_num) {
63 73 }
64 74 return {"type": style_type, "value": style_value};
65 75 }
  76 +
  77 +function isPOL(frame_id, complement_num) {
  78 + var roles = frame_content[parseInt(frame_id)].display.roles[complement_num].argument;
  79 + if (roles.length != 1) {
  80 + return false;
  81 + }
  82 + if (role_name[roles[0]] == 'Lemma') {
  83 + return true;
  84 + } else {
  85 + return false;
  86 + }
  87 +}
... ...
semantics/static/js/semantics_schemas.js
  1 +var subentry_display = [];
1 2 var ranks = {}; // lexical unit based rank of schema
2 3 var schemas_content = []; // schemas in html form
3 4 var default_order = []; // default order of schemas
... ... @@ -106,7 +107,7 @@ function schemaHeader(schema, alternates){
106 107 return schema_header;
107 108 }
108 109  
109   -function schemaBody(schema, alternation){
  110 +function schemaBody(schema, alternation, lex){
110 111 var schema_body = '';
111 112  
112 113 if (alternation != 1) {
... ... @@ -117,7 +118,7 @@ function schemaBody(schema, alternation){
117 118 schema_body += '<td class="ColumnHeader">Funkcja:</td>';
118 119 var display = schema.display;
119 120 for (k = 0; k < display.categories.length; k++) {
120   - schema_body += '<td class="' + display.categories[k].csv_class + 'alt_' + alternation + '_" id="' + display.categories[k].csv_class + 'alt_' + alternation + '_" onclick="schemaClick(\'' + display.categories[k].csv_id + 'alt_' + alternation + '_\')">';
  121 + schema_body += '<td class="' + display.categories[k].csv_class + 'alt_' + alternation + '_" id="' + display.categories[k].csv_class + 'alt_' + alternation + '_" onclick="schemaClick(\'' + display.categories[k].csv_id + 'alt_' + alternation + '_\', [])">';
121 122 schema_body += display.categories[k].argument;
122 123 schema_body += '</td>';
123 124 position_arguments[display.categories[k].csv_class + 'alt_' + alternation + '_'] = [];
... ... @@ -127,7 +128,12 @@ function schemaBody(schema, alternation){
127 128 schema_body += '<td class="ColumnHeader" rowspan="' + schema.rowspan + '">Typy fraz:</td>';
128 129 for (k = 0; k < display.arguments.length; k++) {
129 130 for (l = 0; l < display.arguments[k].length; l++) {
130   - schema_body += '<td id="' + display.arguments[k][l].csv_id + 'alt_' + alternation + '_" class="' + display.arguments[k][l].csv_class + 'alt_' + alternation + '_" onclick="schemaClick(\'' + display.arguments[k][l].csv_id + 'alt_' + alternation +'_\')">';
  131 + schema_body += '<td id="' + display.arguments[k][l].csv_id + 'alt_' + alternation + '_" class="' + display.arguments[k][l].csv_class + 'alt_' + alternation + '_" onclick="schemaClick(\'' + display.arguments[k][l].csv_id + 'alt_' + alternation +'_\', ';
  132 + if (display.arguments[k][l].lex.length != 0) {
  133 + schema_body += '[\'' + display.arguments[k][l].lex.join('\', \'') + '\'])">';
  134 + } else {
  135 + schema_body += '[])">';
  136 + }
131 137 schema_body += display.arguments[k][l].argument;
132 138 schema_body += '</td>';
133 139 if (parseInt(display.arguments[k][l].csv_id.split('_')[5]) >= 0) {
... ... @@ -147,6 +153,7 @@ function alternationCounts(alternations) {
147 153  
148 154 function displaySchemas(lemma, characteristic_display){
149 155 var i, j, k, l;
  156 + subentry_display = characteristic_display;
150 157 var schemas_display = "";
151 158 for (i = 0; i < characteristic_display.length; i++) {
152 159 char_id = characteristic_display[i].characteristic_id;
... ... @@ -205,3 +212,23 @@ function redrawSchemas(frame) {
205 212 }
206 213 }
207 214 }
  215 +
  216 +
  217 +function hasRefl(schema) {
  218 + // TODO: refl i recip w schemacie
  219 + var sid = schemaId(schema);
  220 + var i, j;
  221 + for (i = 0; i < subentry_display.length; i++) {
  222 + var char_display = subentry_display[i].characteristic_display;
  223 + for (j = 0; j < subentry_display[i].schemas.length; j++) {
  224 + if (subentry_display[i].schemas[j].schema_id == sid) {
  225 + if (char_display.search('siฤ™') >= 0) {
  226 + return true;
  227 + } else {
  228 + return false;
  229 + }
  230 + }
  231 + }
  232 + }
  233 + return false;
  234 +}
... ...
semantics/static/js/semantics_view.js
... ... @@ -356,6 +356,9 @@ function createFrame() {
356 356 } else {
357 357 units = f.meaning;
358 358 }
  359 + if ((typeof units) == 'undefined') {
  360 + units = [];
  361 + }
359 362  
360 363 frameClick("");
361 364 newFrame(units);
... ... @@ -376,6 +379,47 @@ function createFrame() {
376 379  
377 380 function changeLexicalUnits() {
378 381  
  382 + var getRelation =
  383 + function(f) {
  384 + return '<label>Relacja <select name="relation" disabled><option value="' + f.relation + '">' + relations_creating[parseInt(f.relation)] + '</option></label></select><br />';
  385 + };
  386 +
  387 + var getRelationsForm =
  388 + function () {
  389 + var result = '<label>Relacja ';
  390 + result += '<select id="synset_input_relation" name="relation" onchange="changeSynsetInput()">';
  391 + result += '<option value="0">' + relations_creating[0] + '</option>';
  392 + result += '<option value="1">' + relations_creating[1] + '</option>';
  393 + result += '<option value="2">' + relations_creating[2] + '</option>';
  394 + result += '</select></label><br />';
  395 + return result;
  396 + };
  397 +
  398 + var units = [];
  399 + var mwes = [];
  400 + var a = "";
  401 + var gloss = "";
  402 +
  403 + var addPhraseology =
  404 + function(e,v,m,f){
  405 + e.preventDefault();
  406 + if (v == -1)
  407 + $.prompt.goToState('state0');
  408 + if (v == 0) {
  409 + $.prompt.close();
  410 + }
  411 + if (v == 1) {
  412 + changeUnits(highlighted_id, units);
  413 +
  414 + addPhraseologicalUnits(highlighted_id, units, mwes, f.glossa, f.relation, f.synset);
  415 +
  416 + frameClick("");
  417 + displayFrames();
  418 + frameClick(a);
  419 + $.prompt.close();
  420 + }
  421 + };
  422 +
379 423 var change_units = {
380 424 state0: {
381 425 title: 'Zmiana jednostek leksykalnych',
... ... @@ -383,30 +427,69 @@ function changeLexicalUnits() {
383 427 buttons: { "Anuluj": -1, "Potwierdลบ": 1 },
384 428 focus: 1,
385 429 submit:function(e,v,m,f){
386   - e.preventDefault();
387   - if (v == -1) {
388   - $.prompt.close();
389   - }
390   - if (v == 1) {
391   -
392   - var units = normalizeFormData(f.meaning);
393   - if (units.length > 0) {
394   -
395   - var a = semantics_selected_id;
396   - changeUnits(highlighted_id, units);
397   - frameClick("");
398   - displayFrames();
399   - frameClick(a);
400   -
  430 + e.preventDefault();
  431 + if (v == -1) {
  432 + $.prompt.close();
  433 + }
  434 + if (v == 1) {
  435 +
  436 + units = normalizeFormData(f.meaning);
  437 + mwes = normalizeFormData(f.mwe);
  438 + a = semantics_selected_id;
  439 +
  440 + if (mwes.length == 0) {
  441 + changeUnits(highlighted_id, units);
  442 +
  443 + frameClick("");
  444 + displayFrames();
  445 + frameClick(a);
  446 + $.prompt.close();
  447 + } else {
  448 + $.prompt.goToState('state1');
  449 + attachPlWNContextAutocomplete();
  450 + }
  451 +
  452 + }
  453 + }
  454 + },
  455 + state1: { /* nowa frazeologia */
  456 + title: 'Nowe jednostki frazeologiczne',
  457 + html: '<label>Glossa <input type="text" name="glossa" value=""></label><br />' +
  458 + getRelationsForm() + "<label id=\"synset_input\">w stosunku do <input id=\"plWN_context_selection\" type=\"text\" name=\"context\"></label>",
  459 + buttons: { "Wstecz": -1, "Anuluj": 0, "Potwierdลบ": 1 },
  460 + focus: 1,
  461 + submit:function(e,v,m,f){
  462 + e.preventDefault();
  463 + if (v == -1) {
  464 + $.prompt.goToState('state0');
  465 + }
  466 + if (v == 0) {
401 467 $.prompt.close();
402   -
403   - } else {
404   -
405   - alert("Naleลผy wybraฤ‡ co najmniej jednฤ… jednostkฤ™ leksykalnฤ… dla ramy");
406   -
407 468 }
408   - }
409   - }
  469 + if (v == 1) {
  470 + if (parseInt(f.relation) != 2) {
  471 + /* podana lokalizacja w Sล‚owosieci */
  472 + $.prompt.removeState('state2');
  473 + $.prompt.addState('state2',
  474 + {
  475 + title: 'Znaczenia',
  476 + html: '<label>Glossa <input type="text" name="glossa" value="' + gloss + '" disabled></label><br />' +
  477 + getRelation(f) + "w stosunku do:<br />" + getSynsets(f.context, "czasownik"),
  478 + buttons: {Wstecz: -1, Anuluj: 0, Zatwierdลบ: 1},
  479 + focus: 1,
  480 + submit: addPhraseology
  481 + })
  482 + $.prompt.goToState('state2');
  483 + } else {
  484 + /* zignorowane umiejscowienie w Sล‚owosieci */
  485 + addPhraseologicalUnits(highlighted_id, units, mwes, f.glossa, f.relation, -1);
  486 + frameClick("");
  487 + displayFrames();
  488 + frameClick(a)
  489 + $.prompt.close();
  490 + }
  491 + }
  492 + }
410 493 },
411 494 };
412 495 if (change == true) {
... ... @@ -1018,8 +1101,13 @@ function color(what, how, disconnected_background, disconnected_text) {
1018 1101  
1019 1102 }
1020 1103  
1021   -function schemaClick(class_id) {
  1104 +function schemaClick(class_id, lex) {
1022 1105  
  1106 + var table = roles_display_table;
  1107 + if (lex.length != 0){
  1108 + table = roles_display_table_full;
  1109 + }
  1110 +
1023 1111 var field_ids;
1024 1112 if (class_id.split('arg').length == 1) {
1025 1113 field_ids = position_arguments[class_id].slice();
... ... @@ -1045,7 +1133,7 @@ function schemaClick(class_id) {
1045 1133 var choose_role = {
1046 1134 state0: {
1047 1135 title: 'Wybierz rolฤ™',
1048   - html: roles_display_table,
  1136 + html: table,
1049 1137 buttons: { Anuluj: -1, Zatwierdลบ: 1 },
1050 1138 focus: 1,
1051 1139 close: function(){return result;},
... ...
semantics/templates/roles.json
1   -{"roles_display": [
  1 +{% load jsonify %}
2 2  
3   -
4   - {% for row, outer_comma in roles_display %}
5   - [
6   - {% for caption, rowspan, colspan, roles, row_comma in row %}
7   - {
8   - "caption": "{{ caption }}", "rowspan": {{ rowspan }}, "colspan": {{ colspan }}, "roles": [
9   - {% for role, inner_comma in roles %}
10   - { "id": {{ role.id }}, "rolename": "{{ role.role }}", "color": "{{ role.color }}", "gradient": "{{ role.gradient }}" }{{ inner_comma }}
11   - {% endfor %}
12   - ]
13   - } {{ row_comma }}
14   - {% endfor %}
15   - ] {{ outer_comma }}
16   - {% endfor %}
17   -
18   -
19   -]}
  3 +{
  4 + "roles_display": {{ roles_display|jsonify }},
  5 + "roles_full": {{ roles_full|jsonify }}
  6 +}
... ...
semantics/templates/semantics.html
... ... @@ -35,7 +35,7 @@
35 35 });
36 36  
37 37 $.getJSON(ajax_roles, function(data){
38   - memorizeRoles(data.roles_display);
  38 + memorizeRoles(data.roles_display, data.roles_full);
39 39 $.getJSON(ajax_opinions, {lemma_id: {{ lemma.id }}}, function(data){
40 40 memorizeOpinions(data.opinions);
41 41 $.getJSON(ajax_frames, {lemma_id: {{ lemma.id }}}, function(data){
... ...
semantics/views.py
... ... @@ -8,7 +8,7 @@ from semantics.models import SemanticRole, SemanticFrame, Complement, \
8 8 from wordnet.models import Hypernymy, Synonymy
9 9  
10 10 from dictionary.models import Frame_Char_Model, Lemma, Lemma_Status, \
11   - sort_arguments, sort_positions
  11 + sort_arguments, sort_positions, sortatributes
12 12 from dictionary.ajax_lemma_view import user_can_modify
13 13 from django.core.exceptions import SuspiciousOperation
14 14 from django.core.urlresolvers import reverse
... ... @@ -18,6 +18,7 @@ from common.decorators import render, ajax
18 18 from semantics.saving import modify_frames, update_meanings
19 19 from semantics.validation import validate_schemas, validate_frames, validate_lexical_units
20 20  
  21 +from settings import MORFEUSZ2
21 22  
22 23 ####################################### render #####################################
23 24  
... ... @@ -74,8 +75,8 @@ def reorder_history(frames_list):
74 75 def ajax_frames(request, lemma_id):
75 76  
76 77 lemma = Lemma.objects.get(id=lemma_id, old=False)
77   - lexical_units = LexicalUnit.objects.filter(Q(base=lemma.entry, pos="czasownik")|Q(base=lemma.entry+u' siฤ™', pos="czasownik")).order_by('sense')
78   -# lexical_units = LexicalUnit.objects.filter(Q(base__startswith=lemma.entry + u' ')|Q(base__contains=u' '+lemma.entry+u' ')|Q(base__endswith=u' '+lemma.entry)|Q(base=lemma.entry)).order_by('sense')
  78 + # lexical_units = LexicalUnit.objects.filter(Q(base=lemma.entry, pos="czasownik")|Q(base=lemma.entry+u' siฤ™', pos="czasownik")).order_by('sense')
  79 + lexical_units = LexicalUnit.objects.filter(Q(base__startswith=lemma.entry + u' ')|Q(base__contains=u' '+lemma.entry+u' ')|Q(base__endswith=u' '+lemma.entry)|Q(base=lemma.entry)).order_by('sense')
79 80  
80 81 alternations = {}
81 82 frames_dict = {}
... ... @@ -96,8 +97,6 @@ def ajax_frames(request, lemma_id):
96 97 type_frames[t] = []
97 98 type_frames[tuple(frame_units[frame_id])].append(frames_dict[frame_id])
98 99  
99   -# ala[ma]=kot
100   -
101 100 frames_display = []
102 101 complement_arguments = {}
103 102 arguments_frame_connected = {}
... ... @@ -194,7 +193,7 @@ def ajax_frames(request, lemma_id):
194 193 frames_display.append(frame_display)
195 194  
196 195 # ala["ma"] = "kot"
197   -
  196 +
198 197 context = {
199 198 'frames_display': frames_display,
200 199 'connections': {'connected': complement_arguments, 'connected_reverse': arguments_frame_connected},
... ... @@ -208,8 +207,8 @@ def ajax_frames(request, lemma_id):
208 207 @ajax(method='get', encode_result=False)
209 208 def ajax_units(request, lemma_id):
210 209 lemma = Lemma.objects.get(id=lemma_id, old=False)
211   - lexical_units = LexicalUnit.objects.filter(Q(base = lemma.entry, pos="czasownik")|Q(base = lemma.entry + u' siฤ™', pos="czasownik")).order_by('base', 'sense')
212   -# lexical_units = LexicalUnit.objects.filter(Q(base__startswith=lemma.entry + u' ', pos="czasownik")|Q(base__contains=u' '+lemma.entry+u' ', pos="czasownik")|Q(base__endswith=u' '+lemma.entry, pos="czasownik")|Q(base=lemma.entry, pos="czasownik")).order_by('base', 'sense')
  210 + # lexical_units = LexicalUnit.objects.filter(Q(base = lemma.entry, pos="czasownik")|Q(base = lemma.entry + u' siฤ™', pos="czasownik")).order_by('base', 'sense')
  211 + lexical_units = LexicalUnit.objects.filter(Q(base__startswith=lemma.entry + u' ', pos="czasownik")|Q(base__contains=u' '+lemma.entry+u' ', pos="czasownik")|Q(base__endswith=u' '+lemma.entry, pos="czasownik")|Q(base=lemma.entry, pos="czasownik")).order_by('base', 'sense')
213 212  
214 213 context = {
215 214 'lexical_units': [{"id": lu.id, "luid": lu.luid, "base": lu.base, "sense": lu.sense, "pos": lu.pos, "glossa": lu.glossa, "definition": lu.definition, "location": location(lu)} for lu in lexical_units],
... ... @@ -293,25 +292,46 @@ def ajax_opinions(request):
293 292  
294 293 return context
295 294  
  295 +def NoneisNone(o):
  296 + if o is None:
  297 + return 'None'
  298 + else:
  299 + return o
  300 +
296 301 @render('roles.json')
297 302 @ajax(method='get', encode_result=False)
298 303 def ajax_roles(request):
299 304 roles_display = []
300 305 maxrow = SemanticRolesDisplay.objects.all().order_by('-row')[0].row
301   - for i in range(1, maxrow + 1):
  306 + for i in range(1, maxrow):
302 307 row = []
303 308 cells = SemanticRolesDisplay.objects.filter(row=i).order_by('column')
304 309 for cell in cells:
305   - content = cell.roles.all().order_by('id')
306   - commas = [','] * max(len(content) - 1, 0) + ['']
307   - row.append((cell.caption, cell.rowspan, cell.colspan, zip(content, commas)))
308   - commas = [','] * max(len(row) - 1, 0) + ['']
309   - captions, rowspans, colspans, contents = zip(*row)
310   - roles_display.append(zip(list(captions), list(rowspans), list(colspans), list(contents), commas))
311   - commas = [','] * max(len(roles_display) - 1, 0) + ['']
  310 + roles = [{"id": r.id, "rolename": r.role, "color": NoneisNone(r.color), "gradient": NoneisNone(r.gradient)} for r in cell.roles.all().order_by('id')]
  311 + row.append({"caption": NoneisNone(cell.caption),
  312 + "rowspan": cell.rowspan,
  313 + "colspan": cell.colspan,
  314 + "roles": roles})
  315 + roles_display.append(row)
  316 +
  317 + roles_short = roles_display[:]
  318 +
  319 + row = []
  320 + cells = SemanticRolesDisplay.objects.filter(row=maxrow).order_by('column')
  321 + for cell in cells:
  322 + roles = [{"id": r.id, "rolename": r.role, "color": NoneisNone(r.color), "gradient": NoneisNone(r.gradient)} for r in cell.roles.all().order_by('id')]
  323 + row.append({"caption": NoneisNone(cell.caption),
  324 + "rowspan": cell.rowspan,
  325 + "colspan": cell.colspan,
  326 + "roles": roles})
  327 + roles_display.append(row)
  328 +
  329 + roles_full = roles_display
  330 +
312 331  
313 332 context = {
314   - 'roles_display': zip(roles_display, commas),
  333 + 'roles_display': roles_short,
  334 + 'roles_full': roles_full
315 335 }
316 336  
317 337 return context
... ... @@ -373,13 +393,22 @@ def ajax_schemas(request, lemma_id):
373 393 for schema_id, position in zip(schema_ids, ordered_positions):
374 394 if position.arguments.count() > i:
375 395 ordered_arguments = sort_arguments(position.arguments.all())
376   - row.append(unicode(ordered_arguments[i]))
  396 + row.append((unicode(ordered_arguments[i]), ordered_arguments[i]))
377 397 idents.append(schema_id + 'arg_' + str(ordered_arguments[i].id) + '_')
378 398 else: # this category has fewer posible argument realizations
379   - row.append('')
  399 + row.append(('', None))
380 400 idents.append(schema_id + 'arg_-' + str(i + 1) + '_')
381 401 # identifier, class, argument
382   - display["arguments"].append([{"csv_id": i, "csv_class": c, "argument": a} for i, c, a in zip(idents, schema_ids, row)])
  402 + arg = []
  403 + #ma["ala"] = kot
  404 + for i, c, a in zip(idents, schema_ids, row):
  405 + astr, aobj = a
  406 + if aobj is not None and aobj.is_phraseologic():
  407 + lex = lexicalisation(aobj)
  408 + else:
  409 + lex = []
  410 + arg.append({"csv_id": i, "csv_class": c, "argument": astr, "lex": lex})
  411 + display["arguments"].append(arg)
383 412  
384 413 schema_display["schemas"].append({"schema_id": str(schema.id), "grade": lemma.get_schema_opinion(schema), "colspan": str(max(len(schema_categories), 1)), "rowspan": str(schema_arguments_rowspan), "display": display, "phraseologic": schema.phraseologic})
385 414  
... ... @@ -400,6 +429,62 @@ def ajax_schemas(request, lemma_id):
400 429  
401 430 return context
402 431  
  432 +def lexicalisation(argument):
  433 + b = argument.type
  434 + attributes = sortatributes(argument)
  435 + lexicalisation_type = attributes[0].values.all()[0].argument.type
  436 + lexicalisation_parameters = sortatributes(attributes[0].values.all()[0].argument)
  437 + if lexicalisation_type == 'np': # np(case), number, nouns, atr
  438 + nps = get_nps(get_case(lexicalisation_parameters[0]), get_number(attributes[1]), get_words(attributes[2]), attributes[3])
  439 + return nps
  440 + elif lexicalisation_type == 'prepnp': #prepnp(prep, case), number, nouns, atr
  441 + prepnps = get_prepnps(get_preposition(lexicalisation_parameters[0]), get_case(lexicalisation_parameters[1]), get_number(attributes[1]), get_words(attributes[2]), attributes[3])
  442 + return prepnps
  443 + else:
  444 + return []
  445 + return []
  446 +
  447 +def get_preposition(attribute):
  448 + return attribute.values.all()[0].parameter.type.name
  449 +
  450 +def get_words(attribute):
  451 + words = [word.text[1:-1] for word in attribute.values.all()]
  452 + return words
  453 +
  454 +def get_case(attribute):
  455 + case = attribute.values.all()[0].parameter.type.name
  456 + if case == u'str':
  457 + case = u'acc'
  458 + return case
  459 +
  460 +def get_number(attribute):
  461 + number = attribute.values.all()[0].parameter.type.name
  462 + return number
  463 +
  464 +def get_nps(case, number, nouns, _atr):
  465 + result = []
  466 + for noun in nouns:
  467 + options = [(interp.orth, interp.getTag(MORFEUSZ2)) for interp in MORFEUSZ2.generate(noun.encode('utf8'))]
  468 + if case != u'_':
  469 + filtered = []
  470 + for option in options:
  471 + (orth, tag) = option
  472 + if case in tag:
  473 + filtered.append(option)
  474 + options = filtered
  475 + if number != u'_':
  476 + filtered = []
  477 + for option in options:
  478 + (orth, tag) = option
  479 + if number in tag:
  480 + filtered.append(option)
  481 + options = filtered
  482 + return [orth for orth, _ in options]
  483 +
  484 +def get_prepnps(prep, case, number, nouns, _atr):
  485 + nps = get_nps(case, number, nouns, _atr)
  486 + return [prep + ' ' + np for np in nps]
  487 +
403 488 @render('examples.json')
404 489 @ajax(method='get', encode_result=False)
405 490 def ajax_examples(request, lemma_id):
... ...