From 0464db34aeaac2c37e47e18f82c8e9f05c8f159f Mon Sep 17 00:00:00 2001 From: Garret Wassermann Date: Mon, 20 Mar 2017 02:38:44 -0400 Subject: [PATCH] New demo project with Makefile script for easy demo, testing, and development --- .gitignore | 12 + Makefile | 125 +++++++++++ demo/README.rst | 110 +++++++++ demo/demodesk/config/__init__.py | 0 demo/demodesk/config/settings.py | 208 ++++++++++++++++++ demo/demodesk/config/urls.py | 31 +++ demo/demodesk/config/wsgi.py | 16 ++ demo/demodesk/fixtures/demo.json | 13 ++ demo/demodesk/manage.py | 25 +++ .../helpdesk/attachments/DH-3/3/someinfo.txt | 3 + .../helpdesk/attachments/DH-3/4/helpdesk.png | Bin 0 -> 30229 bytes demo/setup.py | 51 +++++ 12 files changed, 594 insertions(+) create mode 100644 Makefile create mode 100644 demo/README.rst create mode 100644 demo/demodesk/config/__init__.py create mode 100644 demo/demodesk/config/settings.py create mode 100644 demo/demodesk/config/urls.py create mode 100644 demo/demodesk/config/wsgi.py create mode 100644 demo/demodesk/fixtures/demo.json create mode 100755 demo/demodesk/manage.py create mode 100644 demo/demodesk/media/helpdesk/attachments/DH-3/3/someinfo.txt create mode 100644 demo/demodesk/media/helpdesk/attachments/DH-3/4/helpdesk.png create mode 100644 demo/setup.py diff --git a/.gitignore b/.gitignore index 3a412d80..26ae9a31 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,15 @@ docs/doctrees/* .project .pydevproject .directory + +# ignore demo attachments that user might have added +demo/demodesk/media/helpdesk/attachments/* +!demo/demodesk/media/helpdesk/attachments/DH-3 +demo/demodesk/media/helpdesk/attachments/DH-3/* +!demo/demodesk/media/helpdesk/attachments/DH-3/3 +!demo/demodesk/media/helpdesk/attachments/DH-3/4 +demo/demodesk/media/helpdesk/attachments/DH-3/3/* +demo/demodesk/media/helpdesk/attachments/DH-3/4/* +!demo/demodesk/media/helpdesk/attachments/DH-3/3/someinfo.txt +!demo/demodesk/media/helpdesk/attachments/DH-3/4/helpdesk.png + diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..601799cf --- /dev/null +++ b/Makefile @@ -0,0 +1,125 @@ +# Shortcuts for django-helpdesk testing and development using make +# +# For standard installation of django-helpdesk as a library, +# see INSTALL and the documentation in docs/. +# +# For details about how to develop django-helpdesk, +# see CONTRIBUTING.rst. +PIP = pip3 +TOX = tox + + +#: help - Display callable targets. +.PHONY: help +help: + @echo "django-helpdesk make shortcuts" + @echo "Here are available targets:" + @egrep -o "^#: (.+)" [Mm]akefile | sed 's/#: /* /' + + +#: develop - Install minimal development utilities for Python3 +.PHONY: develop +develop: + $(PIP) install -e . + +#: develop - Install minimal development utilities for Python2 +.PHONY: develop2 +develop2: + pip2 install -e . + + +#: clean - Basic cleanup, mostly temporary files. +.PHONY: clean +clean: + find . -name "*.pyc" -delete + find . -name '*.pyo' -delete + find . -name "__pycache__" -delete + + +#: distclean - Remove local builds, such as *.egg-info. +.PHONY: distclean +distclean: clean + rm -rf *.egg + rm -rf *.egg-info + rm -rf demo/*.egg-info + # remove the django-created database + rm -f demo/demodesk/*.sqlite3 + + +#: maintainer-clean - Remove almost everything that can be re-generated. +.PHONY: maintainer-clean +maintainer-clean: distclean + rm -rf build/ + rm -rf dist/ + rm -rf .tox/ + + +#: test - Run test suites. +.PHONY: test +test: + mkdir -p var + $(PIP) install -e .[test] + $(TOX) + + +#: documentation - Build documentation (Sphinx, README, ...) +.PHONY: documentation +documentation: sphinx readme + + +#: sphinx - Build Sphinx documentation (docs). +.PHONY: sphinx +sphinx: + $(TOX) -e sphinx + + +#: readme - Build standalone documentation files (README, CONTRIBUTING...). +.PHONY: readme +readme: + $(TOX) -e readme + + +#: demo - Setup demo project using Python3. +.PHONY: demo +demo: + $(PIP) install -e . + $(PIP) install -e demo + demodesk migrate --noinput + # Create superuser; user will be prompted to manually set a password + # When you get a prompt, enter a password of your choosing. + # We suggest a default of 'Test1234' for the demo project. + demodesk createsuperuser --username admin --email helpdesk@example.com + # Install fixtures + demodesk loaddata emailtemplate.json + demodesk loaddata demo.json + +#: demo - Setup demo project using Python2. +.PHONY: demo2 +demo2: + pip2 install -e . + pip2 install -e demo + demodesk migrate --noinput + # Create superuser; user will be prompted to manually set a password. + # When you get a prompt, enter a password of your choosing. + # We suggest a default of 'Test1234' for the demo project. + demodesk createsuperuser --username admin --email helpdesk@example.com + # Install fixtures (helpdesk templates as well as demo ticket data) + demodesk loaddata emailtemplate.json + demodesk loaddata demo.json + + +#: runserver - Run demo server using Python3 +.PHONY: rundemo +rundemo: demo + demodesk runserver 8080 + +#: runserver - Run demo server using Python2 +.PHONY: rundemo2 +rundemo2: demo2 + demodesk runserver 8080 + + +#: release - Tag and push to PyPI. +.PHONY: release +release: + $(TOX) -e release diff --git a/demo/README.rst b/demo/README.rst new file mode 100644 index 00000000..548bb850 --- /dev/null +++ b/demo/README.rst @@ -0,0 +1,110 @@ +django-helpdesk Demo Project +============================ + +This folder contains a demo Django project that +illustrates a simple django-helpdesk installation +with common settings. + +This project is *NOT* production ready, but can be +used as a template to get started. + +In particular, this should be useful for testing +purposes and for those that want to contribute +to development of django-helpdesk. For more information +on contributing, see the CONTRIBUTING.rst file +in the top level of the django-helpdesk directory. + +Running the demo +---------------- + +By default, the demo is configured for Python 3. + +While not recommended, the simplest way to get +started is to simply install django-helpdesk +to your system python package directory. +Ideally, you'd use a virtualenv instead +(see below for details). + +To use your system directory, from the top-level +django-helpdesk directory, simply run: + + sudo make rundemo + +Once the console gives a prompt that the HTTP +server is listening, open your web browser +and navigate to: + + localhost:8080 + +You should see the django-helpdesk public web portal! + +If you shut down the server, you can't immediately +re-run the demo because the make commands would +encounter problems trying to re-write the database. +Instead, before running the demo, you will need +to first clean the demo: + + sudo make distclean + +You may need to use sudo with other make targets too. + +*NOTE ON USING VIRTUALENV* + +Rather than using the system python, you probably +want to use a virtualenv. + +If so, you might change the pip in the makefile +to point to your virtualenv's pip instead +before running: + + make rundemo + +*NOTE ON USING PYTHON 2* + +By default, the demo uses Python 3, as Python 3 +will be the recommended version of python for +django-helpdesk and even Django itself in the near future. +However, if you wish to use Python 2, you can +instead run the following: + + sudo make rundemo2 + +Then navigate to the site in a browser as above. + +*NOTE ON DJANGO VERISON* + +The demo project was also created with Django 1.10 +in mind. If you are using a different version of Django, +slight tweaks might be necessary to make the demo work. + +*NOTE ON ATTACHMENTS* + +The folder: + + demo/demodesk/media/helpdesk/attachments + +comes pre-populated with a couple of attachments, +to demo how django-helpdesk deals with attachments. +You can look in this folder to see the raw data. +You can also create a different folder for this +and update settings.py, but note that this will +break the demo as some attachments may not be available +unless you migrate the existing data to the +new location. + +The demodesk project +-------------------- + +"demodesk" is the name of our demo Django project. + +You probably will want to look at demo/demodesk/config/settings.py +and read the comments, which walk you through a basic +installation with common configuration options. + +The top-level Makefile also gives a list of commands so you +can see how to get the project running. Of course, +when you plan to deploy this project, it is recommended +to use a "real" HTTP server like apache or nginx, +and so further configuration will be necessary. + +More information can be found in the top-level docs/ folder. diff --git a/demo/demodesk/config/__init__.py b/demo/demodesk/config/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/demo/demodesk/config/settings.py b/demo/demodesk/config/settings.py new file mode 100644 index 00000000..dde89105 --- /dev/null +++ b/demo/demodesk/config/settings.py @@ -0,0 +1,208 @@ +""" +Django settings for django-helpdesk demodesk project. + +Generated by 'django-admin startproject' using Django 1.10.2. + +For more information on this file, see +https://docs.djangoproject.com/en/1.10/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/1.10/ref/settings/ +""" + +import os + +# Build paths inside the project like this: os.path.join(BASE_DIR, ...) +BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/1.10/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = '_crkn1+fnzu5$vns_-d+^ayiq%z4k*s!!ag0!mfy36(y!vrazd' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'django.contrib.sites', + 'django.contrib.humanize', + 'bootstrapform', + 'helpdesk' +] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'demodesk.config.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'demodesk.config.wsgi.application' + + +# django-helpdesk configuration settings +# You can override django-helpdesk's defaults by redefining them here. +# To see what settings are available, see the docs/configuration.rst +# file for more information. +# Some common settings are below. + +HELPDESK_DEFAULT_SETTINGS = { + 'use_email_as_submitter': True, + 'email_on_ticket_assign': True, + 'email_on_ticket_change': True, + 'login_view_ticketlist': True, + 'email_on_ticket_apichange': True, + 'preset_replies': True, + 'tickets_per_page': 25 +} + +# Should the public web portal be enabled? +HELPDESK_PUBLIC_ENABLED = True +HELPDESK_VIEW_A_TICKET_PUBLIC = True +HELPDESK_SUBMIT_A_TICKET_PUBLIC = True + +# Should the Knowledgebase be enabled? +HELPDESK_KB_ENABLED = True + +# Instead of showing the public web portal first, +# we can instead redirect users straight to the login page. +HELPDESK_REDIRECT_TO_LOGIN_BY_DEFAULT = False +LOGIN_URL = '/login/' +LOGIN_REDIRECT_URL = '/login/' + + +# Database +# - by default, we use SQLite3 for the demo, but you can also +# configure MySQL or PostgreSQL, see the docs for more: +# https://docs.djangoproject.com/en/1.10/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), + } +} + + +# Sites +# - this allows hosting of more than one site from a single server, +# in practice you can probably just leave this default if you only +# host a single site, but read more in the docs: +# https://docs.djangoproject.com/en/1.10/ref/contrib/sites/ + +SITE_ID = 1 + + +# Sessions +# https://docs.djangoproject.com/en/1.10/topics/http/sessions + +SESSION_COOKIE_AGE = 86400 # = 1 day + +# For better default security, set these cookie flags, but +# these are likely to cause problems when testing locally +#CSRF_COOKIE_SECURE = True +#SESSION_COOKIE_SECURE = True +#CSRF_COOKIE_HTTPONLY = True +#SESSION_COOKIE_HTTPONLY = True + + +# Password validation +# https://docs.djangoproject.com/en/1.10/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + +# Email +# https://docs.djangoproject.com/en/1.10/topics/email/ + +# This demo uses the console backend, which simply prints emails to the console +# rather than actually sending them out. +DEFAULT_FROM_EMAIL = 'helpdesk@example.com' +SERVER_EMAIL = 'helpdesk@example.com' +EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' + +# If you want to test sending real emails, uncomment and modify the following: +#EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' +#EMAIL_HOST = 'smtp.example.com' +#EMAIL_PORT = '25' + +# Internationalization +# https://docs.djangoproject.com/en/1.10/topics/i18n/ + +# By default, django-helpdesk uses en, but other languages are also available. +# The most complete translations are: es-MX, ru +# Contribute to our translations via Transifex if you can! +# See CONTRIBUTING.rst for more info. +LANGUAGE_CODE = 'en-US' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_L10N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/1.10/howto/static-files/ + +STATIC_URL = '/static/' + +# MEDIA_ROOT is where media uploads are stored. +# We set this to a directory to host file attachments created +# with tickets. +MEDIA_URL = '/media/' +MEDIA_ROOT = os.path.join(BASE_DIR, 'media') + +# Fixtures +# https://docs.djangoproject.com/en/1.10/ref/settings/#std:setting-FIXTURE_DIRS +# - This is only necessary to make the demo project work, not needed for +# your own projects unless you make your own fixtures +FIXTURE_DIRS = [os.path.join(BASE_DIR, 'fixtures')] diff --git a/demo/demodesk/config/urls.py b/demo/demodesk/config/urls.py new file mode 100644 index 00000000..0c37aac6 --- /dev/null +++ b/demo/demodesk/config/urls.py @@ -0,0 +1,31 @@ +"""django-helpdesk demodesk URL Configuration + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/1.10/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.conf.urls import url, include + 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) +""" +from django.conf.urls import url, include +from django.contrib import admin +from django.conf import settings +from django.conf.urls.static import static + + +# The following uses the static() helper function, +# which only works when in development mode (using DEBUG). +# For a real deployment, you'd have to properly configure a media server. +# For more information, see: +# https://docs.djangoproject.com/en/1.10/howto/static-files/ + +urlpatterns = [ + url(r'^admin/', admin.site.urls), + url(r'^', include('helpdesk.urls', namespace='helpdesk')), +] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) diff --git a/demo/demodesk/config/wsgi.py b/demo/demodesk/config/wsgi.py new file mode 100644 index 00000000..f8e39f59 --- /dev/null +++ b/demo/demodesk/config/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for django-helpdesk demodesk project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/1.10/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "demodesk.config.settings") + +application = get_wsgi_application() diff --git a/demo/demodesk/fixtures/demo.json b/demo/demodesk/fixtures/demo.json new file mode 100644 index 00000000..b921f295 --- /dev/null +++ b/demo/demodesk/fixtures/demo.json @@ -0,0 +1,13 @@ +[ + {"model": "helpdesk.queue", "pk": 1, "fields": {"title": "Django Helpdesk", "slug": "DH", "email_address": "django-helpdesk@example.com", "locale": "en-US", "allow_public_submission": true, "allow_email_submission": true, "escalate_days": 5, "new_ticket_cc": "", "updated_ticket_cc": "", "email_box_type": null, "email_box_host": "", "email_box_port": null, "email_box_ssl": false, "email_box_user": "", "email_box_pass": "", "email_box_imap_folder": "", "email_box_local_dir": "", "permission_name": "helpdesk.queue_access_DH", "email_box_interval": 5, "email_box_last_check": null, "socks_proxy_type": null, "socks_proxy_host": null, "socks_proxy_port": null, "logging_type": null, "logging_dir": "", "default_owner": null}}, + {"model": "helpdesk.queue", "pk": 2, "fields": {"title": "Some Product", "slug": "SP", "email_address": "sp-help@example.com", "locale": "en-US", "allow_public_submission": true, "allow_email_submission": true, "escalate_days": null, "new_ticket_cc": "", "updated_ticket_cc": "", "email_box_type": null, "email_box_host": "", "email_box_port": null, "email_box_ssl": false, "email_box_user": "", "email_box_pass": "", "email_box_imap_folder": "", "email_box_local_dir": "", "permission_name": "helpdesk.queue_access_SP", "email_box_interval": 5, "email_box_last_check": null, "socks_proxy_type": null, "socks_proxy_host": null, "socks_proxy_port": null, "logging_type": null, "logging_dir": "", "default_owner": null}}, + {"model": "helpdesk.ticket", "pk": 1, "fields": {"title": "Some django-helpdesk Problem", "queue": 1, "created": "2017-03-20T04:52:18.321Z", "modified": "2017-03-20T04:52:18.561Z", "submitter_email": "helpdesk@example.com", "assigned_to": null, "status": 1, "on_hold": false, "description": "I'm having some problem with django-helpdesk that I need help with.", "resolution": null, "priority": 3, "due_date": "2017-03-04T00:00:00Z", "last_escalation": null}}, + {"model": "helpdesk.followup", "pk": 1, "fields": {"ticket": 1, "date": "2017-03-20T04:52:18.561Z", "title": "Ticket Opened", "comment": "I'm having some problem with django-helpdesk that I need help with.", "public": true, "user": 1, "new_status": null}}, + {"model": "helpdesk.ticket", "pk": 2, "fields": {"title": "Something else", "queue": 2, "created": "2017-03-20T04:54:53.001Z", "modified": "2017-03-20T04:54:53.031Z", "submitter_email": "helpdesk@example.com", "assigned_to": null, "status": 1, "on_hold": false, "description": "Something else with some other product. Not a big deal.", "resolution": null, "priority": 4, "due_date": "2017-03-01T00:00:00Z", "last_escalation": null}}, + {"model": "helpdesk.followup", "pk": 2, "fields": {"ticket": 2, "date": "2017-03-20T04:54:53.031Z", "title": "Ticket Opened", "comment": "Something else with some other product. Not a big deal.", "public": true, "user": 1, "new_status": null}}, + {"model": "helpdesk.ticket", "pk": 3, "fields": {"title": "Something with an attachment", "queue": 1, "created": "2017-03-20T05:14:36.320Z", "modified": "2017-03-20T05:28:28.695Z", "submitter_email": "helpdesk@example.com", "assigned_to": null, "status": 1, "on_hold": false, "description": "WHOA!", "resolution": null, "priority": 1, "due_date": null, "last_escalation": null}}, + {"model": "helpdesk.followup", "pk": 3, "fields": {"ticket": 3, "date": "2017-03-20T05:14:36.345Z", "title": "Ticket Opened", "comment": "WHOA!", "public": true, "user": 1, "new_status": null}}, + {"model": "helpdesk.attachment", "pk": 1, "fields": {"followup": 3, "file": "helpdesk/attachments/DH-3/3/someinfo.txt", "filename": "someinfo.txt", "mime_type": "text/plain", "size": 56}}, + {"model": "helpdesk.followup", "pk": 4, "fields": {"ticket": 3, "date": "2017-03-20T05:28:28.458Z", "title": "Comment", "comment": "An image attachment goes here!", "public": true, "user": 1, "new_status": null}}, + {"model": "helpdesk.attachment", "pk": 2, "fields": {"followup": 4, "file": "helpdesk/attachments/DH-3/4/helpdesk.png", "filename": "helpdesk.png", "mime_type": "image/png", "size": 30229}} +] diff --git a/demo/demodesk/manage.py b/demo/demodesk/manage.py new file mode 100755 index 00000000..3427b7bc --- /dev/null +++ b/demo/demodesk/manage.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python +import os +import sys + +def main(): + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "demodesk.config.settings") + try: + from django.core.management import execute_from_command_line + except ImportError: + # The above import may fail for some other reason. Ensure that the + # issue is really that Django is missing to avoid masking other + # exceptions on Python 2. + try: + import django + except ImportError: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) + raise + execute_from_command_line(sys.argv) + +if __name__ == "__main__": + main() diff --git a/demo/demodesk/media/helpdesk/attachments/DH-3/3/someinfo.txt b/demo/demodesk/media/helpdesk/attachments/DH-3/3/someinfo.txt new file mode 100644 index 00000000..5259f04e --- /dev/null +++ b/demo/demodesk/media/helpdesk/attachments/DH-3/3/someinfo.txt @@ -0,0 +1,3 @@ +Here's a report about a bug. + +Some stuff would go here. diff --git a/demo/demodesk/media/helpdesk/attachments/DH-3/4/helpdesk.png b/demo/demodesk/media/helpdesk/attachments/DH-3/4/helpdesk.png new file mode 100644 index 0000000000000000000000000000000000000000..584db6142c42ae773a9fb8ae8aeab94d9876d746 GIT binary patch literal 30229 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

FrZ0uRyawD}IrpmHDGJj91xs#~WFdf<{WT4~a__ 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 P{h_i_N|NOgZ$A7l0edsm literal 0 HcmV?d00001 diff --git a/demo/setup.py b/demo/setup.py new file mode 100644 index 00000000..02a18ebb --- /dev/null +++ b/demo/setup.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +"""Python packaging.""" + +from __future__ import unicode_literals + +from setuptools import setup +import os + +here = os.path.abspath(os.path.dirname(__file__)) +project_root = os.path.dirname(here) + + +NAME = 'django-helpdesk-demodesk' +DESCRIPTION = 'A demo Django project using django-helpdesk' +README = open(os.path.join(here, 'README.rst')).read() +VERSION = '0.2.0' +#VERSION = open(os.path.join(project_root, 'VERSION')).read().strip() +AUTHOR = 'django-helpdesk team' +URL = 'https://github.com/django-helpdesk/django-helpdesk' +CLASSIFIERS = ['Development Status :: 4 - Beta', + 'License :: OSI Approved :: BSD License', + 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3.4', + 'Programming Language :: Python :: 3.5', + 'Programming Language :: Python :: 3.6', + 'Framework :: Django'] +KEYWORDS = [] +PACKAGES = ['demodesk'] +REQUIREMENTS = [ + 'django-helpdesk' + ] +ENTRY_POINTS = { + 'console_scripts': ['demodesk = demodesk.manage:main'] +} + + +if __name__ == '__main__': # Don't run setup() when we import this module. + setup(name=NAME, + version=VERSION, + description=DESCRIPTION, + long_description=README, + classifiers=CLASSIFIERS, + keywords=' '.join(KEYWORDS), + author=AUTHOR, + url=URL, + license='BSD', + packages=PACKAGES, + include_package_data=True, + zip_safe=False, + install_requires=REQUIREMENTS, + entry_points=ENTRY_POINTS)