class Tool(models.Model): name = models.CharField(max_length=32, unique=True) class_name = models.CharField(max_length=128, unique=True) objects = ToolManager() supports_authentication = property( lambda x: x.get_scmtool_class().supports_authentication) supports_raw_file_urls = property( lambda x: x.get_scmtool_class().supports_raw_file_urls) def __unicode__(self): return self.name def get_scmtool_class(self): path = self.class_name i = path.rfind('.') module, attr = path[:i], path[i + 1:] try: mod = __import__(module, {}, {}, [attr]) except ImportError, e: raise ImproperlyConfigured, \ 'Error importing SCM Tool %s: "%s"' % (module, e) try: return getattr(mod, attr) except AttributeError: raise ImproperlyConfigured, \ 'Module "%s" does not define a "%s" SCM Tool' % (module, attr)
class Tool(models.Model): name = models.CharField(max_length=32, unique=True) class_name = models.CharField(max_length=128, unique=True) objects = ToolManager() # Templates can't access variables on a class properly. It'll attempt to # instantiate the class, which will fail without the necessary parameters. # So, we use these as convenient wrappers to do what the template can't do. supports_history = property( lambda x: x.scmtool_class.supports_history) supports_raw_file_urls = property( lambda x: x.scmtool_class.supports_raw_file_urls) supports_ticket_auth = property( lambda x: x.scmtool_class.supports_ticket_auth) supports_pending_changesets = property( lambda x: x.scmtool_class.supports_pending_changesets) field_help_text = property( lambda x: x.scmtool_class.field_help_text) def __str__(self): return self.name def get_scmtool_class(self): if not hasattr(self, '_scmtool_class'): path = self.class_name i = path.rfind('.') module, attr = path[:i], path[i + 1:] try: mod = __import__(six.binary_type(module), {}, {}, [six.binary_type(attr)]) except ImportError as e: raise ImproperlyConfigured( 'Error importing SCM Tool %s: "%s"' % (module, e)) try: self._scmtool_class = getattr(mod, attr) except AttributeError: raise ImproperlyConfigured( 'Module "%s" does not define a "%s" SCM Tool' % (module, attr)) return self._scmtool_class scmtool_class = property(get_scmtool_class) class Meta: db_table = 'scmtools_tool' ordering = ('name',) verbose_name = _('Tool') verbose_name_plural = _('Tools')
class Tool(models.Model): name = models.CharField(max_length=32, unique=True) class_name = models.CharField(max_length=128, unique=True) objects = ToolManager() # Templates can't access variables on a class properly. It'll attempt to # instantiate the class, which will fail without the necessary parameters. # So, we use these as convenient wrappers to do what the template can't do. supports_authentication = property( lambda x: x.scmtool_class.supports_authentication) supports_raw_file_urls = property( lambda x: x.scmtool_class.supports_raw_file_urls) supports_ticket_auth = property( lambda x: x.scmtool_class.supports_ticket_auth) supports_pending_changesets = property( lambda x: x.scmtool_class.supports_pending_changesets) field_help_text = property(lambda x: x.scmtool_class.field_help_text) def __unicode__(self): return self.name def get_scmtool_class(self): if not hasattr(self, '_scmtool_class'): path = self.class_name i = path.rfind('.') module, attr = path[:i], path[i + 1:] try: mod = __import__(module, {}, {}, [attr]) except ImportError, e: raise ImproperlyConfigured, \ 'Error importing SCM Tool %s: "%s"' % (module, e) try: self._scmtool_class = getattr(mod, attr) except AttributeError: raise ImproperlyConfigured, \ 'Module "%s" does not define a "%s" SCM Tool' \ % (module, attr) return self._scmtool_class
class Tool(models.Model): """A configured source code management tool. Each :py:class:`~reviewboard.scmtools.core.SCMTool` used by repositories must have a corresponding :py:class:`Tool` entry. These provide information on the capabilities of the tool, and accessors to construct a tool for a repository. Tool entries are populated by running the ``registerscmtools`` management command. """ name = models.CharField(max_length=32, unique=True) class_name = models.CharField(max_length=128, unique=True) objects = ToolManager() # Templates can't access variables on a class properly. It'll attempt to # instantiate the class, which will fail without the necessary parameters. # So, we use these as convenient wrappers to do what the template can't do. #: Whether or not the SCMTool supports review requests with history. #: #: See :py:attr:`SCMTool.supports_history #: <reviewboard.scmtools.core.SCMTool.supports_history>` for details. supports_history = property(lambda x: x.scmtool_class.supports_history) #: Whether custom URL masks can be defined to fetching file contents. #: #: See :py:attr:`SCMTool.supports_raw_file_urls #: <reviewboard.scmtools.core.SCMTool.supports_raw_file_urls>` for details. supports_raw_file_urls = property( lambda x: x.scmtool_class.supports_raw_file_urls) #: Whether ticket-based authentication is supported. #: #: See :py:attr:`SCMTool.supports_ticket_auth #: <reviewboard.scmtools.core.SCMTool.supports_ticket_auth>` for details. supports_ticket_auth = property( lambda x: x.scmtool_class.supports_ticket_auth) #: Whether server-side pending changesets are supported. #: #: See :py:attr:`SCMTool.supports_pending_changesets #: <reviewboard.scmtools.core.SCMTool.supports_pending_changesets>` for #: details. supports_pending_changesets = property( lambda x: x.scmtool_class.supports_pending_changesets) #: Overridden help text for the configuration form fields. #: #: See :py:attr:`SCMTool.field_help_text #: <reviewboard.scmtools.core.SCMTool.field_help_text>` for details. field_help_text = property(lambda x: x.scmtool_class.field_help_text) @property def scmtool_id(self): """The unique ID for the SCMTool. Type: unicode """ return self.scmtool_class.scmtool_id def get_scmtool_class(self): """Return the configured SCMTool class. Returns: type: The subclass of :py:class:`~reviewboard.scmtools.core.SCMTool` backed by this Tool entry. Raises: django.core.exceptions.ImproperlyConfigured: The SCMTool could not be found. """ if not hasattr(self, '_scmtool_class'): path = self.class_name i = path.rfind('.') module, attr = path[:i], path[i + 1:] try: mod = import_module(module) except ImportError as e: raise ImproperlyConfigured( 'Error importing SCM Tool %s: "%s"' % (module, e)) try: self._scmtool_class = getattr(mod, attr) except AttributeError: raise ImproperlyConfigured( 'Module "%s" does not define a "%s" SCM Tool' % (module, attr)) return self._scmtool_class scmtool_class = property(get_scmtool_class) def __str__(self): """Return the name of the tool. Returns: unicode: The name of the tool. """ return self.name class Meta: db_table = 'scmtools_tool' ordering = ('name', ) verbose_name = _('Tool') verbose_name_plural = _('Tools')