Эх сурвалжийг харах

HUE-8725 [core] Adding django-timezone-field lib for Celery Beat

Romain Rigaux 6 жил өмнө
parent
commit
aeb9c8a

+ 23 - 0
desktop/core/ext-py/django-timezone-field-3.0/LICENSE.txt

@@ -0,0 +1,23 @@
+Copyright (c) 2014, Mike Fogel <mike@fogel.ca>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice,
+       this list of conditions and the following disclaimer.
+
+    2. Redistributions in binary form must reproduce the above copyright
+       notice, this list of conditions and the following disclaimer in the
+       documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

+ 2 - 0
desktop/core/ext-py/django-timezone-field-3.0/MANIFEST.in

@@ -0,0 +1,2 @@
+include LICENSE.txt MANIFEST.in README.rst
+recursive-exclude tests *

+ 196 - 0
desktop/core/ext-py/django-timezone-field-3.0/PKG-INFO

@@ -0,0 +1,196 @@
+Metadata-Version: 1.1
+Name: django-timezone-field
+Version: 3.0
+Summary: A Django app providing database and form fields for pytz timezone objects.
+Home-page: http://github.com/mfogel/django-timezone-field/
+Author: Mike Fogel
+Author-email: mike@fogel.ca
+License: BSD
+Description: django-timezone-field
+        =====================
+        
+        .. image:: https://img.shields.io/travis/mfogel/django-timezone-field/develop.svg
+           :target: https://travis-ci.org/mfogel/django-timezone-field/
+        
+        .. image:: https://img.shields.io/coveralls/mfogel/django-timezone-field/develop.svg
+           :target: https://coveralls.io/r/mfogel/django-timezone-field/
+        
+        .. image:: https://img.shields.io/pypi/dm/django-timezone-field.svg
+           :target: https://pypi.python.org/pypi/django-timezone-field/
+        
+        A Django app providing database and form fields for `pytz`__ timezone objects.
+        
+        Examples
+        --------
+        
+        Database Field
+        ~~~~~~~~~~~~~~
+        
+        .. code:: python
+        
+            import pytz
+            from django.db import models
+            from timezone_field import TimeZoneField
+        
+            class MyModel(models.Model):
+                timezone1 = TimeZoneField(default='Europe/London') # defaults supported
+                timezone2 = TimeZoneField()
+                timezone3 = TimeZoneField()
+        
+            my_inst = MyModel(
+                timezone1='America/Los_Angeles',    # assignment of a string
+                timezone2=pytz.timezone('Turkey'),  # assignment of a pytz.DstTzInfo
+                timezone3=pytz.UTC,                 # assignment of pytz.UTC singleton
+            )
+            my_inst.full_clean()  # validates against pytz.common_timezones
+            my_inst.save()        # values stored in DB as strings
+        
+            tz = my_inst.timezone1  # values retrieved as pytz objects
+            repr(tz)                # "<DstTzInfo 'America/Los_Angeles' PST-1 day, 16:00:00 STD>"
+        
+        
+        Form Field
+        ~~~~~~~~~~
+        
+        .. code:: python
+        
+            from django import forms
+            from timezone_field import TimeZoneFormField
+        
+            class MyForm(forms.Form):
+                timezone = TimeZoneFormField()
+        
+            my_form = MyForm({
+                'timezone': 'America/Los_Angeles',
+            })
+            my_form.full_clean()  # validates against pytz.common_timezones
+        
+            tz = my_form.cleaned_data['timezone']  # values retrieved as pytz objects
+            repr(tz)                               # "<DstTzInfo 'America/Los_Angeles' PST-1 day, 16:00:00 STD>"
+        
+        
+        Installation
+        ------------
+        
+        #.  From `pypi`__ using `pip`__:
+        
+            .. code:: sh
+        
+                pip install django-timezone-field
+        
+        #.  Add `timezone_field` to your `settings.INSTALLED_APPS`__:
+        
+            .. code:: python
+        
+                INSTALLED_APPS = (
+                    ...
+                    'timezone_field',
+                    ...
+                )
+        
+        Changelog
+        ------------
+        
+        *   3.0 (2018-09-15)
+        
+            *   Support django 1.11, 2.0, 2.1
+            *   Add support for python 3.7
+            *   Change default human-readable timezone names to exclude underscores
+                (`#32`__ & `#37`__)
+        
+        
+        *   2.1 (2018-03-01)
+        
+            *   Add support for django 1.10, 1.11
+            *   Add support for python 3.6
+            *   Add wheel support
+            *   Support bytes in DB fields (`#38`__ & `#39`__)
+        
+        *   2.0 (2016-01-31)
+        
+            *   Drop support for django 1.7, add support for django 1.9
+            *   Drop support for python 3.2, 3.3, add support for python 3.5
+            *   Remove tests from source distribution
+        
+        *   1.3 (2015-10-12)
+        
+            *   Drop support for django 1.6, add support for django 1.8
+            *   Various `bug fixes`__
+        
+        *   1.2 (2015-02-05)
+        
+            *   For form field, changed default list of accepted timezones from
+                `pytz.all_timezones` to `pytz.common_timezones`, to match DB field
+                behavior.
+        
+        *   1.1 (2014-10-05)
+        
+            *   Django 1.7 compatibility
+            *   Added support for formating `choices` kwarg as `[[<str>, <str>], ...]`,
+                in addition to previous format of `[[<pytz.timezone>, <str>], ...]`.
+            *   Changed default list of accepted timezones from `pytz.all_timezones` to
+                `pytz.common_timezones`. If you have timezones in your DB that are in
+                `pytz.all_timezones` but not in `pytz.common_timezones`, this is a
+                backward-incompatible change. Old behavior can be restored by
+                specifying `choices=[(tz, tz) for tz in pytz.all_timezones]` in your
+                model definition.
+        
+        *   1.0 (2013-08-04)
+        
+            *   Initial release as `timezone_field`.
+        
+        
+        Running the Tests
+        -----------------
+        
+        #.  Install `tox`__.
+        
+        #.  From the repository root, run
+        
+            .. code:: sh
+        
+                tox
+        
+            Postgres will need to be running locally, and sqlite will need to be
+            installed in order for tox to do its job.
+        
+        Found a Bug?
+        ------------
+        
+        To file a bug or submit a patch, please head over to `django-timezone-field on github`__.
+        
+        Credits
+        -------
+        
+        Originally adapted from `Brian Rosner's django-timezones`__. The full list of contributors is available on `github`__.
+        
+        
+        __ http://pypi.python.org/pypi/pytz/
+        __ http://pypi.python.org/pypi/django-timezone-field/
+        __ http://www.pip-installer.org/
+        __ https://docs.djangoproject.com/en/dev/ref/settings/#installed-apps
+        __ https://github.com/mfogel/django-timezone-field/issues/32
+        __ https://github.com/mfogel/django-timezone-field/issues/37
+        __ https://github.com/mfogel/django-timezone-field/issues/38
+        __ https://github.com/mfogel/django-timezone-field/issues/39
+        __ https://github.com/mfogel/django-timezone-field/issues?q=milestone%3A1.3
+        __ https://tox.readthedocs.org/
+        __ https://github.com/mfogel/django-timezone-field/
+        __ https://github.com/brosner/django-timezones/
+        __ https://github.com/mfogel/django-timezone-field/graphs/contributors
+        
+Platform: UNKNOWN
+Classifier: Development Status :: 4 - Beta
+Classifier: Environment :: Web Environment
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: BSD License
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.4
+Classifier: Programming Language :: Python :: 3.5
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Topic :: Utilities
+Classifier: Framework :: Django

+ 172 - 0
desktop/core/ext-py/django-timezone-field-3.0/README.rst

@@ -0,0 +1,172 @@
+django-timezone-field
+=====================
+
+.. image:: https://img.shields.io/travis/mfogel/django-timezone-field/develop.svg
+   :target: https://travis-ci.org/mfogel/django-timezone-field/
+
+.. image:: https://img.shields.io/coveralls/mfogel/django-timezone-field/develop.svg
+   :target: https://coveralls.io/r/mfogel/django-timezone-field/
+
+.. image:: https://img.shields.io/pypi/dm/django-timezone-field.svg
+   :target: https://pypi.python.org/pypi/django-timezone-field/
+
+A Django app providing database and form fields for `pytz`__ timezone objects.
+
+Examples
+--------
+
+Database Field
+~~~~~~~~~~~~~~
+
+.. code:: python
+
+    import pytz
+    from django.db import models
+    from timezone_field import TimeZoneField
+
+    class MyModel(models.Model):
+        timezone1 = TimeZoneField(default='Europe/London') # defaults supported
+        timezone2 = TimeZoneField()
+        timezone3 = TimeZoneField()
+
+    my_inst = MyModel(
+        timezone1='America/Los_Angeles',    # assignment of a string
+        timezone2=pytz.timezone('Turkey'),  # assignment of a pytz.DstTzInfo
+        timezone3=pytz.UTC,                 # assignment of pytz.UTC singleton
+    )
+    my_inst.full_clean()  # validates against pytz.common_timezones
+    my_inst.save()        # values stored in DB as strings
+
+    tz = my_inst.timezone1  # values retrieved as pytz objects
+    repr(tz)                # "<DstTzInfo 'America/Los_Angeles' PST-1 day, 16:00:00 STD>"
+
+
+Form Field
+~~~~~~~~~~
+
+.. code:: python
+
+    from django import forms
+    from timezone_field import TimeZoneFormField
+
+    class MyForm(forms.Form):
+        timezone = TimeZoneFormField()
+
+    my_form = MyForm({
+        'timezone': 'America/Los_Angeles',
+    })
+    my_form.full_clean()  # validates against pytz.common_timezones
+
+    tz = my_form.cleaned_data['timezone']  # values retrieved as pytz objects
+    repr(tz)                               # "<DstTzInfo 'America/Los_Angeles' PST-1 day, 16:00:00 STD>"
+
+
+Installation
+------------
+
+#.  From `pypi`__ using `pip`__:
+
+    .. code:: sh
+
+        pip install django-timezone-field
+
+#.  Add `timezone_field` to your `settings.INSTALLED_APPS`__:
+
+    .. code:: python
+
+        INSTALLED_APPS = (
+            ...
+            'timezone_field',
+            ...
+        )
+
+Changelog
+------------
+
+*   3.0 (2018-09-15)
+
+    *   Support django 1.11, 2.0, 2.1
+    *   Add support for python 3.7
+    *   Change default human-readable timezone names to exclude underscores
+        (`#32`__ & `#37`__)
+
+
+*   2.1 (2018-03-01)
+
+    *   Add support for django 1.10, 1.11
+    *   Add support for python 3.6
+    *   Add wheel support
+    *   Support bytes in DB fields (`#38`__ & `#39`__)
+
+*   2.0 (2016-01-31)
+
+    *   Drop support for django 1.7, add support for django 1.9
+    *   Drop support for python 3.2, 3.3, add support for python 3.5
+    *   Remove tests from source distribution
+
+*   1.3 (2015-10-12)
+
+    *   Drop support for django 1.6, add support for django 1.8
+    *   Various `bug fixes`__
+
+*   1.2 (2015-02-05)
+
+    *   For form field, changed default list of accepted timezones from
+        `pytz.all_timezones` to `pytz.common_timezones`, to match DB field
+        behavior.
+
+*   1.1 (2014-10-05)
+
+    *   Django 1.7 compatibility
+    *   Added support for formating `choices` kwarg as `[[<str>, <str>], ...]`,
+        in addition to previous format of `[[<pytz.timezone>, <str>], ...]`.
+    *   Changed default list of accepted timezones from `pytz.all_timezones` to
+        `pytz.common_timezones`. If you have timezones in your DB that are in
+        `pytz.all_timezones` but not in `pytz.common_timezones`, this is a
+        backward-incompatible change. Old behavior can be restored by
+        specifying `choices=[(tz, tz) for tz in pytz.all_timezones]` in your
+        model definition.
+
+*   1.0 (2013-08-04)
+
+    *   Initial release as `timezone_field`.
+
+
+Running the Tests
+-----------------
+
+#.  Install `tox`__.
+
+#.  From the repository root, run
+
+    .. code:: sh
+
+        tox
+
+    Postgres will need to be running locally, and sqlite will need to be
+    installed in order for tox to do its job.
+
+Found a Bug?
+------------
+
+To file a bug or submit a patch, please head over to `django-timezone-field on github`__.
+
+Credits
+-------
+
+Originally adapted from `Brian Rosner's django-timezones`__. The full list of contributors is available on `github`__.
+
+
+__ http://pypi.python.org/pypi/pytz/
+__ http://pypi.python.org/pypi/django-timezone-field/
+__ http://www.pip-installer.org/
+__ https://docs.djangoproject.com/en/dev/ref/settings/#installed-apps
+__ https://github.com/mfogel/django-timezone-field/issues/32
+__ https://github.com/mfogel/django-timezone-field/issues/37
+__ https://github.com/mfogel/django-timezone-field/issues/38
+__ https://github.com/mfogel/django-timezone-field/issues/39
+__ https://github.com/mfogel/django-timezone-field/issues?q=milestone%3A1.3
+__ https://tox.readthedocs.org/
+__ https://github.com/mfogel/django-timezone-field/
+__ https://github.com/brosner/django-timezones/
+__ https://github.com/mfogel/django-timezone-field/graphs/contributors

+ 8 - 0
desktop/core/ext-py/django-timezone-field-3.0/setup.cfg

@@ -0,0 +1,8 @@
+[bdist_wheel]
+universal = 1
+
+[egg_info]
+tag_build = 
+tag_date = 0
+tag_svn_revision = 0
+

+ 55 - 0
desktop/core/ext-py/django-timezone-field-3.0/setup.py

@@ -0,0 +1,55 @@
+import re
+from os import path
+from setuptools import setup
+
+
+# read() and find_version() taken from jezdez's python apps, ex:
+# https://github.com/jezdez/django_compressor/blob/develop/setup.py
+
+
+def read(*parts):
+    return open(path.join(path.dirname(__file__), *parts)).read()
+
+
+def find_version(*file_paths):
+    version_file = read(*file_paths)
+    version_match = re.search(r"^__version__ = ['\"]([^'\"]*)['\"]",
+                              version_file, re.M)
+    if version_match:
+        return version_match.group(1)
+    raise RuntimeError("Unable to find version string.")
+
+
+setup(
+    name='django-timezone-field',
+    version=find_version('timezone_field', '__init__.py'),
+    author='Mike Fogel',
+    author_email='mike@fogel.ca',
+    description=(
+        'A Django app providing database and form fields for '
+        'pytz timezone objects.'
+    ),
+    long_description=read('README.rst'),
+    url='http://github.com/mfogel/django-timezone-field/',
+    license='BSD',
+    packages=[
+        'timezone_field',
+    ],
+    install_requires=['django>=1.8', 'pytz'],
+    classifiers=[
+        'Development Status :: 4 - Beta',
+        'Environment :: Web Environment',
+        'Intended Audience :: Developers',
+        'License :: OSI Approved :: BSD License',
+        'Operating System :: OS Independent',
+        'Programming Language :: Python',
+        'Programming Language :: Python :: 2',
+        'Programming Language :: Python :: 2.7',
+        'Programming Language :: Python :: 3',
+        'Programming Language :: Python :: 3.4',
+        'Programming Language :: Python :: 3.5',
+        'Programming Language :: Python :: 3.6',
+        'Topic :: Utilities',
+        'Framework :: Django',
+    ],
+)

+ 5 - 0
desktop/core/ext-py/django-timezone-field-3.0/timezone_field/__init__.py

@@ -0,0 +1,5 @@
+from timezone_field.fields import TimeZoneField
+from timezone_field.forms import TimeZoneFormField
+
+__version__ = '3.0'
+__all__ = ['TimeZoneField', 'TimeZoneFormField']

+ 122 - 0
desktop/core/ext-py/django-timezone-field-3.0/timezone_field/fields.py

@@ -0,0 +1,122 @@
+import pytz
+
+from django.core.exceptions import ValidationError
+from django.db import models
+from django.utils import six
+from django.utils.encoding import force_text
+
+from timezone_field.utils import is_pytz_instance
+
+
+class TimeZoneField(models.Field):
+    """
+    Provides database store for pytz timezone objects.
+
+    Valid inputs:
+        * any instance of pytz.tzinfo.DstTzInfo or pytz.tzinfo.StaticTzInfo
+        * the pytz.UTC singleton
+        * any string that validates against pytz.common_timezones. pytz will
+          be used to build a timezone object from the string.
+        * None and the empty string both represent 'no timezone'
+
+    Valid outputs:
+        * None
+        * instances of pytz.tzinfo.DstTzInfo and pytz.tzinfo.StaticTzInfo
+        * the pytz.UTC singleton
+
+    Blank values are stored in the DB as the empty string. Timezones are stored
+    in their string representation.
+
+    The `choices` kwarg can be specified as a list of either
+    [<pytz.timezone>, <str>] or [<str>, <str>]. Internally, it is stored as
+    [<pytz.timezone>, <str>].
+    """
+
+    description = "A pytz timezone object"
+
+    # NOTE: these defaults are excluded from migrations. If these are changed,
+    #       existing migration files will need to be accomodated.
+    CHOICES = [
+        (pytz.timezone(tz), tz.replace('_', ' '))
+        for tz in pytz.common_timezones
+    ]
+    MAX_LENGTH = 63
+
+    def __init__(self, *args, **kwargs):
+        # allow some use of positional args up until the args we customize
+        # https://github.com/mfogel/django-timezone-field/issues/42
+        # https://github.com/django/django/blob/1.11.11/django/db/models/fields/__init__.py#L145
+        if len(args) > 3:
+            raise ValueError('Cannot specify max_length by positional arg')
+
+        kwargs.setdefault('choices', self.CHOICES)
+        kwargs.setdefault('max_length', self.MAX_LENGTH)
+
+        # Choices can be specified in two forms: either
+        # [<pytz.timezone>, <str>] or [<str>, <str>]
+        #
+        # The [<pytz.timezone>, <str>] format is the one we actually
+        # store the choices in memory because of
+        # https://github.com/mfogel/django-timezone-field/issues/24
+        #
+        # The [<str>, <str>] format is supported because since django
+        # can't deconstruct pytz.timezone objects, migration files must
+        # use an alternate format. Representing the timezones as strings
+        # is the obvious choice.
+        choices = kwargs['choices']
+        if isinstance(choices[0][0], (six.string_types, six.binary_type)):
+            kwargs['choices'] = [(pytz.timezone(n1), n2) for n1, n2 in choices]
+
+        super(TimeZoneField, self).__init__(*args, **kwargs)
+
+    def validate(self, value, model_instance):
+        if not is_pytz_instance(value):
+            raise ValidationError("'%s' is not a pytz timezone object" % value)
+        super(TimeZoneField, self).validate(value, model_instance)
+
+    def deconstruct(self):
+        name, path, args, kwargs = super(TimeZoneField, self).deconstruct()
+        if kwargs['choices'] == self.CHOICES:
+            del kwargs['choices']
+        if kwargs['max_length'] == self.MAX_LENGTH:
+            del kwargs['max_length']
+
+        # django can't decontruct pytz objects, so transform choices
+        # to [<str>, <str>] format for writing out to the migration
+        if 'choices' in kwargs:
+            kwargs['choices'] = [(tz.zone, n) for tz, n in kwargs['choices']]
+
+        return name, path, args, kwargs
+
+    def get_internal_type(self):
+        return 'CharField'
+
+    def get_default(self):
+        # allow defaults to be still specified as strings. Allows for easy
+        # serialization into migration files
+        value = super(TimeZoneField, self).get_default()
+        return self._get_python_and_db_repr(value)[0]
+
+    def from_db_value(self, value, *args):
+        "Convert to pytz timezone object"
+        return self._get_python_and_db_repr(value)[0]
+
+    def to_python(self, value):
+        "Convert to pytz timezone object"
+        return self._get_python_and_db_repr(value)[0]
+
+    def get_prep_value(self, value):
+        "Convert to string describing a valid pytz timezone object"
+        return self._get_python_and_db_repr(value)[1]
+
+    def _get_python_and_db_repr(self, value):
+        "Returns a tuple of (python representation, db representation)"
+        if value is None or value == '':
+            return (None, '')
+        if is_pytz_instance(value):
+            return (value, value.zone)
+        try:
+            return (pytz.timezone(force_text(value)), force_text(value))
+        except pytz.UnknownTimeZoneError:
+            pass
+        raise ValidationError("Invalid timezone '%s'" % value)

+ 23 - 0
desktop/core/ext-py/django-timezone-field-3.0/timezone_field/forms.py

@@ -0,0 +1,23 @@
+import pytz
+from django.core.exceptions import ValidationError
+from django import forms
+
+
+class TimeZoneFormField(forms.TypedChoiceField):
+    def __init__(self, *args, **kwargs):
+
+        def coerce_to_pytz(val):
+            try:
+                return pytz.timezone(val)
+            except pytz.UnknownTimeZoneError:
+                raise ValidationError("Unknown time zone: '%s'" % val)
+
+        defaults = {
+            'coerce': coerce_to_pytz,
+            'choices': [
+                (tz, tz.replace('_', ' ')) for tz in pytz.common_timezones
+            ],
+            'empty_value': None,
+        }
+        defaults.update(kwargs)
+        super(TimeZoneFormField, self).__init__(*args, **defaults)

+ 1 - 0
desktop/core/ext-py/django-timezone-field-3.0/timezone_field/models.py

@@ -0,0 +1 @@
+# intentionally left blank

+ 5 - 0
desktop/core/ext-py/django-timezone-field-3.0/timezone_field/utils.py

@@ -0,0 +1,5 @@
+import pytz
+
+
+def is_pytz_instance(value):
+    return value is pytz.UTC or isinstance(value, pytz.tzinfo.BaseTzInfo)

+ 3 - 3
desktop/core/src/desktop/settings.py

@@ -206,9 +206,6 @@ INSTALLED_APPS = [
     #'django_celery_results',
 ]
 
-if desktop.conf.TASK_SERVER.BEAT_ENABLED.get():
-  INSTALLED_APPS.append('django_celery_beat')
-
 
 WEBPACK_LOADER = {
     'DEFAULT': {
@@ -666,3 +663,6 @@ if desktop.conf.TASK_SERVER.ENABLED.get():
 # CELERYD_USER = desktop.conf.SERVER_USER.get()
 # CELERYD_GROUP = desktop.conf.SERVER_GROUP.get()
 
+  if desktop.conf.TASK_SERVER.BEAT_ENABLED.get():
+    INSTALLED_APPS.append('django_celery_beat')
+    INSTALLED_APPS.append('timezone_field')

+ 2 - 4
tools/docker/README.md

@@ -72,11 +72,9 @@ eth0      Link encap:Ethernet  HWaddr 02:42:ac:11:00:01
           RX bytes:10626 (10.6 KB)  TX bytes:648 (648.0 B)
 ```
 
-![alt text](https://raw.githubusercontent.com/cloudera/hue/master/docs/images/login.png "Hue First Login")
-
-
 ## Next
 
 You can then configure Hue and start using it!
 
-Read more about configuring Hue on our [blog](http://gethue.com/how-to-configure-hue-in-your-hadoop-cluster/). The development version uses the configuration file ``desktop/conf/pseudo-distributed.ini``.
+Read more about configuring Hue on our [blog](http://gethue.com/how-to-configure-hue-in-your-hadoop-cluster/).
+The development version uses the configuration file [``desktop/conf/pseudo-distributed.ini``.](/desktop/conf/pseudo-distributed.ini).