From c77f390a04d5049b2a05a847cfe38783e740f9af Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Mon, 23 Jun 2014 22:50:02 +0200 Subject: [PATCH] wip: Radicale extension (#574) Enable search form + code refactoring. --- .../extensions/admin/static/admin/js/admin.js | 38 +++------------- modoboa/extensions/amavis/app_settings.py | 4 +- .../amavis/static/amavis/js/quarantine.js | 6 +-- modoboa/extensions/radicale/app_settings.py | 12 +++++ .../extensions/radicale/general_callbacks.py | 2 +- .../radicale/static/radicale/js/radicale.js | 5 +-- modoboa/extensions/radicale/views.py | 10 ++++- modoboa/static/js/listing.js | 44 ++++++++++++++++++- modoboa/static/js/twocols_nav.js | 7 ++- 9 files changed, 79 insertions(+), 49 deletions(-) diff --git a/modoboa/extensions/admin/static/admin/js/admin.js b/modoboa/extensions/admin/static/admin/js/admin.js index 60abd75ab..6888f565f 100644 --- a/modoboa/extensions/admin/static/admin/js/admin.js +++ b/modoboa/extensions/admin/static/admin/js/admin.js @@ -14,28 +14,9 @@ Admin.prototype = { }, initialize: function(options) { - Listing.prototype.initialize.call(this, options); - this.options = $.extend({}, this.defaults, this.options); + this.options = $.extend({}, this.defaults, options); this.options.defcallback = $.proxy(this.list_cb, this); - - this.navobj = new History(this.options); - - $("#searchquery").focus(function() { - $(this).val(""); - }).blur($.proxy(function(e) { - var $this = $(e.target); - if ($this.val() === "") { - if (this.navobj.getparam("searchquery")) { - $this.val(this.navobj.getparam("searchquery")); - } else { - $this.val(gettext("Search")); - } - } - }, this)); - if (this.navobj.getparam("searchquery") !== undefined) { - $("#searchquery").val(this.navobj.getparam("searchquery")); - } - + Listing.prototype.initialize.call(this, this.options); this.listen(); }, @@ -45,19 +26,10 @@ Admin.prototype = { $("a.filter").click($.proxy(this.filter_by_tag, this)); }, + /** + * Children must override this method. + */ listen: function() { - $("#searchform").submit($.proxy(this.do_search, this)); - }, - - do_search: function(e) { - e.preventDefault(); - var squery = $("#searchquery").val(); - if (squery !== "") { - this.navobj.setparam("searchquery", squery); - } else { - this.navobj.delparam("searchquery"); - } - this.navobj.update(); }, importform_cb: function() { diff --git a/modoboa/extensions/amavis/app_settings.py b/modoboa/extensions/amavis/app_settings.py index 9d933476c..da1d51728 100644 --- a/modoboa/extensions/amavis/app_settings.py +++ b/modoboa/extensions/amavis/app_settings.py @@ -17,7 +17,7 @@ class ParametersForm(AdminParametersForm): ) sep1 = SeparatorField(label=_("Messages releasing")) - + released_msgs_cleanup = YesNoField( label=_("Remove released messages"), initial="no", @@ -49,7 +49,7 @@ class ParametersForm(AdminParametersForm): initial="/var/amavis/amavisd.sock", help_text=_("Path to the PDP server socket (if unix mode)") ) - + check_requests_interval = forms.IntegerField( label=_("Check requests interval"), initial=30, diff --git a/modoboa/extensions/amavis/static/amavis/js/quarantine.js b/modoboa/extensions/amavis/static/amavis/js/quarantine.js index 41e25c253..a5d676a54 100644 --- a/modoboa/extensions/amavis/static/amavis/js/quarantine.js +++ b/modoboa/extensions/amavis/static/amavis/js/quarantine.js @@ -10,11 +10,9 @@ Quarantine.prototype = { }, initialize: function(options) { - Listing.prototype.initialize.call(this, options); - this.options = $.extend({}, this.defaults, this.options); + this.options = $.extend({}, this.defaults, options); this.options.defcallback = $.proxy(this.listing_cb, this); - this.navobj = new History(this.options); - + Listing.prototype.initialize.call(this, this.options); this.register_navcallbacks(); this.listen(); this.set_msgtype(); diff --git a/modoboa/extensions/radicale/app_settings.py b/modoboa/extensions/radicale/app_settings.py index f2ad2b9c4..457870d54 100644 --- a/modoboa/extensions/radicale/app_settings.py +++ b/modoboa/extensions/radicale/app_settings.py @@ -1,13 +1,25 @@ from django.utils.translation import ugettext_lazy from django import forms from modoboa.lib.parameters import AdminParametersForm +from modoboa.lib.formutils import SeparatorField class ParametersForm(AdminParametersForm): app = "radicale" + rights_management_sep = SeparatorField( + label=ugettext_lazy("Rights management")) + rights_file_path = forms.CharField( label=ugettext_lazy("Radicale rights file path"), initial="/etc/radicale/rights", help_text=ugettext_lazy("Path to file that contains rights definition") ) + + allow_calendars_administration = forms.BooleanField( + label=ugettext_lazy("Allow calendars administration"), + initial=False, + help_text=ugettext_lazy( + "Allow domain administrators to manage user calendars (read an write)" + ) + ) diff --git a/modoboa/extensions/radicale/general_callbacks.py b/modoboa/extensions/radicale/general_callbacks.py index 806111417..86b5e70c0 100644 --- a/modoboa/extensions/radicale/general_callbacks.py +++ b/modoboa/extensions/radicale/general_callbacks.py @@ -9,7 +9,7 @@ def top_menu(target, user): if target == "top_menu": return [ {"name": "radicale", - "label": _("Radicale"), + "label": _("Calendars"), "url": reverse('modoboa.extensions.radicale.views.index')} ] return [] diff --git a/modoboa/extensions/radicale/static/radicale/js/radicale.js b/modoboa/extensions/radicale/static/radicale/js/radicale.js index 19c4fb157..49952cc94 100644 --- a/modoboa/extensions/radicale/static/radicale/js/radicale.js +++ b/modoboa/extensions/radicale/static/radicale/js/radicale.js @@ -14,10 +14,9 @@ Radicale.prototype = { }, initialize: function(options) { - Listing.prototype.initialize.call(this, options); - this.options = $.extend({}, this.defaults, this.options); + this.options = $.extend({}, this.defaults, options); this.options.defcallback = $.proxy(this.list_cb, this); - this.navobj = new History(this.options); + Listing.prototype.initialize.call(this, this.options); this.register_tag_handler("cal", this.generic_tag_handler); $(document).on( "click", "a[name=delcalendar]", $.proxy(this.del_calendar, this) diff --git a/modoboa/extensions/radicale/views.py b/modoboa/extensions/radicale/views.py index 0decb55e9..1a6689a89 100644 --- a/modoboa/extensions/radicale/views.py +++ b/modoboa/extensions/radicale/views.py @@ -37,17 +37,25 @@ def calendars(request, tplname="radicale/calendar_list.html"): """ sort_order, sort_dir = get_sort_order(request.GET, "name") calfilter = request.GET.get("calfilter", None) + searchquery = request.GET.get("searchquery", None) if request.user.group == "SimpleUsers": mbox = request.user.mailbox_set.all()[0] - cals = UserCalendar.objects.filter(mailbox=mbox).select_related().all() + cals = UserCalendar.objects.filter(mailbox=mbox) + if searchquery is not None: + cals = cals.filter(name__icontains=searchquery) + cals = cals.select_related().all() with_owner = False else: ucals = [] if calfilter is None or calfilter == "user": ucals = UserCalendar.objects.get_for_admin(request.user) + if searchquery is not None: + ucals = ucals.filter(name__icontains=searchquery) scals = [] if calfilter is None or calfilter == "shared": scals = SharedCalendar.objects.get_for_admin(request.user) + if searchquery is not None: + scals = scals.filter(name__icontains=searchquery) cals = chain(ucals, scals) with_owner = True cals = sorted( diff --git a/modoboa/static/js/listing.js b/modoboa/static/js/listing.js index cf10d173b..f39607ff3 100644 --- a/modoboa/static/js/listing.js +++ b/modoboa/static/js/listing.js @@ -8,16 +8,58 @@ Listing.prototype = { listing_defaults: { pbar_container: '#bottom-bar-right', pbar_id: '#pagination_bar', - sortable_selector: '.sortable' + sortable_selector: '.sortable', + with_searchform: true }, initialize: function(options) { this.options = $.extend({}, this.listing_defaults, options); this.tag_handlers = {}; + this.navobj = new History(this.options); $(document).on("click", this.options.pbar_container + " a", $.proxy(this.load_page, this)); + if (this.options.with_searchform) { + this.init_searchform(); + } }, + /** + * Initialize the search form. + */ + init_searchform: function() { + $("#searchquery").focus(function() { + $(this).val(""); + }).blur($.proxy(function(e) { + var $this = $(e.target); + if ($this.val() === "") { + if (this.navobj.getparam("searchquery")) { + $this.val(this.navobj.getparam("searchquery")); + } else { + $this.val(gettext("Search")); + } + } + }, this)); + if (this.navobj.getparam("searchquery") !== undefined) { + $("#searchquery").val(this.navobj.getparam("searchquery")); + } + $("#searchform").submit($.proxy(this.do_search, this)); + }, + + /** + * Apply the current search pattern. + */ + do_search: function(e) { + e.preventDefault(); + var squery = $("#searchquery").val(); + if (squery !== "") { + this.navobj.setparam("searchquery", squery); + } else { + this.navobj.delparam("searchquery"); + } + this.navobj.update(); + }, + + load_page: function(e) { var $link = get_target(e, "a"); e.preventDefault(); diff --git a/modoboa/static/js/twocols_nav.js b/modoboa/static/js/twocols_nav.js index c6fddc606..afb46b86d 100644 --- a/modoboa/static/js/twocols_nav.js +++ b/modoboa/static/js/twocols_nav.js @@ -11,10 +11,9 @@ TwocolsNav.prototype = { }, initialize: function(options) { - Listing.prototype.initialize.call(this, options); - this.options = $.extend({}, this.defaults, this.options); + this.options = $.extend({}, this.defaults, options); this.options.defcallback = $.proxy(this.default_cb, this); - this.navobj = new History(this.options); + Listing.prototype.initialize.call(this, this.options); this.listen(); }, @@ -130,4 +129,4 @@ TwocolsNav.prototype = { } }; -TwocolsNav.prototype = $.extend({}, Listing.prototype, TwocolsNav.prototype); \ No newline at end of file +TwocolsNav.prototype = $.extend({}, Listing.prototype, TwocolsNav.prototype);