Commit ba4f24621e81e5cb72d0df010e60381cd346ee80

Authored by Bartłomiej Nitoń
1 parent a131fa35

Added lemmata filters using semantic frames constrains.

dictionary/ajax_lemma_view.py
... ... @@ -12,6 +12,7 @@ from django.contrib.auth.models import User, Group
12 12 from django.core import serializers
13 13  
14 14 from common.js_to_obj import frameObjToSerializableDict, jsArgToObj, jsFrameToObj, jsPosToObj
  15 +from dictionary.common_func import escape_regex
15 16 from dictionary.convert_frames import frame_conversion
16 17 from dictionary.filtering import default_filter_rules, prepare_filter_form, \
17 18 save_lemma_filters_and_get_schemata_filter_setup, \
... ... @@ -29,7 +30,7 @@ from dictionary.models import Vocabulary, Lemma, Lemma_Status, Frame_Opinion, \
29 30 sortFrameChars, sortArguments, sortPositions, \
30 31 get_or_create_position, get_schemata_by_type, pos_compatible
31 32 from dictionary.forms import AddPositionForm, FrameForm, Pos_Cat_Form, \
32   - AddNkjpExampleForm, MessageForm, SortForm, FilterForm, \
  33 + AddNkjpExampleForm, MessageForm, SortForm, \
33 34 SimilarLemmasNewForm, ChangeUserFunctionForm, \
34 35 ExampleOpinionForm, \
35 36 FrameConversionForm, CreatePositionForm, AssignPhraseologicFrameForm
... ... @@ -39,6 +40,7 @@ from dictionary.saving import connect_example_operation, disconnect_all_examples
39 40  
40 41 from common.decorators import render, ajax, AjaxError
41 42 from common.util import triple_arg_poss
  43 +from dictionary.filtering import filter_lemmas
42 44 from dictionary.validation import find_similar_frames, get_all_test_missing_frames, get_aspect_rel_lemmas, \
43 45 get_wrong_aspect_frames, validate_B_frames, get_deriv_miss_frames_message, \
44 46 validate_phraseology_binded_frames, validate_rule_5, \
... ... @@ -46,7 +48,7 @@ from dictionary.validation import find_similar_frames, get_all_test_missing_fram
46 48 validate_schemata_for_semantics_and_mark_errors, \
47 49 get_missing_aspects_msg, validate_same_positions_schemata
48 50  
49   -from semantics.models import LexicalUnitExamples
  51 +from semantics.models import LexicalUnitExamples, SemanticFrame
50 52  
51 53 from wordnet.models import LexicalUnit
52 54  
... ... @@ -147,7 +149,7 @@ def prepareFrameTable(frame):
147 149  
148 150 def nkjpExamplesObjToJs(nkjp_examples, user, lemma):
149 151 example_dict_list = []
150   - lexical_units = lemma.entry_obj.lexical_units()
  152 + lexical_units = lemma.entry_obj.meanings.all()
151 153 for example in nkjp_examples:
152 154 frame = example.frame;
153 155 frame_table_id = 'frame_'+str(frame.id)+'_'
... ... @@ -168,11 +170,6 @@ def nkjpExamplesObjToJs(nkjp_examples, user, lemma):
168 170  
169 171 sentence = example.sentence
170 172 comment = example.comment
171   -# sentence = example.sentence.replace('\\', '\\\\').replace("\n", "\\n").replace("\r", "\\r").replace("\t", "\\t").replace("\"", "\\\"")
172   -# comment = example.comment.replace('\\', '\\\\').replace("\n", "\\n").replace("\r", "\\r").replace("\t", "\\t").replace("\"", "\\\"")
173   -# h = HTMLParser.HTMLParser()
174   -# sentence = h.unescape(sentence)
175   -# comment = h.unescape(comment)
176 173  
177 174 example_dict = { 'example_id' : example.id,
178 175 'frame_id' : frame_table_id,
... ... @@ -423,11 +420,7 @@ def examples_pinned(frame, schema_examples):
423 420 @ajax(method='get')
424 421 def example_got_assigned_semantics(request, lemma_id, example_id):
425 422 lemma = Lemma.objects.get(id=lemma_id)
426   -# sprawdz czy najnowsza wersja
427   -# if lemma.old:
428   -# raise AjaxError('old lemma')
429   - # TODO niech lexical units beda wybierane z uzyciem Entry jak juz Tomasz to zrobi
430   - lexical_units = LexicalUnit.objects.filter(Q(base = lemma.entry)|Q(base = lemma.entry + u' się'))
  423 + lexical_units = lemma.entry_obj.meanings.all()
431 424 for lu in lexical_units:
432 425 if LexicalUnitExamples.objects.filter(example__id=example_id,
433 426 lexical_unit=lu).exists():
... ... @@ -789,8 +782,7 @@ def get_sort_order(request):
789 782 @render('filter_form.html')
790 783 @ajax(method='get', encode_result=False)
791 784 def filter_form(request):
792   - form = prepare_filter_form(request)
793   - return {'form': form}
  785 + return prepare_filter_form(request)
794 786  
795 787 @ajax(method='post')
796 788 def filter_form_submit(request, form_data):
... ... @@ -1355,10 +1347,7 @@ def get_default_char_value(possibilities):
1355 1347 value = possibilities.get(default=True)
1356 1348 except Frame_Char_Value.DoesNotExist:
1357 1349 value = possibilities.all()[0]
1358   - return value
1359   -
1360   -def escape_regex(string):
1361   - return string.replace('(', '\(').replace(')', '\)').replace('{', '\{').replace('}', '\}').replace('[', '\[').replace(']', '\]')
  1350 + return value
1362 1351  
1363 1352 def regex_query(string):
1364 1353 q_query = []
... ... @@ -2336,7 +2325,7 @@ def save_new_frames(request, data, id, examples, lemma_examples):
2336 2325 reconnect_examples_operations.remove(disconnect_example_operation(example, nkjp_example_obj))
2337 2326 except ValueError:
2338 2327 reconnect_examples_operations.append(connect_example_operation(example, nkjp_example_obj))
2339   - reconnect_examples(reconnect_examples_operations)
  2328 + reconnect_examples(new_lemma_ver, reconnect_examples_operations)
2340 2329  
2341 2330 # dodawanie przykladow nkjp do czasownika
2342 2331 for example in decoded_lemma_examples:
... ... @@ -2607,90 +2596,6 @@ def prepare_sort_rules(sort_rules):
2607 2596 prepared_sort_rules.append(rule['name'])
2608 2597 return prepared_sort_rules
2609 2598  
2610   -def pos_regex_frames(frames, string):
2611   - try:
2612   - alternative_queries = []
2613   - for alternative in string.split('|'):
2614   - possible_frames = frames
2615   - for conj in alternative.split('&'):
2616   - model_results = []
2617   - negation = False
2618   - conj = conj.strip()
2619   - if conj.startswith('!'):
2620   - conj = conj.lstrip('!')
2621   - negation = True
2622   - regex = ur'^%s$' % escape_regex(conj)
2623   - model_results = Position.objects.filter(frames__lemmas__old=False,
2624   - text_rep__regex=regex).distinct()
2625   - if model_results.exists():
2626   - if negation:
2627   - possible_frames = possible_frames.exclude(positions__in=model_results)
2628   - else:
2629   - possible_frames = possible_frames.filter(positions__in=model_results)
2630   - elif not model_results.exists() and not negation:
2631   - possible_frames = Frame.objects.none()
2632   - alternative_queries.append(Q(id__in=possible_frames))
2633   - frames = frames.filter(reduce(operator.or_, alternative_queries)).distinct()
2634   - except:
2635   - frames = Frame.objects.none()
2636   - return frames
2637   -
2638   -def arg_regex_frames(frames, string):
2639   - try:
2640   - alternative_queries = []
2641   - for alternative in string.split('|'):
2642   - possible_frames = frames
2643   - for conj in alternative.split('&'):
2644   - model_results = []
2645   - negation = False
2646   - conj = conj.strip()
2647   - if conj.startswith('!'):
2648   - conj = conj.lstrip('!')
2649   - negation = True
2650   - regex = ur'^%s$' % escape_regex(conj)
2651   - model_results = Argument.objects.filter(positions__frames__lemmas__old=False,
2652   - text_rep__regex=regex).distinct()
2653   - if model_results.exists():
2654   - if negation:
2655   - possible_frames = possible_frames.exclude(positions__arguments__in=model_results)
2656   - else:
2657   - possible_frames = possible_frames.filter(positions__arguments__in=model_results)
2658   - elif not model_results.exists() and not negation:
2659   - possible_frames = Frame.objects.none()
2660   - alternative_queries.append(Q(id__in=possible_frames))
2661   - frames = frames.filter(reduce(operator.or_, alternative_queries)).distinct()
2662   - except:
2663   - frames = Frame.objects.none()
2664   - return frames
2665   -
2666   -def lemma_regex_filter(lemmas, string):
2667   - try:
2668   - alternative_queries = []
2669   - for alternative in string.split('|'):
2670   - possible_lemmas = lemmas
2671   - for conj in alternative.split('&'):
2672   - model_results = []
2673   - negation = False
2674   - conj = conj.strip()
2675   - if conj.startswith('!'):
2676   - conj = conj.lstrip('!')
2677   - negation = True
2678   - regex = ur'^%s$' % escape_regex(conj)
2679   - model_results = Lemma.objects.filter(old=False,
2680   - entry_obj__name__regex=regex).distinct()
2681   - if model_results.exists():
2682   - if negation:
2683   - possible_lemmas = possible_lemmas.exclude(pk__in=model_results)
2684   - else:
2685   - possible_lemmas = possible_lemmas.filter(pk__in=model_results)
2686   - elif not model_results.exists() and not negation:
2687   - possible_lemmas = Lemma.objects.none()
2688   - alternative_queries.append(Q(id__in=possible_lemmas))
2689   - lemmas = lemmas.filter(reduce(operator.or_, alternative_queries)).distinct()
2690   - except:
2691   - lemmas = Lemma.objects.none()
2692   - return lemmas
2693   -
2694 2599 def get_lemma_query(prepared_sort_rules, filter_rules, lemma_query, user):
2695 2600 lemmas = Lemma.objects.none()
2696 2601 if user.is_authenticated():
... ... @@ -2711,72 +2616,8 @@ def get_lemma_query(prepared_sort_rules, filter_rules, lemma_query, user):
2711 2616 lemmas = lemmas.filter(reduce(operator.or_, q_vocab_list))
2712 2617 lemmas = lemmas.filter(reduce(operator.or_, q_status_list))
2713 2618  
2714   - ## filtrowanie
2715   - if filter_rules['owner']:
2716   - lemmas = lemmas.filter(owner=filter_rules['owner'])
2717   - if filter_rules['phraseologist']:
2718   - lemmas = lemmas.filter(phraseologist=filter_rules['phraseologist'])
2719   - if filter_rules['semanticist']:
2720   - lemmas = lemmas.filter(semanticist=filter_rules['semanticist'])
2721   - if filter_rules['vocabulary']:
2722   - lemmas = lemmas.filter(vocabulary=filter_rules['vocabulary'])
2723   - if filter_rules['status']:
2724   - lemmas = lemmas.filter(status=filter_rules['status'])
2725   - if filter_rules['frame_opinion']:
2726   - lemmas = lemmas.filter(frame_opinions__value=filter_rules['frame_opinion'])
2727   - if filter_rules['lemma'] and filter_rules['lemma'] != '.*':
2728   - lemmas = lemma_regex_filter(lemmas, filter_rules['lemma'])
2729   - if filter_rules['sender']:
2730   - lemmas = lemmas.filter(messages__sender=filter_rules['sender'])
2731   - if filter_rules['pos']:
2732   - lemmas = lemmas.filter(entry_obj__pos=filter_rules['pos'])
2733   - if filter_rules['contains_phraseology']:
2734   - phraseologic_lemmas = lemmas.filter(frames__phraseologic=True)
2735   - if filter_rules['contains_phraseology'] == 'yes':
2736   - lemmas = phraseologic_lemmas
2737   - else:
2738   - lemmas = lemmas.exclude(pk__in=phraseologic_lemmas)
2739   - if filter_rules['example_source']:
2740   - lemmas = lemmas.filter(Q(nkjp_examples__source=filter_rules['example_source']) &
2741   - Q(nkjp_examples__approved=False)).distinct()
2742   - napproved_examples = NKJP_Example.objects.filter(Q(source=filter_rules['example_source']) &
2743   - Q(approved=False) &
2744   - Q(lemmas__old=False) &
2745   - ~Q(approvers=user)).distinct()
2746   -
2747   - if filter_rules['approver']:
2748   - napproved_examples = napproved_examples.filter(approvers=filter_rules['approver'])
2749   - lemmas = lemmas.filter(nkjp_examples__in=napproved_examples)
2750   - lemmas = lemmas.distinct()
2751   -
2752   - frames = Frame.objects
2753   - if filter_rules['reflex']:
2754   - frames = frames.filter(characteristics=filter_rules['reflex'])
2755   - if filter_rules['negativity']:
2756   - frames = frames.filter(characteristics=filter_rules['negativity'])
2757   - if filter_rules['predicativity']:
2758   - frames = frames.filter(characteristics=filter_rules['predicativity'])
2759   - if filter_rules['aspect']:
2760   - frames = frames.filter(characteristics=filter_rules['aspect'])
2761   - if filter_rules['position'] and filter_rules['position'] != '.*':
2762   - frames = pos_regex_frames(frames, filter_rules['position'])
2763   - if filter_rules['argument'] and filter_rules['argument'] != '.*':
2764   - frames = arg_regex_frames(frames, filter_rules['argument'])
2765   - if filter_rules['schema_type']:
2766   - frames = get_schemata_by_type(filter_rules['schema_type'], frames)
2767   -
2768   - if (filter_rules['reflex'] or filter_rules['negativity'] or
2769   - filter_rules['aspect'] or filter_rules['predicativity'] or
2770   - filter_rules['schema_type'] or filter_rules['frame_opinion'] or
2771   - (filter_rules['argument'] and filter_rules['argument'] != '.*') or
2772   - (filter_rules['position'] and filter_rules['position'] != '.*')):
2773   - if filter_rules['frame_opinion']:
2774   - lemmas = lemmas.filter(frame_opinions__frame__in=frames.all(),
2775   - frame_opinions__value=filter_rules['frame_opinion']).distinct()
2776   - else:
2777   - lemmas = lemmas.filter(frames__in=frames.all()).distinct()
2778   -
2779   - lemmas = lemmas.distinct()
  2619 + ## filtrowanie
  2620 + lemmas = filter_lemmas(lemmas, filter_rules, user)
2780 2621  
2781 2622 ## sortowanie
2782 2623 entrySortDefined = False
... ...
dictionary/common_func.py
1 1 #-*- coding:utf-8 -*-
2 2  
3   -#Copyright (c) 2012, Bartłomiej Nitoń
4   -#All rights reserved.
5   -
6   -#Redistribution and use in source and binary forms, with or without modification, are permitted provided
7   -#that the following conditions are met:
8   -
9   -# Redistributions of source code must retain the above copyright notice, this list of conditions and
10   -# the following disclaimer.
11   -# Redistributions in binary form must reproduce the above copyright notice, this list of conditions
12   -# and the following disclaimer in the documentation and/or other materials provided with the distribution.
13   -
14   -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
15   -# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
16   -# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
17   -# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
18   -# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
19   -# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
20   -# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
21   -# POSSIBILITY OF SUCH DAMAGE.
22   -
23 3 '''
24 4 Common functions used in Slowal application.
25 5 '''
... ... @@ -131,4 +111,6 @@ def have_same_positions_structure(pos1, pos2):
131 111 if(pos1_args == pos2_args and pos1_cats==pos2_cats):
132 112 same_structure = True
133 113 return same_structure
134   -
  114 +
  115 +def escape_regex(string):
  116 + return string.replace('(', '\(').replace(')', '\)').replace('{', '\{').replace('}', '\}').replace('[', '\[').replace(']', '\]')
... ...
dictionary/filtering.py
1 1 # -*- coding: utf-8 -*-
2 2  
  3 +import operator
  4 +
3 5 from django.contrib.auth.models import User
  6 +from django.db.models import Q
4 7  
5 8 from accounts.models import get_anon_profile
  9 +from dictionary.common_func import escape_regex
6 10 from dictionary.forms import FilterForm
7   -from dictionary.models import Frame_Char_Model, Frame_Opinion_Value, Lemma_Status, \
8   - NKJP_Source, POS, Vocabulary, \
9   - get_frame_char_and_its_value
  11 +from dictionary.models import Argument, Frame, Frame_Char_Model, Frame_Opinion_Value, \
  12 + Lemma, Lemma_Status, NKJP_Example, NKJP_Source, POS, \
  13 + Position, Vocabulary, \
  14 + get_frame_char_and_its_value, get_schemata_by_type
  15 +from semantics.forms import GeneralSelPrefForm, RelationalSelPrefForm, RoleForm, \
  16 + SynsetSelPrefForm
  17 +from semantics.models import Complement, FrameOpinion, RelationalSelectivePreference, \
  18 + SemanticFrame
  19 +from wordnet.models import LexicalUnit
10 20  
11 21 def schemata_filter_options():
12 22 # pobieranie wartosci aspektu
... ... @@ -70,9 +80,11 @@ def default_filter_rules():
70 80 'aspect': None,
71 81 'argument': '.*',
72 82 'position': '.*',
73   - 'frame_opinion' : None,
  83 + 'schema_opinion' : None,
74 84 'sender': None,
75   - 'schema_type': None}
  85 + 'schema_type': None,
  86 + 'frame_opinion': None,
  87 + 'sem_arguments': []}
76 88  
77 89 def prepare_filter_form(request):
78 90 if request.session.has_key('lemma_preview') and request.session['lemma_preview']:
... ... @@ -121,13 +133,60 @@ def prepare_filter_form(request):
121 133 sel_aspect=filter_rules['aspect'],
122 134 sel_has_argument=filter_rules['argument'],
123 135 sel_has_position=filter_rules['position'],
124   - sel_frame_opinion=filter_rules['frame_opinion'],
  136 + sel_schema_opinion=filter_rules['schema_opinion'],
125 137 can_confirm_example = can_confirm_example,
126 138 sel_example_source=filter_rules['example_source'],
127 139 sel_approver=filter_rules['approver'],
128 140 sel_sender=filter_rules['sender'],
129   - sel_schema_type=filter_rules['schema_type'])
130   - return form
  141 + sel_schema_type=filter_rules['schema_type'],
  142 + sel_frame_opinion=filter_rules['frame_opinion'])
  143 + return {'form': form,
  144 + 'sem_args_forms': sem_args_to_forms(filter_rules['sem_arguments'])}
  145 +
  146 +def sem_args_to_forms(sem_arguments):
  147 + args_forms = []
  148 + first_alternative = True
  149 + for alternative in sem_arguments:
  150 + if first_alternative:
  151 + first_alternative = False
  152 + else:
  153 + args_forms.append('or')
  154 + for arg in alternative:
  155 + args_forms.append(RoleForm(negation=arg['negation'],
  156 + sel_role=arg['role'],
  157 + sel_attribute=arg['attribute'],
  158 + sel_preferences=get_sel_prefs_as_forms(arg)))
  159 + return args_forms
  160 +
  161 +def get_sel_prefs_as_forms(arg):
  162 + forms = []
  163 + if arg['general_prefs']:
  164 + forms.extend(general_prefs_to_forms(arg['general_prefs']))
  165 + if arg['synset_prefs']:
  166 + forms.extend(synset_prefs_to_forms(arg['synset_prefs']))
  167 + if arg['relational_prefs']:
  168 + forms.extend(relational_prefs_to_forms(arg['relational_prefs']))
  169 + return forms
  170 +
  171 +def general_prefs_to_forms(prefs):
  172 + forms = []
  173 + for pref in prefs:
  174 + forms.append(GeneralSelPrefForm(sel_preference=pref))
  175 + return forms
  176 +
  177 +def synset_prefs_to_forms(prefs):
  178 + forms = []
  179 + for pref in prefs:
  180 + forms.append(SynsetSelPrefForm(sel_preference=pref))
  181 + return forms
  182 +
  183 +def relational_prefs_to_forms(prefs):
  184 + forms = []
  185 + for pref in prefs:
  186 + forms.append(RelationalSelPrefForm(sel_relation=pref['relation'],
  187 + sel_role=pref['role'],
  188 + sel_attribute=pref['attribute']))
  189 + return forms
131 190  
132 191 def save_lemma_filters_and_get_schemata_filter_setup(request, filter_dict):
133 192 if filter_dict['pos']:
... ... @@ -183,17 +242,28 @@ def save_lemma_filters_and_get_schemata_filter_setup(request, filter_dict):
183 242 aspect_obj, aspect_val = get_frame_char_and_its_value(filter_dict['aspect'], '*')
184 243 pred_obj, pred_val = get_frame_char_and_its_value(filter_dict['predicativity'], '*')
185 244  
186   - if filter_dict['frame_opinion']:
187   - frame_opinion_obj = Frame_Opinion_Value.objects.get(id=filter_dict['frame_opinion'])
188   - opinion_val = frame_opinion_obj.value
  245 + if filter_dict['schema_opinion']:
  246 + schema_opinion_obj = Frame_Opinion_Value.objects.get(id=filter_dict['schema_opinion'])
  247 + opinion_val = schema_opinion_obj.value
189 248 else:
190   - frame_opinion_obj = None
  249 + schema_opinion_obj = None
191 250 opinion_val = '*'
192 251  
193 252 if 'schema_type' in filter_dict:
194 253 schema_type = filter_dict['schema_type']
195 254 else:
196 255 schema_type = None
  256 +
  257 + if filter_dict['frame_opinion']:
  258 + frame_opinion = FrameOpinion.objects.get(id=filter_dict['frame_opinion'])
  259 + else:
  260 + frame_opinion = None
  261 +
  262 + if filter_dict['sem_arguments']:
  263 + sem_arguments = filter_dict['sem_arguments']
  264 + else:
  265 + sem_arguments = []
  266 +
197 267 if request.session.has_key('lemma_preview') and request.session['lemma_preview']:
198 268 request.session['filter_rules_lemma_preview'] = {'pos' : pos_obj,
199 269 'contains_phraseology': filter_dict['contains_phraseology'],
... ... @@ -211,9 +281,11 @@ def save_lemma_filters_and_get_schemata_filter_setup(request, filter_dict):
211 281 'argument' : filter_dict['has_argument'],
212 282 'position' : filter_dict['has_position'],
213 283 'lemma' : filter_dict['lemma'],
214   - 'frame_opinion' : frame_opinion_obj,
  284 + 'schema_opinion' : schema_opinion_obj,
215 285 'sender' : sender_obj,
216   - 'schema_type' : schema_type}
  286 + 'schema_type' : schema_type,
  287 + 'frame_opinion' : frame_opinion,
  288 + 'sem_arguments' : sem_arguments}
217 289 else:
218 290 request.session['filter_rules'] = {'pos' : pos_obj,
219 291 'contains_phraseology': filter_dict['contains_phraseology'],
... ... @@ -231,9 +303,11 @@ def save_lemma_filters_and_get_schemata_filter_setup(request, filter_dict):
231 303 'argument' : filter_dict['has_argument'],
232 304 'position' : filter_dict['has_position'],
233 305 'lemma' : filter_dict['lemma'],
234   - 'frame_opinion' : frame_opinion_obj,
  306 + 'schema_opinion' : schema_opinion_obj,
235 307 'sender' : sender_obj,
236   - 'schema_type' : schema_type}
  308 + 'schema_type' : schema_type,
  309 + 'frame_opinion' : frame_opinion,
  310 + 'sem_arguments' : sem_arguments}
237 311  
238 312 return {'filter_frames': filter_dict['filter_frames'],
239 313 'schema_type' : schema_type,
... ... @@ -244,3 +318,242 @@ def save_lemma_filters_and_get_schemata_filter_setup(request, filter_dict):
244 318 'aspect' : aspect_val,
245 319 'position' : filter_dict['has_position'],
246 320 'argument' : filter_dict['has_argument']}
  321 +
  322 +def filter_lemmas(lemmas, filter_rules, user):
  323 + lemmas = filter_by_lemma_properties(lemmas, filter_rules, user)
  324 + lemmas = filter_by_schemata(lemmas, filter_rules)
  325 + lemmas = filter_by_frames(lemmas, filter_rules)
  326 + return lemmas
  327 +
  328 +def filter_by_lemma_properties(lemmas, filter_rules, user):
  329 + if filter_rules['owner']:
  330 + lemmas = lemmas.filter(owner=filter_rules['owner'])
  331 + if filter_rules['phraseologist']:
  332 + lemmas = lemmas.filter(phraseologist=filter_rules['phraseologist'])
  333 + if filter_rules['semanticist']:
  334 + lemmas = lemmas.filter(semanticist=filter_rules['semanticist'])
  335 + if filter_rules['vocabulary']:
  336 + lemmas = lemmas.filter(vocabulary=filter_rules['vocabulary'])
  337 + if filter_rules['status']:
  338 + lemmas = lemmas.filter(status=filter_rules['status'])
  339 + if filter_rules['schema_opinion']:
  340 + lemmas = lemmas.filter(frame_opinions__value=filter_rules['schema_opinion'])
  341 + if filter_rules['lemma'] and filter_rules['lemma'] != '.*':
  342 + lemmas = lemma_regex_filter(lemmas, filter_rules['lemma'])
  343 + if filter_rules['sender']:
  344 + lemmas = lemmas.filter(messages__sender=filter_rules['sender'])
  345 + if filter_rules['pos']:
  346 + lemmas = lemmas.filter(entry_obj__pos=filter_rules['pos'])
  347 + if filter_rules['contains_phraseology']:
  348 + phraseologic_lemmas = lemmas.filter(frames__phraseologic=True)
  349 + if filter_rules['contains_phraseology'] == 'yes':
  350 + lemmas = phraseologic_lemmas
  351 + else:
  352 + lemmas = lemmas.exclude(pk__in=phraseologic_lemmas)
  353 + if filter_rules['example_source']:
  354 + lemmas = lemmas.filter(Q(nkjp_examples__source=filter_rules['example_source']) &
  355 + Q(nkjp_examples__approved=False)).distinct()
  356 + napproved_examples = NKJP_Example.objects.filter(Q(source=filter_rules['example_source']) &
  357 + Q(approved=False) &
  358 + Q(lemmas__old=False) &
  359 + ~Q(approvers=user)).distinct()
  360 +
  361 + if filter_rules['approver']:
  362 + napproved_examples = napproved_examples.filter(approvers=filter_rules['approver'])
  363 + lemmas = lemmas.filter(nkjp_examples__in=napproved_examples)
  364 + lemmas = lemmas.distinct()
  365 + return lemmas
  366 +
  367 +def lemma_regex_filter(lemmas, string):
  368 + try:
  369 + alternative_queries = []
  370 + for alternative in string.split('|'):
  371 + possible_lemmas = lemmas
  372 + for conj in alternative.split('&'):
  373 + model_results = []
  374 + negation = False
  375 + conj = conj.strip()
  376 + if conj.startswith('!'):
  377 + conj = conj.lstrip('!')
  378 + negation = True
  379 + regex = ur'^%s$' % escape_regex(conj)
  380 + model_results = Lemma.objects.filter(old=False,
  381 + entry_obj__name__regex=regex).distinct()
  382 + if model_results.exists():
  383 + if negation:
  384 + possible_lemmas = possible_lemmas.exclude(pk__in=model_results)
  385 + else:
  386 + possible_lemmas = possible_lemmas.filter(pk__in=model_results)
  387 + elif not model_results.exists() and not negation:
  388 + possible_lemmas = Lemma.objects.none()
  389 + alternative_queries.append(Q(id__in=possible_lemmas))
  390 + lemmas = lemmas.filter(reduce(operator.or_, alternative_queries)).distinct()
  391 + except:
  392 + lemmas = Lemma.objects.none()
  393 + return lemmas
  394 +
  395 +def filter_by_schemata(lemmas, filter_rules):
  396 + schemata = Frame.objects
  397 + if filter_rules['reflex']:
  398 + schemata = schemata.filter(characteristics=filter_rules['reflex'])
  399 + if filter_rules['negativity']:
  400 + schemata = schemata.filter(characteristics=filter_rules['negativity'])
  401 + if filter_rules['predicativity']:
  402 + schemata = schemata.filter(characteristics=filter_rules['predicativity'])
  403 + if filter_rules['aspect']:
  404 + schemata = schemata.filter(characteristics=filter_rules['aspect'])
  405 + if filter_rules['position'] and filter_rules['position'] != '.*':
  406 + schemata = pos_regex_frames(schemata, filter_rules['position'])
  407 + if filter_rules['argument'] and filter_rules['argument'] != '.*':
  408 + schemata = arg_regex_frames(schemata, filter_rules['argument'])
  409 + if filter_rules['schema_type']:
  410 + schemata = get_schemata_by_type(filter_rules['schema_type'], schemata)
  411 +
  412 + if (filter_rules['reflex'] or filter_rules['negativity'] or
  413 + filter_rules['aspect'] or filter_rules['predicativity'] or
  414 + filter_rules['schema_type'] or filter_rules['schema_opinion'] or
  415 + (filter_rules['argument'] and filter_rules['argument'] != '.*') or
  416 + (filter_rules['position'] and filter_rules['position'] != '.*')):
  417 + if filter_rules['schema_opinion']:
  418 + lemmas = lemmas.filter(frame_opinions__frame__in=schemata.all(),
  419 + frame_opinions__value=filter_rules['schema_opinion'])
  420 + else:
  421 + lemmas = lemmas.filter(frames__in=schemata.all())
  422 + lemmas = lemmas.distinct()
  423 + return lemmas
  424 +
  425 +def pos_regex_frames(frames, string):
  426 + try:
  427 + alternative_queries = []
  428 + for alternative in string.split('|'):
  429 + possible_frames = frames
  430 + for conj in alternative.split('&'):
  431 + model_results = []
  432 + negation = False
  433 + conj = conj.strip()
  434 + if conj.startswith('!'):
  435 + conj = conj.lstrip('!')
  436 + negation = True
  437 + regex = ur'^%s$' % escape_regex(conj)
  438 + model_results = Position.objects.filter(frames__lemmas__old=False,
  439 + text_rep__regex=regex).distinct()
  440 + if model_results.exists():
  441 + if negation:
  442 + possible_frames = possible_frames.exclude(positions__in=model_results)
  443 + else:
  444 + possible_frames = possible_frames.filter(positions__in=model_results)
  445 + elif not model_results.exists() and not negation:
  446 + possible_frames = Frame.objects.none()
  447 + alternative_queries.append(Q(id__in=possible_frames))
  448 + frames = frames.filter(reduce(operator.or_, alternative_queries)).distinct()
  449 + except:
  450 + frames = Frame.objects.none()
  451 + return frames
  452 +
  453 +def arg_regex_frames(frames, string):
  454 + try:
  455 + alternative_queries = []
  456 + for alternative in string.split('|'):
  457 + possible_frames = frames
  458 + for conj in alternative.split('&'):
  459 + model_results = []
  460 + negation = False
  461 + conj = conj.strip()
  462 + if conj.startswith('!'):
  463 + conj = conj.lstrip('!')
  464 + negation = True
  465 + regex = ur'^%s$' % escape_regex(conj)
  466 + model_results = Argument.objects.filter(positions__frames__lemmas__old=False,
  467 + text_rep__regex=regex).distinct()
  468 + if model_results.exists():
  469 + if negation:
  470 + possible_frames = possible_frames.exclude(positions__arguments__in=model_results)
  471 + else:
  472 + possible_frames = possible_frames.filter(positions__arguments__in=model_results)
  473 + elif not model_results.exists() and not negation:
  474 + possible_frames = Frame.objects.none()
  475 + alternative_queries.append(Q(id__in=possible_frames))
  476 + frames = frames.filter(reduce(operator.or_, alternative_queries)).distinct()
  477 + except:
  478 + frames = Frame.objects.none()
  479 + return frames
  480 +
  481 +def filter_by_frames(lemmas, filter_rules):
  482 + frames = SemanticFrame.objects.filter(next__isnull=True, removed=False)
  483 + if filter_rules['frame_opinion']:
  484 + frames = frames.filter(opinion=filter_rules['frame_opinion'])
  485 + if filter_rules['sem_arguments']:
  486 + frames = get_frames_by_args_rule(frames, filter_rules['sem_arguments'])
  487 + if filter_rules['frame_opinion'] or filter_rules['sem_arguments']:
  488 + lemmas = lemmas.filter(entry_obj__meanings__frames__in=frames).distinct()
  489 + return lemmas
  490 +
  491 +def get_frames_by_args_rule(frames, args_filter_rule):
  492 + matching_frames = []
  493 + for alternative in args_filter_rule:
  494 + alt_matching_frames = get_matching_frames(frames, alternative)
  495 + matching_frames.extend(alt_matching_frames.values_list('id', flat=True))
  496 + return frames.filter(id__in=list(set(matching_frames)))
  497 +
  498 +def get_matching_frames(frames, arguments_rules):
  499 + for rules in arguments_rules:
  500 + if not rules['negation']:
  501 + frames = frames.filter(complements__in=matching_complements(rules))
  502 + else:
  503 + frames = frames.exclude(complements__in=matching_complements(rules))
  504 + return frames
  505 +
  506 +def matching_complements(filter_rules):
  507 + complements = Complement.objects
  508 + if filter_rules['role']:
  509 + complements = complements.filter(roles=filter_rules['role'])
  510 + if filter_rules['attribute']:
  511 + complements = complements.filter(roles=filter_rules['attribute'])
  512 + if filter_rules['general_prefs'] or filter_rules['synset_prefs'] or filter_rules['relational_prefs']:
  513 + complements = complements.filter(selective_preference__isnull=False)
  514 + if filter_rules['general_prefs']:
  515 + complements = filter_by_general_prefs(complements, filter_rules['general_prefs'])
  516 + if filter_rules['synset_prefs']:
  517 + complements = filter_by_synset_prefs(complements, filter_rules['synset_prefs'])
  518 + if filter_rules['relational_prefs']:
  519 + complements = filter_by_relational_prefs(complements, filter_rules['relational_prefs'])
  520 + return complements.all()
  521 +
  522 +def filter_by_general_prefs(complements, prefs):
  523 + complements = complements.exclude(selective_preference__generals=None)
  524 + for pref in list(set(prefs)):
  525 + if pref:
  526 + complements = complements.filter(selective_preference__generals=pref)
  527 + return complements
  528 +
  529 +def filter_by_synset_prefs(complements, prefs):
  530 + complements = complements.exclude(selective_preference__synsets=None)
  531 + for pref in list(set(prefs)):
  532 + if pref:
  533 + try:
  534 + pref_parts = pref.split('-')
  535 + base = pref_parts[0]
  536 + sense = pref_parts[1]
  537 + synset = LexicalUnit.objects.get(base=base, sense=sense).synset
  538 + complements = complements.filter(selective_preference__synsets=synset)
  539 + except:
  540 + complements = Complement.objects.none()
  541 + return complements
  542 +
  543 +def filter_by_relational_prefs(complements, prefs):
  544 + complements = complements.exclude(selective_preference__relations=None)
  545 + for pref in prefs:
  546 + if pref['relation'] or pref['role'] or pref['attribute']:
  547 + relational_prefs = RelationalSelectivePreference.objects
  548 + if pref['relation']:
  549 + relational_prefs = relational_prefs.filter(relation=pref['relation'])
  550 + if pref['role'] or pref['attribute']:
  551 + to_complements = Complement.objects
  552 + if pref['role']:
  553 + to_complements = to_complements.filter(roles=pref['role'])
  554 + if pref['attribute']:
  555 + to_complements = to_complements.filter(roles=pref['attribute'])
  556 + relational_prefs = relational_prefs.filter(to__in=to_complements.all()).distinct()
  557 + complements = complements.filter(selective_preference__relations__in=relational_prefs).distinct()
  558 + return complements
  559 +
247 560 \ No newline at end of file
... ...
dictionary/forms.py
1 1 #-*- coding:utf-8 -*-
2 2  
3   -#Copyright (c) 2012, Bartłomiej Nitoń
4   -#All rights reserved.
5   -
6   -#Redistribution and use in source and binary forms, with or without modification, are permitted provided
7   -#that the following conditions are met:
8   -
9   -# Redistributions of source code must retain the above copyright notice, this list of conditions and
10   -# the following disclaimer.
11   -# Redistributions in binary form must reproduce the above copyright notice, this list of conditions
12   -# and the following disclaimer in the documentation and/or other materials provided with the distribution.
13   -
14   -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
15   -# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
16   -# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
17   -# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
18   -# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
19   -# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
20   -# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
21   -# POSSIBILITY OF SUCH DAMAGE.
22   -
23 3 import datetime
24 4  
25 5 from django.contrib.auth.forms import UserCreationForm
... ... @@ -28,6 +8,7 @@ from django.db.models import Q
28 8 from django.forms import *
29 9  
30 10 from dictionary.models import *
  11 +from semantics.models import FrameOpinion
31 12 #Frame, Argument_Model, AttrValueSelectionMode, \
32 13 # AttrValuesSeparator, Atribute_Value, PositionCategory, \
33 14 # Argument, Atribute_Model, ArgRealOpinion, Frame_Characteristic, \
... ... @@ -530,11 +511,6 @@ class MessageForm(ModelForm):
530 511  
531 512  
532 513 ############################ sorting, filtering
533   -
534   -#trzeba dodac jeszcze opcje, ze zawiera tylko normalne hasla
535   -#no i filtrowanie po lematach z wykorzystaniem wyrazen regularnych
536   -# rozbić to wszystko na 3 zakładki Hasło, Schematy, Ramy
537   -# no i oczywiście dodać te pola do filtrowania schematów
538 514  
539 515 class FilterForm(Form):
540 516 # Lemma filters
... ... @@ -571,14 +547,13 @@ class FilterForm(Form):
571 547 required=False)
572 548 has_argument = forms.CharField(label=u'Zawiera typ frazy', required=False)
573 549 has_position = forms.CharField(label=u'Zawiera pozycję', required=False)
574   - frame_opinion = ModelChoiceField(label=u'Opinia o schemacie', queryset=Frame_Opinion_Value.objects.all(),
575   - required=False)
  550 + schema_opinion = ModelChoiceField(label=u'Opinia o schemacie', queryset=Frame_Opinion_Value.objects.all(),
  551 + required=False)
576 552 filter_frames = forms.BooleanField(label=u'Odfiltruj niepasujące schematy', initial=False,
577 553 required=False)
578 554 # Frame filters
579   -# role =
580   -# selective_preferences =
581   -# opinion =
  555 + frame_opinion = ModelChoiceField(label=u'Opinia o ramie', queryset=FrameOpinion.objects.order_by('priority'),
  556 + required=False)
582 557  
583 558 def __init__(self, users, phraseologists, semanticists, vocabularies, statuses, senders,
584 559 lemma='.*', sel_pos=None, contains_phraseology=None,
... ... @@ -586,8 +561,9 @@ class FilterForm(Form):
586 561 sel_vocabulary=None, sel_status=None, sel_schema_type=None,
587 562 sel_reflex=None, sel_negativity=None, sel_predicativity=None,
588 563 sel_aspect=None, sel_has_argument='.*', sel_has_position='.*',
589   - sel_frame_opinion=None, can_confirm_example=False, sel_example_source=None,
590   - sel_approver=None, sel_sender=None, *args, **kwargs):
  564 + sel_schema_opinion=None, can_confirm_example=False, sel_example_source=None,
  565 + sel_approver=None, sel_sender=None,
  566 + sel_frame_opinion=None, *args, **kwargs):
591 567 super(FilterForm, self).__init__(*args, **kwargs)
592 568  
593 569 self.fields['pos'].queryset = POS.objects.exclude(tag='unk')
... ... @@ -612,23 +588,20 @@ class FilterForm(Form):
612 588 self.fields['example_source'].initial = None
613 589 self.fields['approver'].widget = self.fields['approver'].hidden_widget()
614 590 self.fields['approver'].initial = None
615   -# self.fields['has_old_frames_property'].initial = sel_old_property
616 591 self.fields['reflex'].initial = sel_reflex
617 592 self.fields['negativity'].initial = sel_negativity
618 593 self.fields['predicativity'].initial = sel_predicativity
619 594 self.fields['aspect'].initial = sel_aspect
620 595 self.fields['has_argument'].initial = sel_has_argument
621 596 self.fields['has_position'].initial = sel_has_position
622   - #self.fields['has_frame'].initial = sel_has_frame
623   - self.fields['frame_opinion'].initial = sel_frame_opinion
  597 + self.fields['schema_opinion'].initial = sel_schema_opinion
624 598 self.fields['has_message_from'].initial = sel_sender
625 599 self.fields['has_message_from'].queryset = senders
626 600  
627 601 self.fields['schema_type'].initial = sel_schema_type
  602 + self.fields['frame_opinion'].initial = sel_frame_opinion
628 603  
629 604 self.hide_unused_fields()
630   -
631   - #self.fields['has_frame'].widget = self.fields['has_frame'].hidden_widget()
632 605  
633 606 def hide_unused_fields(self):
634 607 for field_name in self.fields:
... ...
dictionary/models.py
1 1 #-*- coding:utf-8 -*-
2 2  
3   -#Copyright (c) 2012, Bartłomiej Nitoń
4   -#All rights reserved.
5   -
6   -#Redistribution and use in source and binary forms, with or without modification, are permitted provided
7   -#that the following conditions are met:
8   -
9   -# Redistributions of source code must retain the above copyright notice, this list of conditions and
10   -# the following disclaimer.
11   -# Redistributions in binary form must reproduce the above copyright notice, this list of conditions
12   -# and the following disclaimer in the documentation and/or other materials provided with the distribution.
13   -
14   -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
15   -# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
16   -# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
17   -# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
18   -# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
19   -# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
20   -# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
21   -# POSSIBILITY OF SUCH DAMAGE.
22   -
23 3 from django.contrib.auth.models import User
24 4 from django.db.models import *
25 5  
26   -from wordnet.models import LexicalUnit
27   -
28 6 class Configuration(Model):
29 7 name = CharField(max_length=16, primary_key=True, unique=True, db_column='nazwa_konfiguracji')
30 8 selected_conf = BooleanField(db_column='wybrana_konfiguracja', default=False)
... ... @@ -766,13 +744,6 @@ class Argument(Model):
766 744 break
767 745 return is_fully_lexicalized
768 746  
769   - class Meta:
770   - permissions = (
771   - ('view_realization', u'Może oglądać realizacje argumentów.'),
772   - ('create_realization', u'Może kreować realizacje argumentów.'),
773   - ('view_arg_stats', u'Może oglądać statystyki argumentów.'),
774   - )
775   -
776 747 def __unicode__(self):
777 748 return '%s' % (self.text_rep)
778 749  
... ... @@ -785,7 +756,21 @@ class Argument(Model):
785 756 for value in attr.values.filter(type__sym_name=u'parameter'):
786 757 if value.parameter.type.realization_only:
787 758 return True
788   - return False
  759 + return False
  760 +
  761 + def main_phrase_type(self):
  762 + category_attrs = self.atributes.filter(type=u'KATEGORIA')
  763 + if not category_attrs.exists() or category_attrs.all()[0].values.count() == 0: # xp bez podtypow
  764 + return self
  765 + else:
  766 + return Argument.objects.get(text_rep=u'%s(%s)' % (self.type, category_attrs.all()[0].selection_mode.name))
  767 +
  768 + class Meta:
  769 + permissions = (
  770 + ('view_realization', u'Może oglądać realizacje argumentów.'),
  771 + ('create_realization', u'Może kreować realizacje argumentów.'),
  772 + ('view_arg_stats', u'Może oglądać statystyki argumentów.'),
  773 + )
789 774  
790 775 def sort_arguments(arguments):
791 776 return sortArguments(arguments)
... ... @@ -1403,12 +1388,9 @@ class Entry(Model):
1403 1388 ('view_semantics', u'Może oglądać semantykę.'),
1404 1389 )
1405 1390  
1406   - def lexical_units(self):
1407   - return LexicalUnit.objects.filter(Q(base = self.name)|Q(base = self.name + u' się'))
1408   -
1409 1391 def actual_frames(self):
1410 1392 frame_ids = []
1411   - lexical_units = self.lexical_units().order_by('sense')
  1393 + lexical_units = self.meanings.order_by('sense')
1412 1394 for lexical_unit in lexical_units:
1413 1395 frame_ids.extend([f.id for f in lexical_unit.actual_frames()])
1414 1396 return get_model('semantics', 'SemanticFrame').objects.filter(id__in=list(set(frame_ids)))
... ...
dictionary/saving.py
... ... @@ -94,7 +94,7 @@ def update_connections(lemma_id, reconnect_operations, user):
94 94  
95 95 def disconnect_all_examples_operations(lemma):
96 96 operations = []
97   - lex_units = lemma.entry_obj.lexical_units().all()
  97 + lex_units = lemma.entry_obj.meanings.all()
98 98 for lu in lex_units:
99 99 lu_examples = LexicalUnitExamples.objects.filter(lexical_unit=lu)
100 100 for lu_ex in lu_examples:
... ... @@ -112,6 +112,6 @@ def disconnect_example_operation(example_dict, example_obj):
112 112 lu = LexicalUnit.objects.get(id=example_dict['lexical_unit'])
113 113 return {'operation': 'remove_example', 'unit': lu.id, 'example': example_obj.id}
114 114  
115   -def reconnect_examples(operations):
116   - update_meanings(operations)
  115 +def reconnect_examples(lemma, operations):
  116 + update_meanings(lemma.id, operations)
117 117  
118 118 \ No newline at end of file
... ...
dictionary/static/css/lemmas_filtering.css 0 → 100644
  1 +hr.filtersSeparator {
  2 + border-top: medium double #333;
  3 +}
  4 +
  5 +hr.argSeparator {
  6 + border-top: 1px dashed #8c8b8b;
  7 +}
  8 +
  9 +hr.alterSeparator {
  10 + border-top: 1px solid #8c8b8b;
  11 +}
... ...
dictionary/static/js/lemmas_filtering.js
... ... @@ -3,15 +3,74 @@ function filter_form_submit() {
3 3 form_data = this_form.serializeArray();
4 4  
5 5 var filter_frames = false;
  6 + var actSemArgument = {};
  7 + var relationalSemPref = {'relation': '',
  8 + 'role': '',
  9 + 'attribute': ''};
  10 + var semArgumentsAlternatives = [];
  11 + var semArguments = [];
6 12  
7 13 form_data = $.map(form_data, function(elem)
8 14 {
9   - if (elem.name != 'filter_frames') return elem;
  15 + if (elem.name != 'filter_frames' && !isPartOfSemArgFilter(elem)) {
  16 + return elem;
  17 + }
10 18 else {
11   - if (elem.name == 'filter_frames') filter_frames = elem.value;
  19 + if(elem.name == 'filter_frames') {
  20 + filter_frames = elem.value;
  21 + }
  22 + else if(elem.name == 'negation') {
  23 + if(!jQuery.isEmptyObject(actSemArgument)) {
  24 + semArguments.push(actSemArgument);
  25 + }
  26 + actSemArgument = {'negation': elem.value,
  27 + 'role': '',
  28 + 'attribute': '',
  29 + 'general_prefs': [],
  30 + 'synset_prefs': [],
  31 + 'relational_prefs': []}
  32 + }
  33 + else if(elem.name == 'or') {
  34 + if(!jQuery.isEmptyObject(actSemArgument)) {
  35 + semArguments.push(actSemArgument);
  36 + actSemArgument = {};
  37 + }
  38 + semArgumentsAlternatives.push(semArguments);
  39 + semArguments = [];
  40 + }
  41 + else if(elem.name == 'role' || elem.name == 'attribute') {
  42 + actSemArgument[elem.name] = elem.value;
  43 + }
  44 + else if(elem.name == 'general_pref' || elem.name == 'synset_pref') {
  45 + actSemArgument[elem.name+'s'].push(elem.value);
  46 + }
  47 + else if(elem.name.startsWith('relational_pref')) {
  48 + if(elem.name.endsWith('relation')) {
  49 + relationalSemPref = {'relation': elem.value,
  50 + 'role': '',
  51 + 'attribute': ''};
  52 + }
  53 + else if(elem.name.endsWith('role')) {
  54 + relationalSemPref['role'] = elem.value;
  55 + }
  56 + else if(elem.name.endsWith('attribute')) {
  57 + relationalSemPref['attribute'] = elem.value;
  58 + actSemArgument['relational_prefs'].push(relationalSemPref);
  59 + relationalSemPref = {};
  60 + }
  61 + }
12 62 }
13 63 });
  64 + if(!jQuery.isEmptyObject(actSemArgument)) {
  65 + semArguments.push(actSemArgument);
  66 + }
  67 + if(semArguments.length > 0) {
  68 + semArgumentsAlternatives.push(semArguments);
  69 + }
  70 +
  71 +
14 72 form_data.push({name: 'filter_frames', value: filter_frames});
  73 + form_data.push({name: 'sem_arguments', value: semArgumentsAlternatives});
15 74  
16 75 act_lemma_id = window.prev_lemma_id;
17 76 if(window.activeLemmaPanel != 'preview_lemma')
... ... @@ -82,3 +141,51 @@ function filter_form_submit() {
82 141 });
83 142 return false;
84 143 }
  144 +
  145 +function isPartOfSemArgFilter(field) {
  146 + if(field.name == 'or' || field.name == 'negation' ||
  147 + field.name == 'role' || field.name == 'attribute' ||
  148 + field.name == 'general_pref' || field.name == 'synset_pref' ||
  149 + field.name.startsWith('relational_pref')) {
  150 + return true;
  151 + }
  152 + return false;
  153 +}
  154 +
  155 +function addSemArgFilter(buttonElem) {
  156 + var semArgsElem = $(buttonElem).parent().parent();
  157 + semArgsElem.append('<p id="sem-argument"></p>');
  158 + semArgsElem.children().last().load(ajax_sem_arg_form);
  159 +}
  160 +
  161 +function addArgAlternative(buttonElem) {
  162 + var semArgsElem = $(buttonElem).parent().parent();
  163 + semArgsElem.append('<div><hr class="alterSeparator"><input type="hidden" name="or" value="or"><strong>lub</strong> <button type="button" onclick="removeAlternative(this)">Usuń</button></div>');
  164 +}
  165 +
  166 +function removeAlternative(buttonElem) {
  167 + $(buttonElem).parent().remove();
  168 +}
  169 +
  170 +function removeSemArgFilter(buttonElem) {
  171 + $(buttonElem).parent().parent().remove();
  172 +}
  173 +
  174 +function addSelectivePreferenceFilter(buttonElem) {
  175 + var selPrefsElem = $(buttonElem).parent().parent();
  176 + var selPrefType = selPrefsElem.find('#id_preference_type').first().val();
  177 + selPrefsElem.append('<p id="sel-preference"></p>');
  178 + if(selPrefType === 'general') {
  179 + selPrefsElem.children().last().load(ajax_general_preference_form);
  180 + }
  181 + else if(selPrefType === 'synset') {
  182 + selPrefsElem.children().last().load(ajax_synset_preference_form);
  183 + }
  184 + else if(selPrefType === 'relation') {
  185 + selPrefsElem.children().last().load(ajax_relational_preference_form);
  186 + }
  187 +}
  188 +
  189 +function removeSelPreferenceFilter(buttonElem) {
  190 + $(buttonElem).parent().remove();
  191 +}
... ...
dictionary/teixml.py
... ... @@ -437,7 +437,7 @@ def write_example(parent_elem, lemma, example):
437 437  
438 438 def get_and_write_meaning_link(parent_elem, entry, example):
439 439 try:
440   - entry_lex_units = entry.lexical_units()
  440 + entry_lex_units = entry.meanings.all()
441 441 lex_unit_example = LexicalUnitExamples.objects.get(example=example,
442 442 lexical_unit__in=entry_lex_units)
443 443 meaning = lex_unit_example.lexical_unit
... ... @@ -674,8 +674,7 @@ def write_meanings_layer(parent_elem, lemma):
674 674  
675 675 def write_meanings(parent_elem, lemma):
676 676 entry = lemma.entry_obj
677   - lex_units = entry.lexical_units()
678   - for lex_unit in lex_units.all():
  677 + for lex_unit in entry.meanings.all():
679 678 write_meaning(parent_elem, entry, lex_unit)
680 679  
681 680 def write_meaning(parent_elem, entry, lex_unit):
... ...
dictionary/templates/filter_form.html
... ... @@ -47,6 +47,7 @@ $(function(){
47 47 <ul>
48 48 <li><a href="#lemma-filters">Hasło</a></li>
49 49 <li><a href="#schema-filters">Schematy</a></li>
  50 + <li><a href="#frame-filters">Ramy</a></li>
50 51 </ul>
51 52 <div id="lemma-filters">
52 53 {% if not form.lemma.is_hidden %}
... ... @@ -68,7 +69,7 @@ $(function(){
68 69 </p>
69 70 {% endif %}
70 71 {% if not form.owner.is_hidden or not form.phraseologist.is_hidden or not form.semanticist.is_hidden %}
71   - <hr>
  72 + <hr class="filtersSeparator">
72 73 {% endif %}
73 74 {% if not form.owner.is_hidden %}
74 75 <p class="fieldWrapper">
... ... @@ -89,7 +90,7 @@ $(function(){
89 90 </p>
90 91 {% endif %}
91 92 {% if not form.vocabulary.is_hidden or not form.status.is_hidden or not form.has_message_from.is_hidden %}
92   - <hr>
  93 + <hr class="filtersSeparator">
93 94 {% endif %}
94 95 {% if not form.vocabulary.is_hidden %}
95 96 <p class="fieldWrapper">
... ... @@ -110,7 +111,7 @@ $(function(){
110 111 </p>
111 112 {% endif %}
112 113 {% if not form.example_source.is_hidden or not form.approver.is_hidden %}
113   - <hr>
  114 + <hr class="filtersSeparator">
114 115 {% endif %}
115 116 {% if not form.example_source.is_hidden %}
116 117 <p class="fieldWrapper">
... ... @@ -126,10 +127,10 @@ $(function(){
126 127 {% endif %}
127 128 </div>
128 129 <div id="schema-filters">
129   - {% if not form.frame_opinion.is_hidden %}
  130 + {% if not form.schema_opinion.is_hidden %}
130 131 <p class="fieldWrapper">
131   - {{ form.frame_opinion.errors }}
132   - {{ form.frame_opinion.label_tag }}: {{ form.frame_opinion }}
  132 + {{ form.schema_opinion.errors }}
  133 + {{ form.schema_opinion.label_tag }}: {{ form.schema_opinion }}
133 134 </p>
134 135 {% endif %}
135 136 {% if not form.schema_type.is_hidden %}
... ... @@ -181,6 +182,26 @@ $(function(){
181 182 </p>
182 183 {% endif %}
183 184 </div>
  185 + <div id="frame-filters">
  186 + {% if not form.frame_opinion.is_hidden %}
  187 + <p class="fieldWrapper">
  188 + {{ form.frame_opinion.errors }}
  189 + {{ form.frame_opinion.label_tag }}: {{ form.frame_opinion }}
  190 + </p>
  191 + {% endif %}
  192 + <hr class="filtersSeparator">
  193 + <div id="sem-arguments">
  194 + <p>Argumenty semantyczne:
  195 + <button type="button" onclick="addSemArgFilter(this)">Dodaj</button>
  196 + <button type="button" onclick="addArgAlternative(this)">Lub</button>
  197 + </p>
  198 + {% for arg_form in sem_args_forms %}
  199 + <div id="sem-argument">
  200 + {% include 'sem_arg_form.html' with form=arg_form only %}
  201 + </div>
  202 + {% endfor %}
  203 + </div>
  204 + </div>
184 205 </div>
185 206 {% for hidden in form.hidden_fields %}
186 207 {{ hidden }}
... ...
dictionary/templates/lemma_view.html
... ... @@ -9,6 +9,7 @@
9 9 <link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}css/examples_table.css"/>
10 10 <link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}css/aspect_relations_table.css"/>
11 11 <link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}css/filter_frames_menu.css"/>
  12 + <link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}css/lemmas_filtering.css"/>
12 13 <script type="text/javascript" src="{{ STATIC_URL }}js/lib/grid.locale-pl.js"></script>
13 14 <script type="text/javascript">
14 15 jQuery.jgrid.no_legacy_api = true;
... ... @@ -62,9 +63,7 @@
62 63 <ul>
63 64 <li id="refresh_frames"><a href="#new_frames">{% trans "Schematy" %} [<span id="new-frames-count"></span>]</a></li>
64 65  
65   - {% if perms.dictionary.view_semantics %}
66   - <li><a href="#semantics">{% trans "Semantyka" %} [<span id="semantic-frames-count"></span>]</a></li>
67   - {% endif %}
  66 + <li><a href="#semantics">{% trans "Semantyka" %} [<span id="semantic-frames-count"></span>]</a></li>
68 67 <!-- li><a href="#old_frames">{% trans "Stare schematy" %}</a></li -->
69 68 {% if perms.dictionary.add_notes %}
70 69 <li><a href="#notes">{% trans "Notatki" %} [<span id="lemma-notes-count"></span>]</a></li>
... ... @@ -81,10 +80,8 @@
81 80 </ul>
82 81 <div id="new_frames">
83 82 </div>
84   - {% if perms.dictionary.view_semantics %}
85   - <div id="semantics">
86   - </div>
87   - {% endif %}
  83 + <div id="semantics">
  84 + </div>
88 85 {% if perms.dictionary.add_notes %}
89 86 <div id="notes">
90 87 </div>
... ...
dictionary/views.py
1 1 #-*- coding:utf-8 -*-
2 2  
3   -#Copyright (c) 2012, Bartłomiej Nitoń
4   -#All rights reserved.
5   -
6   -#Redistribution and use in source and binary forms, with or without modification, are permitted provided
7   -#that the following conditions are met:
8   -
9   -# Redistributions of source code must retain the above copyright notice, this list of conditions and
10   -# the following disclaimer.
11   -# Redistributions in binary form must reproduce the above copyright notice, this list of conditions
12   -# and the following disclaimer in the documentation and/or other materials provided with the distribution.
13   -
14   -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
15   -# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
16   -# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
17   -# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
18   -# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
19   -# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
20   -# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
21   -# POSSIBILITY OF SUCH DAMAGE.
22   -
23 3 import datetime
24 4 import os
25 5  
... ... @@ -212,6 +192,11 @@ def lemma_view(request):
212 192 'ajax_save_columns': reverse('save_columns'),
213 193 'ajax_save_columns': reverse('save_columns'),
214 194 'ajax_get_sort_order': reverse('get_sort_order'),
  195 + 'ajax_sem_arg_form': reverse('sem_arg_form'),
  196 + 'ajax_general_preference_form': reverse('general_preference_form'),
  197 + 'ajax_synset_preference_form': reverse('synset_preference_form'),
  198 + 'ajax_relational_preference_form': reverse('relational_preference_form'),
  199 + 'ajax_synset_context_lookup': reverse('synset_context_lookup'),
215 200  
216 201 # czasowniki podobne
217 202 'ajax_similar_lemmas_old_form_submit': reverse('similar_lemmas_old_form_submit'),
... ...
semantics/change_log.py
... ... @@ -179,7 +179,7 @@ def backup_lemma_and_get_frames(lemma):
179 179  
180 180 def backup_lemma(lemma_id):
181 181 lemma = Lemma.objects.get(id=lemma_id, old=False)
182   - lexical_units = LexicalUnit.objects.filter(Q(base = lemma.entry)|Q(base = lemma.entry + u' się')).order_by('sense')
  182 + lexical_units = lemma.entry_obj.meanings.order_by('sense')
183 183  
184 184 frame_ids = []
185 185 for lexical_unit in lexical_units:
... ...
semantics/forms.py 0 → 100644
  1 +#-*- coding:utf-8 -*-
  2 +
  3 +from django.forms import CharField, ChoiceField, Form, ModelChoiceField
  4 +
  5 +from semantics.models import GeneralSelectivePreference, SelectivePreferenceRelations, SemanticRole
  6 +
  7 +class RoleForm(Form):
  8 + negation = ChoiceField(choices=[('', u'---'), ('!', u'!')], required=False,
  9 + label=u'')
  10 + role = ModelChoiceField(label=u'Rola', required=False,
  11 + queryset=SemanticRole.objects.filter(gradient__isnull=True))
  12 + attribute = ModelChoiceField(label=u'Atrybut', required=False,
  13 + queryset=SemanticRole.objects.filter(gradient__isnull=False))
  14 + preference_type = ChoiceField(choices=[('general', u'Predefiniowana'), ('synset', u'Słowosieć'), ('relation', u'Relacja')],
  15 + label=u'Preferencje selekcyjne', required=False)
  16 + preferences = []
  17 +
  18 + def __init__(self, negation=None, sel_role=None, sel_attribute=None,
  19 + sel_preferences=[],
  20 + *args, **kwargs):
  21 + super(RoleForm, self).__init__(*args, **kwargs)
  22 + self.fields['negation'].initial = negation
  23 + self.fields['role'].initial = sel_role
  24 + self.fields['attribute'].initial = sel_attribute
  25 + self.preferences = sel_preferences
  26 +
  27 +class GeneralSelPrefForm(Form):
  28 + general_pref = ModelChoiceField(label=u'Predefiniowana',
  29 + queryset=GeneralSelectivePreference.objects.order_by('name'), required=False)
  30 +
  31 + def pref_type(self):
  32 + return 'general'
  33 +
  34 + def __init__(self, sel_preference=None, *args, **kwargs):
  35 + super(GeneralSelPrefForm, self).__init__(*args, **kwargs)
  36 + self.fields['general_pref'].initial = sel_preference
  37 +
  38 +class SynsetSelPrefForm(Form):
  39 + synset_pref = CharField(label=u'Słowosieć', required=False)
  40 +
  41 + def pref_type(self):
  42 + return 'synset'
  43 +
  44 + def __init__(self, sel_preference=None, *args, **kwargs):
  45 + super(SynsetSelPrefForm, self).__init__(*args, **kwargs)
  46 + self.fields['synset_pref'].initial = sel_preference
  47 +
  48 +class RelationalSelPrefForm(Form):
  49 + relational_pref_relation = ModelChoiceField(label=u'Relacja',
  50 + queryset=SelectivePreferenceRelations.objects.all(), required=False)
  51 + relational_pref_role = ModelChoiceField(label=u'Rola', required=False,
  52 + queryset=SemanticRole.objects.filter(gradient__isnull=True))
  53 + relational_pref_attribute = ModelChoiceField(label=u'Atrybut', required=False,
  54 + queryset=SemanticRole.objects.filter(gradient__isnull=False))
  55 +
  56 + def pref_type(self):
  57 + return 'relational'
  58 +
  59 + def __init__(self, sel_relation=None, sel_role=None, sel_attribute=None, *args, **kwargs):
  60 + super(RelationalSelPrefForm, self).__init__(*args, **kwargs)
  61 + self.fields['relational_pref_relation'].initial = sel_relation
  62 + self.fields['relational_pref_role'].initial = sel_role
  63 + self.fields['relational_pref_attribute'].initial = sel_attribute
  64 +
0 65 \ No newline at end of file
... ...
semantics/saving.py
... ... @@ -2,7 +2,7 @@
2 2  
3 3 from django.db.models import Min
4 4  
5   -from dictionary.models import Argument, Frame, NKJP_Example, Position
  5 +from dictionary.models import Argument, Frame, Lemma, NKJP_Example, Position
6 6 from semantics.change_log import store_old_versions
7 7 from semantics.models import Complement, GeneralSelectivePreference, FramePosition,\
8 8 LexicalUnitExamples, RelationalSelectivePreference, \
... ... @@ -278,8 +278,9 @@ def remove_preference(frame_id, complement_id, preference):
278 278 complement.selective_preference.relations.remove(r)
279 279  
280 280  
281   -def update_meanings(operations):
  281 +def update_meanings(lemma_id, operations):
282 282 translation = {}
  283 + entry = Lemma.objects.get(id=lemma_id).entry_obj
283 284 for operation in operations:
284 285 if operation['operation'] == "set_glossa":
285 286 if int(operation['unit']) in translation:
... ... @@ -300,7 +301,7 @@ def update_meanings(operations):
300 301 unit = int(operation['unit'])
301 302 remove_example(unit, operation['example'])
302 303 elif operation['operation'] == "add_unit":
303   - translation[operation['unit']['id']] = add_unit(operation['unit'])
  304 + translation[operation['unit']['id']] = add_unit(entry, operation['unit'])
304 305 elif operation['operation'] == "remove_unit":
305 306 luid = int(operation['luid'])
306 307 if luid in translation:
... ... @@ -327,11 +328,11 @@ def remove_example(unit_id, example_id):
327 328 lue = LexicalUnitExamples.objects.get(example=nkjp_example, lexical_unit=unit)
328 329 lue.delete()
329 330  
330   -def add_unit(unit): # returns new id
  331 +def add_unit(entry, unit): # returns new id
331 332  
332 333 s1 = Synset(id=(min(Synset.objects.all().aggregate(Min('id'))['id__min'], 0) - 1))
333 334 s1.save()
334   - lu = LexicalUnit(base=unit['base'], sense=unit['sense'], pos=unit['pos'], glossa=unit['glossa'], luid=-1, synset=s1)
  335 + lu = LexicalUnit(entry=entry, base=unit['base'], sense=unit['sense'], pos=unit['pos'], glossa=unit['glossa'], luid=-1, synset=s1)
335 336 lu.save()
336 337  
337 338  
... ...
semantics/sem_urls.py
... ... @@ -19,5 +19,10 @@ SEMANTIC_PATTERNS = patterns(&#39;semantics.views&#39;,
19 19 url(r'^ajax/update_meanings/$', 'ajax_update_meanings'),
20 20 url(r'^ajax/modify_frames/$', 'ajax_modify_frames'),
21 21 url(r'^ajax/plWN_context_lookup/$', 'ajax_plWN_context_lookup'),
  22 + url(r'^ajax/synset_context_lookup/$', 'synset_context_lookup'),
22 23 url(r'^ajax/validate_semantics/$', 'validate_semantics'),
  24 + url(r'^ajax/sem_arg_form/$', 'sem_arg_form'),
  25 + url(r'^ajax/general_preference_form/$', 'general_preference_form'),
  26 + url(r'^ajax/synset_preference_form/$', 'synset_preference_form'),
  27 + url(r'^ajax/relational_preference_form/$', 'relational_preference_form'),
23 28 )
... ...
semantics/templates/general_preference_form.html 0 → 100644
  1 +<p class="fieldWrapper">
  2 + {{ form.general_pref.errors }} + {{ form.general_pref.label_tag }}: {{ form.general_pref }}
  3 + <button type="button" onclick="removeSelPreferenceFilter(this)">Usuń</button>
  4 +</p>
0 5 \ No newline at end of file
... ...
semantics/templates/relational_preference_form.html 0 → 100644
  1 +<p class="fieldWrapper">
  2 + {{ form.relational_pref_relation.errors }} + {{ form.relational_pref_relation.label_tag }}: {{ form.relational_pref_relation }}
  3 + {{ form.relational_pref_role.errors }} Do: {{ form.relational_pref_role }}
  4 + {{ form.relational_pref_attribute.errors }} {{ form.relational_pref_attribute }}
  5 + <button type="button" onclick="removeSelPreferenceFilter(this)">Usuń</button>
  6 +</p>
0 7 \ No newline at end of file
... ...
semantics/templates/sem_arg_form.html 0 → 100644
  1 +{% if form == 'or' %}
  2 + <div>
  3 + <hr class="alterSeparator">
  4 + <input type="hidden" name="or" value="or"><strong>lub</strong>
  5 + <button type="button" onclick="removeAlternative(this)">Usuń</button>
  6 + </div>
  7 +{% else %}
  8 + <hr class="argSeparator">
  9 + <p class="fieldWrapper">
  10 + {{ form.negation.errors }} {{ form.negation }}
  11 + {{ form.role.errors }} {{ form.role.label_tag }}: {{ form.role }}
  12 + {{ form.attribute.errors }} {{ form.attribute.label_tag }}: {{ form.attribute }}
  13 + <button type="button" onclick="removeSemArgFilter(this)">Usuń</button>
  14 + </p>
  15 + <div id="selectional-preferences">
  16 + <p>{{ form.preference_type.errors }} {{ form.preference_type.label_tag }}: {{ form.preference_type }} <button type="button" onclick="addSelectivePreferenceFilter(this)">Dodaj</button></p>
  17 + {% for pref_form in form.preferences %}
  18 + <p id="sel-preference">
  19 + {% if pref_form.pref_type == 'general' %}
  20 + {% include 'general_preference_form.html' with form=pref_form only %}
  21 + {% elif pref_form.pref_type == 'relational' %}
  22 + {% include 'relational_preference_form.html' with form=pref_form only %}
  23 + {% elif pref_form.pref_type == 'synset' %}
  24 + {% include 'synset_preference_form.html' with form=pref_form only %}
  25 + {% endif %}
  26 + </p>
  27 + {% endfor %}
  28 + </div>
  29 +{% endif %}
0 30 \ No newline at end of file
... ...
semantics/templates/synset_preference_form.html 0 → 100644
  1 +<p class="fieldWrapper">
  2 + {{ form.synset_pref.errors }} + {{ form.synset_pref.label_tag }}: {{ form.synset_pref }}
  3 + <button type="button" onclick="removeSelPreferenceFilter(this)">Usuń</button>
  4 + <script type="text/javascript">
  5 + $(function(){
  6 + $('input#id_synset_pref').autocomplete({
  7 + select: function(event, ui){
  8 + },
  9 + source: function(req, add){
  10 + $.getJSON(ajax_synset_context_lookup, req, function(data) {
  11 + var suggestions = [];
  12 + $.each(data['result'], function(i, val){
  13 + suggestions.push(val);
  14 + });
  15 + add(suggestions);
  16 + });
  17 + },
  18 + });
  19 + });
  20 + </script>
  21 +</p>
0 22 \ No newline at end of file
... ...
semantics/validation.py
... ... @@ -2,7 +2,7 @@
2 2  
3 3 from django.db.models import Max
4 4  
5   -from dictionary.models import Lemma, reflex_phrase_types, Argument_Model
  5 +from dictionary.models import Lemma, reflex_phrase_types
6 6 from semantics.models import LexicalUnitExamples
7 7 from semantics.utils import get_structural_matching_frame
8 8  
... ... @@ -182,7 +182,7 @@ def schema_used(schema, frames):
182 182 def validate_lexical_units(lemma_id):
183 183 error_msg = ''
184 184 lemma = Lemma.objects.get(id=lemma_id, old=False)
185   - lexical_units = lemma.entry_obj.lexical_units()
  185 + lexical_units = lemma.entry_obj.meanings
186 186 for lex_unit in lexical_units.all():
187 187 if not examples_reflex_agreed(lex_unit):
188 188 error_msg = u'Semantyka: Znaczenie %s ma podpięte przykłady o niezgodnej zwrotności.' % unicode(lex_unit)
... ...
semantics/views.py
... ... @@ -15,6 +15,7 @@ from django.core.urlresolvers import reverse
15 15 from django.db.models import Q
16 16  
17 17 from common.decorators import render, ajax
  18 +from semantics.forms import GeneralSelPrefForm, RelationalSelPrefForm, RoleForm, SynsetSelPrefForm
18 19 from semantics.saving import modify_frames, update_meanings
19 20 from semantics.validation import validate_schemas, validate_frames, validate_lexical_units
20 21  
... ... @@ -79,7 +80,7 @@ def create_frames_context(lemma_id):
79 80 lemma = Lemma.objects.get(id=lemma_id)
80 81  
81 82 #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')
82   - lexical_units = LexicalUnit.objects.filter(Q(base = lemma.entry)|Q(base = lemma.entry + u' się')).order_by('sense')
  83 + lexical_units = lemma.entry_obj.meanings.order_by('sense')
83 84  
84 85 alternations = {}
85 86 frames_dict = {}
... ... @@ -216,7 +217,7 @@ def ajax_units(request, lemma_id):
216 217  
217 218 def create_units_context(lemma_id):
218 219 lemma = Lemma.objects.get(id=lemma_id)
219   - lexical_units = LexicalUnit.objects.filter(Q(base = lemma.entry, pos="czasownik")|Q(base = lemma.entry + u' się', pos="czasownik")).order_by('base', 'sense')
  220 + lexical_units = lemma.entry_obj.meanings.order_by('base', 'sense')
220 221 # 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')
221 222  
222 223 context = {
... ... @@ -354,7 +355,7 @@ def ajax_schemas(request, lemma_id):
354 355 schemas_by_characteristic[characteristic_id] = []
355 356 schemas_by_characteristic[characteristic_id].append(schema)
356 357  
357   - lexical_units = LexicalUnit.objects.filter(Q(base=lemma.entry) | Q(base=lemma.entry+u' się'))
  358 + lexical_units = lemma.entry_obj.meanings.all()
358 359  
359 360 schemas_display = []
360 361 schema_unit_rank = {}
... ... @@ -414,7 +415,7 @@ def ajax_examples(request, lemma_id):
414 415  
415 416 lemma = Lemma.objects.get(id=lemma_id).entry_obj.actual_lemma()
416 417 nkjp_examples = lemma.nkjp_examples.all()
417   - lexical_units = LexicalUnit.objects.filter(Q(base = lemma.entry)|Q(base = lemma.entry + u' się'))
  418 + lexical_units = lemma.entry_obj.meanings.all()
418 419  
419 420 lexical_units_ids = [lu.id for lu in lexical_units]
420 421  
... ... @@ -488,7 +489,7 @@ def ajax_create_complement(request, lemma_id, frame, roles):
488 489  
489 490 @ajax(method='post', encode_result=True)
490 491 def ajax_update_meanings(request, operations, lemma_id):
491   - update_meanings(operations)
  492 + update_meanings(lemma_id, operations)
492 493 units_context = create_units_context(lemma_id)
493 494 return units_context
494 495  
... ... @@ -519,6 +520,19 @@ def get_ordered_lexical_units_bases(lexical_units_query):
519 520 last_unit_base = lexical_unit.base
520 521 return lexical_unit_bases
521 522  
  523 +@ajax(method='get', encode_result=True)
  524 +def synset_context_lookup(request, term):
  525 + results = []
  526 + term = unicode(term)
  527 + if len(term) > 0:
  528 + obj_results = LexicalUnit.objects.filter(base__startswith=term)
  529 + results = get_ordered_lexical_units(obj_results)
  530 + return {'result': results}
  531 +
  532 +def get_ordered_lexical_units(lexical_units_query):
  533 + ordered_lexical_units = lexical_units_query.order_by('base', 'sense')
  534 + return [unicode(lu) for lu in ordered_lexical_units]
  535 +
522 536 @ajax(method='get')
523 537 def validate_semantics(request, lemma_id, new_status_id):
524 538 error_msg = ''
... ... @@ -536,3 +550,27 @@ def validate_semantics(request, lemma_id, new_status_id):
536 550 if not error_msg:
537 551 error_msg = validate_schemas(lemma_id)
538 552 return {'error_message': error_msg}
  553 +
  554 +@render('sem_arg_form.html')
  555 +@ajax(method='get', encode_result=False)
  556 +def sem_arg_form(request):
  557 + form = RoleForm()
  558 + return {'form': form}
  559 +
  560 +@render('general_preference_form.html')
  561 +@ajax(method='get', encode_result=False)
  562 +def general_preference_form(request):
  563 + form = GeneralSelPrefForm()
  564 + return {'form': form}
  565 +
  566 +@render('synset_preference_form.html')
  567 +@ajax(method='get', encode_result=False)
  568 +def synset_preference_form(request):
  569 + form = SynsetSelPrefForm()
  570 + return {'form': form}
  571 +
  572 +@render('relational_preference_form.html')
  573 +@ajax(method='get', encode_result=False)
  574 +def relational_preference_form(request):
  575 + form = RelationalSelPrefForm()
  576 + return {'form': form}
... ...
static/js/script.js
... ... @@ -202,6 +202,7 @@ function resetForm($form) {
202 202 $form.find('input:text, input:password, input:file, select, textarea').val('');
203 203 $form.find('input:radio, input:checkbox')
204 204 .removeAttr('checked').removeAttr('selected');
  205 + $form.find('#sem-arguments').remove();
205 206 }
206 207  
207 208 // funkcja konwertujaca kody html znakow do znakow
... ...
wordnet/models.py
... ... @@ -33,6 +33,8 @@ class LexicalUnit(models.Model):
33 33 definition = models.TextField(default="")
34 34 # glossa
35 35 glossa = models.TextField(default="")
  36 + # haslo w Walentym
  37 + entry = models.ForeignKey('dictionary.Entry', null=True, related_name='meanings')
36 38  
37 39 def __unicode__(self):
38 40 return u'%s-%s' % (self.base, self.sense)
... ...