# HG changeset patch # User verrierj # Date 1323189935 -3600 # Node ID c0c1617367941214e548658b3e5c6120d7a76008 # Parent e00779f0dcba793e2a8bfe355b83cdfbb563c272 Projects can be shared with users and groups. Does not work with contents yet, still some bugs in templates diff -r e00779f0dcba -r c0c161736794 src/ldt/ldt/ldt_utils/forms.py --- a/src/ldt/ldt/ldt_utils/forms.py Mon Dec 05 14:25:21 2011 +0100 +++ b/src/ldt/ldt/ldt_utils/forms.py Tue Dec 06 17:45:35 2011 +0100 @@ -2,26 +2,64 @@ from django.utils.translation import ugettext_lazy as _ from django.contrib.auth.models import User, Group from django.forms.widgets import MultipleHiddenInput -from django.contrib.admin.widgets import FilteredSelectMultiple from ldt.forms import widgets as ldt_widgets from models import Project, Content, Media from utils import generate_uuid +# This class should be moved somewhere else +class LazyMultipleChoiceField(forms.MultipleChoiceField): + + # Should do some checking here + def validate(self, value): + pass + +class ShareForm(forms.ModelForm): + read_list = LazyMultipleChoiceField(required=False, widget=MultipleHiddenInput()) + write_list = LazyMultipleChoiceField(required=False, widget=MultipleHiddenInput()) + + def clean(self): + read_list = self.data.getlist("read_list") + write_list = self.data.getlist("write_list") + + elems = read_list + write_list + users = [e.split('-')[0] for e in elems if e.split('-')[1] == 'user' ] + groups = [e.split('-')[0] for e in elems if e.split('-')[1] == 'group' ] + + users = User.objects.filter(id__in=users) + groups = Group.objects.filter(id__in=groups) + + def create_real_lists(list, users, groups): + new_list = [] + for e in list: + id, cls_name = e.split('-') + if cls_name == 'user': + new_list.append(users.get(id=id)) + elif cls_name == 'group': + new_list.append(groups.get(id=id)) + return new_list + + new_read_list = create_real_lists(read_list, users, groups) + new_write_list = create_real_lists(write_list, users, groups) + + self.cleaned_data["read_list"] = new_read_list + self.cleaned_data["write_list"] = new_write_list + return self.cleaned_data + class LdtImportForm(forms.Form): importFile = forms.FileField() videoPath = forms.CharField(required=False) flatten = forms.BooleanField(required=False, initial=True) -class LdtAddForm(forms.ModelForm): +class LdtAddForm(ShareForm): title = forms.CharField(required=True) - contents = forms.ModelMultipleChoiceField(Content.objects.all()) #@UndefinedVariable + #contents = forms.ModelMultipleChoiceField(Content.objects.all()) description = forms.CharField(widget=forms.Textarea, required=False) - groups = forms.ModelMultipleChoiceField(Group.objects.all(), required=False) - # owner = forms.ModelChoiceField(Author.objects.all()) + + # remove contents from exclude list class Meta: model = Project - exclude = ("ldt_id", "ldt", "created_by", "changed_by", "creation_date", "modification_date", "state", "owner") + exclude = ("ldt_id", "ldt", "created_by", "changed_by", "creation_date", "modification_date", "state", "owner", "contents") class PermissionForm(forms.Form): share = forms.BooleanField(required=False, widget=forms.CheckboxInput(attrs={'class':'checkbox_group'})) @@ -32,14 +70,18 @@ contents = forms.ModelMultipleChoiceField(Content.objects.all()) #@UndefinedVariable index_projects = forms.BooleanField(required=False, initial=False) -class SearchForm(forms.Form): +class SearchForm(forms.ModelForm): search = forms.CharField(label=_("Search")) field = forms.ChoiceField([(u"all", _("all")), (u"title", _("title")), (u"abstract", _("resume")), (u"tags", _("tags"))], label=_("Fields")) ldt_pres = forms.BooleanField(required=False, initial=True, label=_("Display the results in Lignes De Temps")) -class AddProjectForm (forms.Form): +class AddProjectForm (ShareForm): title = forms.CharField(widget=forms.TextInput(attrs={'class':'inputbox required'})) description = forms.CharField(widget=forms.Textarea, required=False) + + class Meta: + model = Project + exclude = ("ldt_id", "ldt", "created_by", "changed_by", "creation_date", "modification_date", "state", "owner", "contents") class CopyProjectForm (forms.Form): title = forms.CharField() diff -r e00779f0dcba -r c0c161736794 src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/create_group.html --- a/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/create_group.html Mon Dec 05 14:25:21 2011 +0100 +++ b/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/create_group.html Tue Dec 06 17:45:35 2011 +0100 @@ -7,7 +7,8 @@ {% block js_import %} {{ block.super }} - + + {{ content_form.media.js }} {% endblock %} @@ -47,50 +48,8 @@ {{ block.super }} @@ -175,15 +89,15 @@
loader


- {% trans "select all" %} + {% trans "select all" %}
-
- +
+
@@ -196,9 +110,9 @@ {% endfor %}
- {% trans "remove all" %} - | {% trans "is admin" %} - | {% trans "is not admin" %} + {% trans "remove all" %} + | {% trans "is admin" %} + | {% trans "is not admin" %}
diff -r e00779f0dcba -r c0c161736794 src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/create_ldt.html --- a/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/create_ldt.html Mon Dec 05 14:25:21 2011 +0100 +++ b/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/create_ldt.html Tue Dec 06 17:45:35 2011 +0100 @@ -5,7 +5,9 @@ {% block js_import %} {{ block.super }} - + + + {{ content_form.media.js }} {% endblock %} @@ -14,29 +16,16 @@ {{ content_form.media.css }} - - + {% endblock %} {% block js_declaration %} {{ block.super }} @@ -68,11 +55,10 @@ theme_advanced_buttons3 : "", theme_advanced_toolbar_location : "top", theme_advanced_toolbar_align : "left", - width: "665", - height: "150" + width: "300", + height: "150" }); - {% endblock %} @@ -90,38 +76,7 @@ {% endfor %} {{form.description}} - -
- - -
-
- - - - - - - - - {% for content in contents %} - - - - - {% endfor %} - -
- {% if not ldt_id %} - {% if contents|length > 1 %} - - {% endif %} - {% endif %} - {% trans "name" %}
{{ content.title }}
-
-
-
- + {% include "ldt/ldt_utils/partial/permissions.html" %}
diff -r e00779f0dcba -r c0c161736794 src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/partial/permissions.html --- a/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/partial/permissions.html Mon Dec 05 14:25:21 2011 +0100 +++ b/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/partial/permissions.html Tue Dec 06 17:45:35 2011 +0100 @@ -1,99 +1,77 @@ {% load i18n %} + + + +
+
+ {% trans "User list" %}
+
loader
+


+ + +
-
- +
+
+ +
-
-
- - {{ management_form }} - - - - - - - - - - {% for form, group in group_form %} - - - - - {{ form.perms }} - {{ form.group }} - - {% endfor %} - - -
- {% if groups|length > 1 %} - - {% endif %} - {% trans "nom" %}{% trans "Permissions" %}
{{ form.share }}{{ group.name }} - {% trans "perm.read" %} - {% trans "perm.write" %} -
-
-
-
+
+
+ {% trans "Members list" %} +
+ + +
+ +
+
+ +
+
+ diff -r e00779f0dcba -r c0c161736794 src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/partial/sharewith.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/partial/sharewith.html Tue Dec 06 17:45:35 2011 +0100 @@ -0,0 +1,5 @@ +{% load i18n %} + +{% for res in elem_list%} + +{% endfor %} \ No newline at end of file diff -r e00779f0dcba -r c0c161736794 src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/partial/userslist.html --- a/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/partial/userslist.html Mon Dec 05 14:25:21 2011 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +0,0 @@ -{% load i18n %} - -{% for user in user_list %} - -{% endfor %} \ No newline at end of file diff -r e00779f0dcba -r c0c161736794 src/ldt/ldt/ldt_utils/urls.py --- a/src/ldt/ldt/ldt_utils/urls.py Mon Dec 05 14:25:21 2011 +0100 +++ b/src/ldt/ldt/ldt_utils/urls.py Tue Dec 06 17:45:35 2011 +0100 @@ -32,7 +32,7 @@ url(r'^filterprojects/_(?P[\w\%\_\-\+]*?)/(?Ptrue|false)/(?P\d)/(?P.*)$', "views.projects_filter",), url(r'^filtercontents/_(?P[\w\%\_\-\+]*?)/$', "views.contents_filter",), url(r'^filtergroups/_(?P[\w\%\_\-\+]*?)/$', "views.groups_filter",), - url(r'filterusers/_(?P[\w\%\_\-\+]*?)/(?P.*)$', "views.users_filter"), + url(r'filtershare/_(?P[\w\%\_\-\+]*?)/$', "views.share_filter"), (r'^embedpopup/?$', "views.popup_embed"), url(r'^segment/(?P.*)/(?P.*)/(?P.*)/(?P.*)/(?P.*)/$', 'views.index_segment'), url(r'^segmentInit/(?P.*)/(?P.*)/(?P.*)/(?P.*)/(?P.*)/$', 'views.init_segment'), diff -r e00779f0dcba -r c0c161736794 src/ldt/ldt/ldt_utils/views.py --- a/src/ldt/ldt/ldt_utils/views.py Mon Dec 05 14:25:21 2011 +0100 +++ b/src/ldt/ldt/ldt_utils/views.py Tue Dec 06 17:45:35 2011 +0100 @@ -20,7 +20,7 @@ from forms import (LdtAddForm, SearchForm, AddProjectForm, CopyProjectForm, ContentForm, MediaForm, GroupAddForm, PermissionForm) from guardian.core import ObjectPermissionChecker -from guardian.shortcuts import assign, remove_perm, get_perms, get_objects_for_group +from guardian.shortcuts import assign, remove_perm, get_perms, get_objects_for_group, get_objects_for_user from ldt.ldt_utils.models import Content from ldt.ldt_utils.utils import boolean_convert, LdtUtils, LdtSearch from ldt.security.utils import (assign_object_to_groups, set_forbidden_stream, @@ -181,27 +181,28 @@ {'projects': project_list, 'show_username':show_username, 'is_gecko': is_gecko, 'group_id':id_group}, context_instance=RequestContext(request)) + +def share_filter(request, filter): -def users_filter(request, filter, id_group=None): - if filter and len(filter) > 0 and filter[0] == '_': - filter = filter[1:] + if not filter or len(filter) == 0: + raise AttributeError("filter should be a string") - query = Q(id=settings.ANONYMOUS_USER_ID) | Q(id=request.user.id) | Q(is_superuser=True) - filter_query = Q(username__icontains=filter) if filter else Q() - user_list = User.objects.exclude(query).filter(filter_query)[0:20] + filter = filter[1:] + + users = User.objects.filter(username__icontains=filter)[0:20] + groups = Group.objects.filter(name__icontains=filter).exclude(name=settings.PUBLIC_GROUP_NAME)[0:20] - if id_group: - group = Group.objects.get(id=id_group) - members_list = group.user_set.all() - for u in user_list: - if u in members_list: - u.member = True - if u.has_perm('change_group', group): - u.admin = True + resp = [] + for u in users: + resp.append({'name':u.username, 'id':u.id, 'type': 'user'}) - return render_to_response("ldt/ldt_utils/partial/userslist.html", {'user_list': user_list}, - context_instance=RequestContext(request)) - + for g in groups: + resp.append({'name': g.name, 'id': g.id, 'type': 'group'}) + + resp = sorted(resp, key=lambda elem: elem['name'].lower()) + + return render_to_response("ldt/ldt_utils/partial/sharewith.html", {'elem_list' : resp}, context_instance=RequestContext(request)) + @login_required def contents_filter(request, filter): if filter and len(filter) > 0 and filter[0] == '_': @@ -222,7 +223,6 @@ {'contents': content_list}, context_instance=RequestContext(request)) - @login_required def groups_filter(request, filter): if filter and len(filter) > 0 and filter[0] == '_': @@ -449,40 +449,38 @@ @login_required def create_ldt_view(request): - permission_formset = formset_factory(PermissionForm, extra=0) groups = request.user.groups.exclude(name=settings.PUBLIC_GROUP_NAME) redirect_to = '' if request.method == "POST" : form = LdtAddForm(request.POST) form_status = "none" contents = Content.safe_objects.all() - group_form = permission_formset(request.POST) - - if form.is_valid() and group_form.is_valid(): - user = request.user - + + if form.is_valid(): + user = request.user project = Project.create_project(title=form.cleaned_data['title'], user=user, - contents=form.cleaned_data['contents'], + #contents=form.cleaned_data['contents'], + contents=[], description=form.cleaned_data['description']) - assign_object_to_groups(project, group_form.cleaned_data) + assign_object_to_groups(project, form.cleaned_data["read_list"], form.cleaned_data["write_list"], user) form_status = "saved" is_gecko = ((request.META['HTTP_USER_AGENT'].lower().find("firefox")) > -1); if is_gecko : redirect_to = reverse('index_project_full', args=[project.ldt_id]) else: - return HttpResponseRedirect(reverse('index_project', args=[project.ldt_id])) - - management_form, group_form = get_perm_form(groups, permission_formset) - + return HttpResponseRedirect(reverse('index_project', args=[project.ldt_id])) + else: form = LdtAddForm() - contents = Content.safe_objects.all() #@UndefinedVariable - management_form, group_form = get_perm_form(groups, permission_formset) + contents = Content.safe_objects.all() form_status = "none" - - return render_to_response('ldt/ldt_utils/create_ldt.html', {'contents': contents, 'form': form, 'group_form': group_form, 'management_form': management_form, 'form_status':form_status, - 'redirect_to': redirect_to, 'create_project_action':reverse(create_ldt_view), 'language_code' : settings.LANGUAGE_CODE[2:]}, context_instance=RequestContext(request)) + + user_list = User.objects.all()[0:20] + elem_list = [{'name': u.username, 'id': u.id, 'type': 'user'} for u in user_list] + return render_to_response('ldt/ldt_utils/create_ldt.html', {'contents': contents, 'form': form, 'form_status':form_status, + 'redirect_to': redirect_to, 'create_project_action':reverse(create_ldt_view), 'language_code' : settings.LANGUAGE_CODE[2:], + 'elem_list': elem_list}, context_instance=RequestContext(request)) def created_ldt(request): return render_to_response('ldt/ldt_utils/save_done.html', context_instance=RequestContext(request)) @@ -500,7 +498,6 @@ def init_segment(request, project_id, content_id, ensemble_id, cutting_id, segment_id): if project_id != u"_": - assert False, project_id get_object_or_404(Project.safe_objects, ldt_id=project_id) ldtgen = LdtUtils() @@ -842,7 +839,6 @@ @login_required def create_project(request, iri_id): - permission_formset = formset_factory(PermissionForm, extra=0) content = get_object_or_404(Content.safe_objects, iri_id=iri_id) contents = [ content, ] groups = request.user.groups.exclude(name=settings.PUBLIC_GROUP_NAME) @@ -851,39 +847,36 @@ if request.method == "POST" : - group_form = permission_formset(request.POST) form = AddProjectForm(request.POST) - if form.is_valid() and group_form.is_valid(): + if form.is_valid(): user = request.user project = Project.create_project(title=form.cleaned_data['title'], user=user, contents=contents, description=form.cleaned_data['description']) - form_status = "saved" + form_status = "saved" + assign_object_to_groups(project, form.cleaned_data["read_list"], form.cleaned_data["write_list"], user) + # Modal window is not used with firefox is_gecko = ((request.META['HTTP_USER_AGENT'].lower().find("firefox")) > -1); if is_gecko : redirect_to = reverse('index_project_full', args=[project.ldt_id]) else: return HttpResponseRedirect(reverse('index_project', args=[project.ldt_id])) - assign_object_to_groups(project, group_form.cleaned_data) - - management_form, group_form = get_perm_form(groups, permission_formset) + else: form = AddProjectForm() - management_form, group_form = get_perm_form(groups, permission_formset) - return render_to_response('ldt/ldt_utils/create_ldt.html', {'form':form, 'form_status': form_status, 'contents':contents,'groups' : groups, 'group_form': group_form, - 'management_form': management_form, 'redirect_to': redirect_to, 'create_project_action':reverse("ldt.ldt_utils.views.create_project", args=[iri_id])}, context_instance=RequestContext(request)) + return render_to_response('ldt/ldt_utils/create_ldt.html', {'form':form, 'form_status': form_status, 'contents':contents,'groups' : groups, + 'redirect_to': redirect_to, 'create_project_action':reverse("ldt.ldt_utils.views.create_project", args=[iri_id])}, context_instance=RequestContext(request)) @login_required def update_project(request, ldt_id): - permission_formset = formset_factory(PermissionForm, extra=0) project = get_object_or_404(Project.safe_objects, ldt_id=ldt_id) contents = project.contents.all() groups = request.user.groups.exclude(name=settings.PUBLIC_GROUP_NAME) - - management_form = None - + elem_list = User.objects.all()[0:20] + elem_list = [{'name': e.username, 'id': e.id, 'type': e.type} for e in elem_list] + if request.method == "POST" : submit_action = request.REQUEST.get("submit_button", False) if submit_action == "prepare_delete": @@ -901,14 +894,11 @@ project.delete() form_status = 'deleted' form = AddProjectForm() - group_form = permission_formset() else: form_status = 'none' form = AddProjectForm(request.POST) - group_form = permission_formset(request.POST) - if form.is_valid() and group_form.is_valid(): - + if form.is_valid(): if project.title != form.cleaned_data['title'] or project.description != form.cleaned_data['description']: project.title = form.cleaned_data['title'] project.description = form.cleaned_data['description'] @@ -919,32 +909,15 @@ project.ldt = lxml.etree.tostring(ldt, pretty_print=True) project.save() - assign_object_to_groups(project, group_form.cleaned_data) + assign_object_to_groups(project, form.cleaned_data["read_list"], form.cleaned_data["write_list"], request.user) form_status = "saved" else: form = AddProjectForm({'title':unicode(project.title), 'description':unicode(project.get_description())}) - perm_list = [] - for group in groups: - group_perms = get_perms(group, project) - share = False - perm = None - if 'view_project' in group_perms: - share = True - perm = 'read' - if 'change_project' in group_perms: - perm = 'write' - - perm_list.append({'share': share, 'perms': perm, 'group': group.id }) - permission = permission_formset(initial=perm_list) - management_form = permission.management_form - group_form = zip(permission, groups) - form_status = 'none' return render_to_response('ldt/ldt_utils/create_ldt.html', {'form':form, 'form_status':form_status, 'groups': groups, - 'ldt_id': ldt_id, 'contents':contents, 'group_form': group_form, 'management_form': management_form, - 'create_project_action':reverse("ldt.ldt_utils.views.update_project", args=[ldt_id])}, context_instance=RequestContext(request)) + 'elem_list': elem_list, 'ldt_id': ldt_id, 'contents':contents, 'create_project_action':reverse("ldt.ldt_utils.views.update_project", args=[ldt_id])}, context_instance=RequestContext(request)) @login_required def copy_project(request, ldt_id, group_id=None): @@ -1334,6 +1307,7 @@ return HttpResponseServerError('

User can not leave a group.

') query = Q(id=settings.ANONYMOUS_USER_ID) | Q(id=request.user.id) | Q(is_superuser=True) user_list = User.objects.exclude(query)[0:20] + user_list = [{'name': x.username, 'id': x.id, 'type': 'user'} for x in user_list] form_status = '' if request.method == 'POST': @@ -1359,7 +1333,7 @@ form = GroupAddForm() form.fields['members_list'].queryset = user_list - return render_to_response("ldt/ldt_utils/create_group.html", {'form' : form, 'form_status' : form_status, 'user_list' : user_list, 'admin_list': user_list}, context_instance=RequestContext(request)) + return render_to_response("ldt/ldt_utils/create_group.html", {'form' : form, 'form_status' : form_status, 'elem_list' : user_list}, context_instance=RequestContext(request)) @login_required def update_group(request, group_id): @@ -1398,7 +1372,7 @@ for user in new_member_list: group.user_set.add(user) - if user in admin_list and user.get_profile().is_regular: + if user in admin_list: assign('change_group', user, group) else: remove_perm('change_group', user, group) diff -r e00779f0dcba -r c0c161736794 src/ldt/ldt/security/utils.py --- a/src/ldt/ldt/security/utils.py Mon Dec 05 14:25:21 2011 +0100 +++ b/src/ldt/ldt/security/utils.py Tue Dec 06 17:45:35 2011 +0100 @@ -1,8 +1,7 @@ from django.conf import settings from django.contrib.contenttypes.models import ContentType -from django.contrib.auth.models import Group from guardian.core import ObjectPermissionChecker -from guardian.shortcuts import assign, remove_perm +from guardian.shortcuts import assign, remove_perm, get_users_with_perms, get_groups_with_perms try: from threading import local @@ -104,19 +103,28 @@ return obj_list -def assign_object_to_groups(object, permissions): +def assign_object_to_groups(object, read_list, write_list, owner): name = object.__class__.__name__.lower() - for elem in permissions: - group = Group.objects.get(id=elem['group']) - if elem['share']: - assign('view_%s' % name, group, object) - if elem['perms'] == 'write': - assign('change_%s' % name, group, object) - else: - remove_perm('change_%s' % name, group, object) + + old_users = get_users_with_perms(object).exclude(id=owner.id) + old_groups = get_groups_with_perms(object) + + for elem in read_list: + assign('view_%s' % name, elem, object) + if elem in write_list: + assign('change_%s' % name, elem, object) else: - remove_perm('view_%s' % name, group, object) - remove_perm('change_%s' % name, group, object) + remove_perm('change_%s' % name, elem, object) + + def remove_perms(new_list, old_list, obj, name): + for e in old_list: + if e not in new_list: + remove_perm('view_%s' % name, e, obj) + remove_perm('change_%s' % name, e, obj) + + remove_perms(read_list, old_users, object, name) + remove_perms(read_list, old_groups, object, name) + def get_perm_form(groups, formset): perm_list = [] diff -r e00779f0dcba -r c0c161736794 src/ldt/ldt/static/ldt/js/multiselect.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/ldt/ldt/static/ldt/js/multiselect.js Tue Dec 06 17:45:35 2011 +0100 @@ -0,0 +1,103 @@ +function init_multi_select_events (first_list, sec_list, first_selection, sec_selection, search_input, search_url) { + + $("#selectelems").click(function () { + var list = get_selected_elems(first_list); + move_elem(first_list, sec_list, list); + add_to_form(first_selection, list, "read_list"); + }); + + $("#removeelems").click(function () { + var list = get_selected_elems(sec_list); + move_elem(sec_list, first_list, list); + remove_from_form(first_selection, list); + }); + + $("#selectall").click(function () { + var list = get_all_options(first_list); + move_elem(first_list, sec_list, list); + add_to_form(first_selection, list, "read_list"); + }); + + $("#removeall").click(function () { + var elem_list = get_all_options(sec_list); + move_elem(sec_list, first_list, get_all_options(sec_list)); + remove_from_form(first_selection, elem_list); + remove_from_form(sec_selection, elem_list); + }); + + $("#chooseaux").click(function () { + var elems = get_selected_elems(sec_list); + + for (var i=0; i < elems.length; i++) { + $("option[value=" + elems[i] + "]", sec_list).css('color', '#2181B1'); + $(sec_selection).append(""); + } + }); + + $("#removeaux").click(function () { + var users = get_selected_elems(sec_list); + + for (var i=0; i < users.length; i++) { + $("option[value=" + users[i] + "]", sec_list).css('color', 'black'); + $("input[value=" + users[i] + "]", sec_selection).remove(); + } + }); + + $(document).ready(function () { + filter_elems(first_list, sec_list); + input_list_init = [ + {'input_selector':search_input, 'container_selector': first_list, 'url':search_url} + ]; + searchFieldInit(input_list_init); + }); +} + +function move_elem (from, to, elems) { + var selected = $("#sec_selection"); + for (var i=0; i < elems.length; i++) { + var option = $("option[value=" + elems[i] + "]", from); + option.css('color', 'black'); + $("input[value=" + elems[i] + "]", selected).remove(); + to.append(option); + } +} + +function get_selected_elems(list) { + var selected = Array(); + $("option:selected", list).each(function (e) { + selected.push($(this).val()); + }); + return selected; +} + +function remove_from_form(form, elem_list) { + for (var i=0; i < elem_list.length; i++) { + $("input[value=" + elem_list[i] + "]", form).remove(); + } +} + +function add_to_form(form, elem_list, name) { + for (var i=0; i < elem_list.length; i++) { + form.append(""); + } +} + +function get_all_options (select) { + var all = Array(); + $("option", select).each(function() { + all.push($(this).val()); + }); + return all; +} + +function filter_elems(first_list, sec_list) { + var selected = get_all_options(sec_list); + + $("option", first_list).each(function () { + for (var i = 0; i < selected.length; i++) { + if (selected[i] == $(this).attr('value')) { + $(this).remove(); + } + } + }); +} \ No newline at end of file