source: dynamicfieldsplugin/trunk/dynfields/options.py

Last change on this file was 17720, checked in by Ryan J Ollos, 3 years ago

TracDynamicFields 2.5.0dev: Use JavaScript booleans

Replaces comparison with string == {'true','false'}

  • Fix SetRule not working for checkboxes when overwrite was false.
  • Fix display of "Show hidden fields".

Refs #13617.

  • Property svn:executable set to *
File size: 4.0 KB
RevLine 
[13690]1# -*- coding: utf-8 -*-
2#
[14003]3# Copyright (C) 2010-2014 Rob Guttman <guttman@alum.mit.edu>
[13690]4#
5# This software is licensed as described in the file COPYING, which
6# you should have received as part of this distribution.
7#
8
[14357]9from trac.ticket.api import TicketSystem
[17720]10from trac.util import as_bool
[8168]11
12PREFIX = 'dynfields.'
[14357]13PREF_DEFAULTS = {
14    '(pref)': '1',
15    '(pref:enable)': '1',
16    '(pref:enabled)': '1',
17    '(pref:disable)': '0',
18    '(pref:disabled)': '0',
19}
[8168]20
[13689]21
[8168]22class Options(dict):
23    """A thin dict wrapper of ticket-custom options to handle specifying,
24    loading and saving user preferences for any rule.  User preferences
25    are specified by '(pref)' appended to a rule spec as follows:
[13991]26
[8168]27      [ticket-custom]
28      version.show_when_type = enhancement (pref)
29    """
[13991]30
[8168]31    def __init__(self, env):
32        """Fills self with ticket-custom options with '(pref)' stripped
33        from values.  Maintains which options/rules have been configured
34        for user preference."""
[14357]35        super(Options, self).__init__()
[8168]36        self.env = env
[9665]37        self._pref_defaults = {}
[13688]38        for key, val in self.env.config['ticket-custom'].options():
[13689]39            for pref, default in PREF_DEFAULTS.items():
[9665]40                if val.endswith(pref):
[13689]41                    val = val.replace(pref, '').rstrip()
[9665]42                    self._pref_defaults[key] = default
43                    break
[8168]44            self[key] = val
[13991]45
[9839]46        # add built-in field types
47        for field in TicketSystem(self.env).get_ticket_fields():
48            self[field['name']] = field['type']
[13991]49
[8168]50    def has_pref(self, key):
51        """Returns True if the given key is configured for user preference."""
[9665]52        return key in self._pref_defaults
[13991]53
[8168]54    def is_enabled(self, req, key):
55        """Returns True if there's no user preference configured for this
56        key or if there is and the user enabled the rule spec (the default)."""
[9665]57        if key not in self._pref_defaults:
[8168]58            return True
[13991]59
[9665]60        # return the default pref value if not set
[16951]61        return req.session.get(PREFIX + key, self._pref_defaults[key]) == '1'
[13991]62
[8168]63    def get_value_and_options(self, req, target, key):
64        """Returns the preference value for the given key if configured
65        for being set by user preference.  If no user preference has been
66        set yet, the target field's default value is returned."""
67        value = ''
68        options = []
69        for field in TicketSystem(self.env).get_ticket_fields():
70            if field['name'] == target:
71                value = field.get('value', value)
72                options = field.get('options', options)
73                break
[9665]74        if key in self._pref_defaults:
[16951]75            value = req.session.get(PREFIX + key + '.value', value)
[13689]76        return value, options
[13991]77
[8168]78    def get_pref(self, req, target, key):
79        """Returns the data needed for preferences.  The data returned
80        must be a dict with these keys:
[13991]81
[8168]82          id (based on unique key)
83          label (of checkbox)
84          enabled ('1' or '0')
85          type ('none' or 'select', TODO: support 'text')
86          options (list of options if type is 'select')
87          value (saved preference or default value)
88        """
[13689]89        value, options = self.get_value_and_options(req, target, key)
[14357]90        return {
91            'id': PREFIX + key,
92            'label': '%s = %s' % (key, self[key]),
93            'enabled': req.session.get(PREFIX + key,
94                                       self._pref_defaults[key]),
95            'type': 'none',
96            'options': options,
97            'value': value,
98        }
[13991]99
[8168]100    def set_prefs(self, req):
101        """Saves the user's preferences."""
102        # save checkbox settings
[9665]103        for key in self._pref_defaults:
[16951]104            req.session[PREFIX + key] = req.args.get(PREFIX + key, '0')
[13991]105
[8168]106        # now save values
[13689]107        for arg, value in req.args.items():
[8168]108            if not arg.startswith(PREFIX) or not arg.endswith('.value'):
109                continue
110            req.session[arg] = value
[17720]111
112    def getbool(self, key, default=False):
113        return as_bool(self.get(key, default))
114
Note: See TracBrowser for help on using the repository browser.