First POC

This commit is contained in:
Yohan Boniface 2012-11-20 10:47:19 +01:00
commit 0cce7f9e2a
28 changed files with 1271 additions and 0 deletions

5
.gitignore vendored Normal file
View file

@ -0,0 +1,5 @@
*.pyc
*.egg-info
youmap/settings/local.py
youmap/settings/local/*
docs/_build

23
README.rst Normal file
View file

@ -0,0 +1,23 @@
YouMap project
==============
Quickstart
----------
To bootstrap the project::
virtualenv youmap
source youmap/bin/activate
cd path/to/youmap/repository
pip install -r requirements.pip
pip install -e .
cp youmap/settings/local.py.example youmap/settings/local.py
manage.py syncdb --migrate
Documentation
-------------
Developer documentation is available in Sphinx format in the docs directory.
Initial installation instructions (including how to build the documentation as
HTML) can be found in docs/install.rst.

88
docs/Makefile Normal file
View file

@ -0,0 +1,88 @@
# Makefile for Sphinx documentation
#
# You can set these variables from the command line.
SPHINXOPTS =
SPHINXBUILD = sphinx-build
PAPER =
# Internal variables.
PAPEROPT_a4 = -D latex_paper_size=a4
PAPEROPT_letter = -D latex_paper_size=letter
ALLSPHINXOPTS = -d _build/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
.PHONY: help clean html dirhtml pickle json htmlhelp qthelp latex changes linkcheck doctest
help:
@echo "Please use \`make <target>' where <target> is one of"
@echo " html to make standalone HTML files"
@echo " dirhtml to make HTML files named index.html in directories"
@echo " pickle to make pickle files"
@echo " json to make JSON files"
@echo " htmlhelp to make HTML files and a HTML help project"
@echo " qthelp to make HTML files and a qthelp project"
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
@echo " changes to make an overview of all changed/added/deprecated items"
@echo " linkcheck to check all external links for integrity"
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
clean:
-rm -rf _build/*
html:
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) _build/html
@echo
@echo "Build finished. The HTML pages are in _build/html."
dirhtml:
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) _build/dirhtml
@echo
@echo "Build finished. The HTML pages are in _build/dirhtml."
pickle:
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) _build/pickle
@echo
@echo "Build finished; now you can process the pickle files."
json:
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) _build/json
@echo
@echo "Build finished; now you can process the JSON files."
htmlhelp:
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) _build/htmlhelp
@echo
@echo "Build finished; now you can run HTML Help Workshop with the" \
".hhp project file in _build/htmlhelp."
qthelp:
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) _build/qthelp
@echo
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
".qhcp project file in _build/qthelp, like this:"
@echo "# qcollectiongenerator _build/qthelp/project.qhcp"
@echo "To view the help file:"
@echo "# assistant -collectionFile _build/qthelp/project.qhc"
latex:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) _build/latex
@echo
@echo "Build finished; the LaTeX files are in _build/latex."
@echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \
"run these through (pdf)latex."
changes:
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) _build/changes
@echo
@echo "The overview file is in _build/changes."
linkcheck:
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) _build/linkcheck
@echo
@echo "Link check complete; look for any errors in the above output " \
"or in _build/linkcheck/output.txt."
doctest:
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) _build/doctest
@echo "Testing of doctests in the sources finished, look at the " \
"results in _build/doctest/output.txt."

195
docs/conf.py Normal file
View file

@ -0,0 +1,195 @@
# -*- coding: utf-8 -*-
#
# youmap documentation build configuration file, created by
# sphinx-quickstart on Wed Aug 19 10:27:46 2009.
#
# This file is execfile()d with the current directory set to its containing dir.
#
# Note that not all possible configuration values are present in this
# autogenerated file.
#
# All configuration values have a default; values that are commented out
# serve to show the default.
import sys, os
import datetime
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
#sys.path.append(os.path.abspath('.'))
# -- General configuration -----------------------------------------------------
# Add any Sphinx extension module names here, as strings. They can be extensions
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
extensions = ['sphinx.ext.autodoc']
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
# The suffix of source filenames.
source_suffix = '.rst'
# The encoding of source files.
#source_encoding = 'utf-8'
# The master toctree document.
master_doc = 'index'
# General information about the project.
project = u'youmap'
copyright = u'%d, myauthor' % datetime.date.today().year
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = '1.0'
# The full version, including alpha/beta/rc tags.
release = '1.0'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#language = None
# There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used:
#today = ''
# Else, today_fmt is used as the format for a strftime call.
#today_fmt = '%B %d, %Y'
# List of documents that shouldn't be included in the build.
#unused_docs = []
# List of directories, relative to source directory, that shouldn't be searched
# for source files.
exclude_trees = ['_build']
# The reST default role (used for this markup: `text`) to use for all documents.
#default_role = None
# If true, '()' will be appended to :func: etc. cross-reference text.
#add_function_parentheses = True
# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
#add_module_names = True
# If true, sectionauthor and moduleauthor directives will be shown in the
# output. They are ignored by default.
#show_authors = False
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
# A list of ignored prefixes for module index sorting.
#modindex_common_prefix = []
# -- Options for HTML output ---------------------------------------------------
# The theme to use for HTML and HTML Help pages. Major themes that come with
# Sphinx are currently 'default' and 'sphinxdoc'.
html_theme = 'default'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
#html_theme_options = {}
# Add any paths that contain custom themes here, relative to this directory.
#html_theme_path = []
# The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<release> documentation".
#html_title = None
# A shorter title for the navigation bar. Default is the same as html_title.
#html_short_title = None
# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
#html_logo = None
# The name of an image file (within the static path) to use as favicon of the
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large.
#html_favicon = None
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format.
#html_last_updated_fmt = '%b %d, %Y'
# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
#html_use_smartypants = True
# Custom sidebar templates, maps document names to template names.
#html_sidebars = {}
# Additional templates that should be rendered to pages, maps page names to
# template names.
#html_additional_pages = {}
# If false, no module index is generated.
#html_use_modindex = True
# If false, no index is generated.
#html_use_index = True
# If true, the index is split into individual pages for each letter.
#html_split_index = False
# If true, links to the reST sources are added to the pages.
#html_show_sourcelink = True
# If true, an OpenSearch description file will be output, and all pages will
# contain a <link> tag referring to it. The value of this option must be the
# base URL from which the finished HTML is served.
#html_use_opensearch = ''
# If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml").
#html_file_suffix = ''
# Output file base name for HTML help builder.
htmlhelp_basename = 'youmapdoc'
# -- Options for LaTeX output --------------------------------------------------
# The paper size ('letter' or 'a4').
#latex_paper_size = 'letter'
# The font size ('10pt', '11pt' or '12pt').
#latex_font_size = '10pt'
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title, author, documentclass [howto/manual]).
latex_documents = [
('index', 'youmap.tex', u'youmap Documentation',
u'myauthor', 'manual'),
]
# The name of an image file (relative to this directory) to place at the top of
# the title page.
#latex_logo = None
# For "manual" documents, if this is true, then toplevel headings are parts,
# not chapters.
#latex_use_parts = False
# Additional stuff for the LaTeX preamble.
#latex_preamble = ''
# Documents to append as an appendix to all manuals.
#latex_appendices = []
# If false, no module index is generated.
#latex_use_modindex = True

28
docs/deployment.rst Normal file
View file

@ -0,0 +1,28 @@
Deployment
==========
Staging/Development
-------------------
`Fabric <http://pypi.python.org/pypi/Fabric>`_ is used to allow developers to
easily push changes to a previously setup development/staging environment.
To get started, install Fabric by running the following command from within
your virtual environment::
pip install fabric==1.4
So see a list of available commands, run the following command from within your
project directory::
fab -l
Some common commands::
fab restart # Restart the web server.
fab update # Just update the repository.
fab push deploy # Push, then fully deploy.
From the within the project directory, you can just run ``fab [command]``.
If you want to run fabric outside of the directory, use::
fab --fabfile /path/to/project/fabfile.py [command]

17
docs/environments.rst Normal file
View file

@ -0,0 +1,17 @@
==================
Environments
==================
When deploying to multiple environments (development, staging, production, etc.), you'll likely want to deploy different configurations. Each environment/configuration should have its own file in ``youmap/settings`` and inherit from ``youmap.settings.base``. A ``dev`` environment is provided as an example.
By default, ``manage.py`` and ``wsgi.py`` will use ``youmap.settings.local`` if no settings module has been defined. To override this, use the standard Django constructs (setting the ``DJANGO_SETTINGS_MODULE`` environment variable or passing in ``--settings=youmap.settings.<env>``). Alternatively, you can symlink your environment's settings to ``youmap/settings/local.py``.
You may want to have different ``wsgi.py`` and ``urls.py`` files for different environments as well. If so, simply follow the directory structure laid out by ``youmap/settings``, for example::
wsgi/
__init__.py
base.py
dev.py
...
The settings files have examples of how to point Django to these specific environments.

19
docs/index.rst Normal file
View file

@ -0,0 +1,19 @@
Welcome to youmap's documentation!
=====================================
Contents:
.. toctree::
:maxdepth: 2
install
environments
deployment
Indices and tables
==================
* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`

57
docs/install.rst Normal file
View file

@ -0,0 +1,57 @@
==================
Installation
==================
Pre-Requisites
===============
* `setuptools <http://pypi.python.org/pypi/setuptools>`_
* `virtualenv <http://pypi.python.org/pypi/virtualenv>`_
To install all of these system dependencies on a Debian-based system, run::
sudo apt-get install python-setuptools
sudo easy_install virtualenv
Creating the Virtual Environment
================================
First, create a clean base environment using virtualenv::
virtualenv youmap
cd youmap
source bin/activate
Installing the Project
======================
Install the requirements and the project source::
cd path/to/your/youmap/repository
pip install -r requirements.pip
pip install -e .
Configuring a Local Environment
===============================
If you're just checking the project out locally, you can copy some example
configuration files to get started quickly::
cp youmap/settings/local.py.example youmap/settings/local.py
manage.py syncdb --migrate
Building Documentation
======================
Documentation is available in ``docs`` and can be built into a number of
formats using `Sphinx <http://pypi.python.org/pypi/Sphinx>`_. To get started::
pip install Sphinx
cd docs
make html
This creates the documentation in HTML format at ``docs/_build/html``.

239
fabfile.py vendored Normal file
View file

@ -0,0 +1,239 @@
from fabric.api import task, env, run, local, roles, cd, execute, hide, puts,\
sudo
import posixpath
import re
env.project_name = 'youmap'
env.repository = 'git@github.com:lincolnloop/youmap.git'
env.local_branch = 'master'
env.remote_ref = 'origin/master'
env.requirements_file = 'requirements.pip'
env.restart_command = 'supervisorctl restart {project_name}'.format(**env)
env.restart_sudo = True
#==============================================================================
# Tasks which set up deployment environments
#==============================================================================
@task
def live():
"""
Use the live deployment environment.
"""
server = 'youmap.com'
env.roledefs = {
'web': [server],
'db': [server],
}
env.system_users = {server: 'www-data'}
env.virtualenv_dir = '/srv/www/{project_name}'.format(**env)
env.project_dir = '{virtualenv_dir}/src/{project_name}'.format(**env)
env.project_conf = '{project_name}.settings.local'.format(**env)
@task
def dev():
"""
Use the development deployment environment.
"""
server = 'youmap.dev.lincolnloop.com'
env.roledefs = {
'web': [server],
'db': [server],
}
env.system_users = {server: 'www-data'}
env.virtualenv_dir = '/srv/www/{project_name}'.format(**env)
env.project_dir = '{virtualenv_dir}/src/{project_name}'.format(**env)
env.project_conf = '{project_name}.conf.local'.format(**env)
# Set the default environment.
dev()
#==============================================================================
# Actual tasks
#==============================================================================
@task
@roles('web', 'db')
def bootstrap(action=''):
"""
Bootstrap the environment.
"""
with hide('running', 'stdout'):
exists = run('if [ -d "{virtualenv_dir}" ]; then echo 1; fi'\
.format(**env))
if exists and not action == 'force':
puts('Assuming {host} has already been bootstrapped since '
'{virtualenv_dir} exists.'.format(**env))
return
sudo('virtualenv {virtualenv_dir}'.format(**env))
if not exists:
sudo('mkdir -p {0}'.format(posixpath.dirname(env.virtualenv_dir)))
sudo('git clone {repository} {project_dir}'.format(**env))
sudo('{virtualenv_dir}/bin/pip install -e {project_dir}'.format(**env))
with cd(env.virtualenv_dir):
sudo('chown -R {user} .'.format(**env))
fix_permissions()
requirements()
puts('Bootstrapped {host} - database creation needs to be done manually.'\
.format(**env))
@task
@roles('web', 'db')
def push():
"""
Push branch to the repository.
"""
remote, dest_branch = env.remote_ref.split('/', 1)
local('git push {remote} {local_branch}:{dest_branch}'.format(
remote=remote, dest_branch=dest_branch, **env))
@task
def deploy(verbosity='normal'):
"""
Full server deploy.
Updates the repository (server-side), synchronizes the database, collects
static files and then restarts the web service.
"""
if verbosity == 'noisy':
hide_args = []
else:
hide_args = ['running', 'stdout']
with hide(*hide_args):
puts('Updating repository...')
execute(update)
puts('Collecting static files...')
execute(collectstatic)
puts('Synchronizing database...')
execute(syncdb)
puts('Restarting web server...')
execute(restart)
@task
@roles('web', 'db')
def update(action='check'):
"""
Update the repository (server-side).
By default, if the requirements file changed in the repository then the
requirements will be updated. Use ``action='force'`` to force
updating requirements. Anything else other than ``'check'`` will avoid
updating requirements at all.
"""
with cd(env.project_dir):
remote, dest_branch = env.remote_ref.split('/', 1)
run('git fetch {remote}'.format(remote=remote,
dest_branch=dest_branch, **env))
with hide('running', 'stdout'):
changed_files = run('git diff-index --cached --name-only '
'{remote_ref}'.format(**env)).splitlines()
if not changed_files and action != 'force':
# No changes, we can exit now.
return
if action == 'check':
reqs_changed = env.requirements_file in changed_files
else:
reqs_changed = False
run('git merge {remote_ref}'.format(**env))
run('find -name "*.pyc" -delete')
run('git clean -df')
fix_permissions()
if action == 'force' or reqs_changed:
# Not using execute() because we don't want to run multiple times for
# each role (since this task gets run per role).
requirements()
@task
@roles('web')
def collectstatic():
"""
Collect static files from apps and other locations in a single location.
"""
dj('collectstatic --link --noinput')
with cd('{virtualenv_dir}/var/static'.format(**env)):
fix_permissions()
@task
@roles('db')
def syncdb(sync=True, migrate=True):
"""
Synchronize the database.
"""
dj('syncdb --migrate --noinput')
@task
@roles('web')
def restart():
"""
Restart the web service.
"""
if env.restart_sudo:
cmd = sudo
else:
cmd = run
cmd(env.restart_command)
@task
@roles('web', 'db')
def requirements():
"""
Update the requirements.
"""
run('{virtualenv_dir}/bin/pip install -r {project_dir}/requirements.txt'\
.format(**env))
with cd('{virtualenv_dir}/src'.format(**env)):
with hide('running', 'stdout', 'stderr'):
dirs = []
for path in run('ls -db1 -- */').splitlines():
full_path = posixpath.normpath(posixpath.join(env.cwd, path))
if full_path != env.project_dir:
dirs.append(path)
if dirs:
fix_permissions(' '.join(dirs))
with cd(env.virtualenv_dir):
with hide('running', 'stdout'):
match = re.search(r'\d+\.\d+', run('bin/python --version'))
if match:
with cd('lib/python{0}/site-packages'.format(match.group())):
fix_permissions()
#==============================================================================
# Helper functions
#==============================================================================
def dj(command):
"""
Run a Django manage.py command on the server.
"""
run('{virtualenv_dir}/bin/manage.py {dj_command} '
'--settings {project_conf}'.format(dj_command=command, **env))
def fix_permissions(path='.'):
"""
Fix the file permissions.
"""
if ' ' in path:
full_path = '{path} (in {cwd})'.format(path=path, cwd=env.cwd)
else:
full_path = posixpath.normpath(posixpath.join(env.cwd, path))
puts('Fixing {0} permissions'.format(full_path))
with hide('running'):
system_user = env.system_users.get(env.host)
if system_user:
run('chmod -R g=rX,o= -- {0}'.format(path))
run('chgrp -R {0} -- {1}'.format(system_user, path))
else:
run('chmod -R go= -- {0}'.format(path))

11
manage.py Normal file
View file

@ -0,0 +1,11 @@
#!/usr/bin/env python
import os
import sys
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE",
"youmap.settings.local")
from django.core.management import execute_from_command_line
execute_from_command_line(sys.argv)

10
requirements.pip Normal file
View file

@ -0,0 +1,10 @@
# This file collects all required third-party applications that are needed
# to run this project. Later you can install all these apps in a row
# using pip. Example::
#
# pip install -r requirements.pip
django==1.4.2
#south==0.7.6
git+git://github.com/petry/django-foundation.git
git+git://github.com/yohanboniface/django-chickpea.git

14
setup.py Normal file
View file

@ -0,0 +1,14 @@
#!/usr/bin/env python
from setuptools import setup, find_packages
setup(
name='youmap',
version='1.0',
description="",
author="Lincoln Loop",
author_email='info@lincolnloop.com',
url='',
packages=find_packages(),
package_data={'youmap': ['static/*.*', 'templates/*.*']},
scripts=['manage.py'],
)

0
youmap/__init__.py Normal file
View file

0
youmap/apps/__init__.py Normal file
View file

View file

125
youmap/settings/base.py Normal file
View file

@ -0,0 +1,125 @@
"""Base settings shared by all environments"""
# Import global settings to make it easier to extend settings.
from django.conf.global_settings import * # pylint: disable=W0614,W0401
#==============================================================================
# Generic Django project settings
#==============================================================================
DEBUG = True
TEMPLATE_DEBUG = DEBUG
SITE_ID = 1
# Local time zone for this installation. Choices can be found here:
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
TIME_ZONE = 'UTC'
USE_TZ = True
USE_I18N = True
USE_L10N = True
LANGUAGE_CODE = 'en'
LANGUAGES = (
('en', 'English'),
)
# Make this unique, and don't share it with anybody.
SECRET_KEY = 'j6fly6aomgo6!3_$v#9kvhw-%wgs1@1l6x+4nr73tmn40=&amp;_@&amp;'
INSTALLED_APPS = (
# 'youmap.apps.',
'chickpea',
'foundation',
#'south',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.admin',
'django.contrib.admindocs',
'django.contrib.gis',
)
#==============================================================================
# Calculation of directories relative to the project module location
#==============================================================================
import os
import sys
import youmap as project_module
PROJECT_DIR = os.path.dirname(os.path.realpath(project_module.__file__))
PYTHON_BIN = os.path.dirname(sys.executable)
ve_path = os.path.dirname(os.path.dirname(os.path.dirname(PROJECT_DIR)))
# Assume that the presence of 'activate_this.py' in the python bin/
# directory means that we're running in a virtual environment.
if os.path.exists(os.path.join(PYTHON_BIN, 'activate_this.py')):
# We're running with a virtualenv python executable.
VAR_ROOT = os.path.join(os.path.dirname(PYTHON_BIN), 'var')
elif ve_path and os.path.exists(os.path.join(ve_path, 'bin',
'activate_this.py')):
# We're running in [virtualenv_root]/src/[project_name].
VAR_ROOT = os.path.join(ve_path, 'var')
else:
# Set the variable root to a path in the project which is
# ignored by the repository.
VAR_ROOT = os.path.join(PROJECT_DIR, 'var')
if not os.path.exists(VAR_ROOT):
os.mkdir(VAR_ROOT)
#==============================================================================
# Project URLS and media settings
#==============================================================================
ROOT_URLCONF = 'youmap.urls'
LOGIN_URL = '/login/'
LOGOUT_URL = '/logout/'
LOGIN_REDIRECT_URL = '/'
STATIC_URL = '/static/'
MEDIA_URL = '/uploads/'
STATIC_ROOT = os.path.join(VAR_ROOT, 'static')
MEDIA_ROOT = os.path.join(VAR_ROOT, 'uploads')
STATICFILES_DIRS = (
os.path.join(PROJECT_DIR, 'static'),
)
#==============================================================================
# Templates
#==============================================================================
TEMPLATE_DIRS = (
os.path.join(PROJECT_DIR, 'templates'),
)
TEMPLATE_CONTEXT_PROCESSORS += (
)
#==============================================================================
# Middleware
#==============================================================================
MIDDLEWARE_CLASSES += (
)
#==============================================================================
# Auth / security
#==============================================================================
AUTHENTICATION_BACKENDS += (
)
#==============================================================================
# Miscellaneous project settings
#==============================================================================
#==============================================================================
# Third party app settings
#==============================================================================

20
youmap/settings/dev.py Normal file
View file

@ -0,0 +1,20 @@
"""Settings for Development Server"""
from youmap.settings.base import * # pylint: disable=W0614,W0401
DEBUG = True
TEMPLATE_DEBUG = DEBUG
VAR_ROOT = '/var/www/youmap'
MEDIA_ROOT = os.path.join(VAR_ROOT, 'uploads')
STATIC_ROOT = os.path.join(VAR_ROOT, 'static')
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'youmap',
# 'USER': 'dbuser',
# 'PASSWORD': 'dbpassword',
}
}
# WSGI_APPLICATION = 'youmap.wsgi.dev.application'

0
youmap/static/.gitignore vendored Normal file
View file

View file

@ -0,0 +1,32 @@
/*
Foundation use a position:relative; on body, which break the 100% rule
on #map
*/
body.map_detail {
width: 100%;
height: 100%;
position: inherit;
}
/* HOME */
.map_fragment {
width: 100%;
}
.map_list .map_fragment {
height: 200px;
}
/* Modals */
.reveal-modal.update-tilelayers {
width: 75%;
max-height: 500px; /* TODO Make it dynamic */
overflow: auto;
margin-left: -35%;
}
/* Global alert */
.alert-box.global {
z-index: 1001;
margin-right: auto;
margin-left: auto;
}

View file

@ -0,0 +1,5 @@
{% extends "base.html" %}
{% block content %}
Not Found
{% endblock %}

14
youmap/templates/500.html Normal file
View file

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<title>{% block head_title %}{% endblock %}</title>
<meta charset="utf-8">
</head>
<body>
<div id="container">
Server Error
</div>
</body>
</html>

View file

@ -0,0 +1,70 @@
<!DOCTYPE html>
<html>
<head>
<title>{% block head_title %}YouMap{% endblock %}</title>
<meta charset="utf-8">
<!-- Included CSS Files (Compressed) -->
<link rel="stylesheet" href="{{ STATIC_URL }}foundation/stylesheets/foundation.css">
<link rel="stylesheet" href="{{ STATIC_URL }}youmap/youmap.css">
<script src="{{ STATIC_URL }}foundation/javascripts/modernizr.foundation.js"></script>
<!-- IE Fix for HTML5 Tags -->
<!--[if lt IE 9]>
<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
{% block extra_head %}
{% endblock extra_head %}
</head>
<body class="{% block body_class %}{% endblock %}">
<div>
{% block content %}
{% endblock %}
</div>
<script src="{{ STATIC_URL }}foundation/javascripts/modernizr.foundation.js"></script>
<script src="{{ STATIC_URL }}foundation/javascripts/jquery.js"></script>
<script src="{{ STATIC_URL }}foundation/javascripts/jquery.foundation.mediaQueryToggle.js"></script>
<script src="{{ STATIC_URL }}foundation/javascripts/jquery.foundation.reveal.js"></script>
<script src="{{ STATIC_URL }}foundation/javascripts/jquery.foundation.orbit.js"></script>
<script src="{{ STATIC_URL }}foundation/javascripts/jquery.foundation.navigation.js"></script>
<script src="{{ STATIC_URL }}foundation/javascripts/jquery.foundation.buttons.js"></script>
<script src="{{ STATIC_URL }}foundation/javascripts/jquery.foundation.tabs.js"></script>
<script src="{{ STATIC_URL }}foundation/javascripts/jquery.foundation.forms.js"></script>
<script src="{{ STATIC_URL }}foundation/javascripts/jquery.foundation.tooltips.js"></script>
<script src="{{ STATIC_URL }}foundation/javascripts/jquery.foundation.accordion.js"></script>
<script src="{{ STATIC_URL }}foundation/javascripts/jquery.placeholder.js"></script>
<script src="{{ STATIC_URL }}foundation/javascripts/jquery.foundation.alerts.js"></script>
{% block bottom_js %}
<script type="text/javascript">
$(document).foundationAlerts();
L.Util.chickpea_modal = function (content, context) {
var $div = $('#reveal-container');
// reset class
$div.attr("class", "");
$div.addClass("reveal-modal");
if (context && context.class) {
$div.addClass(context.class);
}
return $div.empty().html(content).append('<a class="close-reveal-modal">&#215;</a>').reveal();
};
L.Util.chickpea_alert = function (content, level, context) {
console.log("alert", content);
$div = $('<div>').addClass('alert-box success global').html(content);
$div.append('<a href="#" class="close">&times;</a>');
$("body").prepend($div);
};
$('a.reveal').click(function(e) {
e.preventDefault();
var $this = $(this);
$.get($this.attr('href'), function(data) {
return L.Util.chickpea_modal(data.html);
}, 'json');
});
</script>
{% endblock %}
<div id="reveal-container" class="reveal-modal"></div>
</body>
</html>

View file

@ -0,0 +1,31 @@
<h3>Create your map now!</h3>
<form action="{{ action_url }}" method="post" id="map_edit">
{{ form.non_field_errors }}
{% csrf_token %}
{{ form.name }}
{% for error in form.name.errors %}
<small class="error">{{ error|escape }}</small>
{% endfor %}
{{ form.description }}
{{ form.description.errors }}
{{ form.zoom }}
{{ form.center }}
<input type="submit" class="button" />
</form>
<script type="text/javascript">
$("#map_edit").on("submit", function (e) {
e.preventDefault();
L.Util.Xhr.submit_form("map_edit", {
'callback': function (data) {
if (data.redirect) {
window.location = data.redirect;
}
else {
$("#map_edit").parent().empty().append(data.html);
}
},
'dataType': 'json'
});
});
</script>

View file

@ -0,0 +1,41 @@
{% load chickpea_tags %}
<h3>Choose your tilelayers</h3>
<form action="{% url map_update_tilelayers map.pk %}" method="post" id="map_edit">
{% csrf_token %}
<ul class="block-grid four-up mobile">
{% for tilelayer in tilelayers %}
<li>
<label for="tilelayer_{{ forloop.counter }}">
{% tilelayer_preview tilelayer %}<div class="panel">
<input type="checkbox" id="tilelayer_{{ forloop.counter }}" name="tilelayer_{{ forloop.counter }}" value="{{ tilelayer.pk }}" {% if tilelayer in map.tilelayers.all %}checked{% endif %} />
{{ tilelayer.name }}
</div>
</label>
</li>
{% endfor %}
<div class="row twelve columns">
<input type="submit" class="button" />
</div>
</form>
<script type="text/javascript">
$("#map_edit").on("submit", function (e) {
e.preventDefault();
L.Util.Xhr.submit_form("map_edit", {
'callback': function (data) {
if (data.redirect) {
window.location = data.redirect;
}
else if (data.info) {
$div = $('<div>').addClass('alert-box success').html(data.info);
$div.append('<a href="#" class="close">&times;</a>');
$("#map").prepend($div);
}
else {
$("#map_edit").parent().empty().append(data.html);
}
},
'dataType': 'json'
});
});
</script>

View file

@ -0,0 +1,160 @@
{% extends "base.html" %}
{% load chickpea_tags %}
{% block extra_head %}
{% chickpea_css %}
{% chickpea_js %}
{% endblock %}
{% block content %}
<div class="row">
<div class="twelve columns">
<!-- Navigation -->
<nav class="top-bar contain-to-grid">
<ul>
<li class="name"><h1><a href="#">YouMap <em>alpha</em></a></h1></li>
<li class="toggle-topbar"><a href="#"></a></li>
</ul>
<section>
<ul class="left">
<li><a href="#">My maps</a></li>
<li><a href="#">Log in</a></li>
</ul>
<ul class="right">
<li class="search">
<form>
<input type="search">
</form>
</li>
<li class="has-button">
<a class="small button" href="#">Search</a>
</li>
</ul>
</section>
</nav>
<!-- End Navigation -->
</div>
</div>
<div class="row">
<div class="twelve columns">
<div class="row">
<!-- Content -->
<div class="eight columns">
<div class="panel radius">
<div class="row">
<div class="six mobile-two columns">
<h4>YouMap <em>alpha</em></h4><hr/>
<h5 class="subheader">YouMap let you create map with OpenStreetMap layers in a minute and embed them in your site.<br /> This is a demo instance, you can host your own, it's <strong>open source</strong>!
</h5>
</div>
<div class="six mobile-two columns">
<h5>What you can do?</h5>
<ol>
<li>Choose the layers of your map</li>
<li>Add POIs: markers, lines, polygons...</li>
<li>Manage POIs colours and icons</li>
<li>Batch import geostructured data (GEOJson...)</li>
<li>Choose your licence</li>
<li>Embed and share your map</li>
</ol>
</div>
</div>
</div>
</div>
<div class="four columns hide-for-small">
<h4>Action!</h4><hr/>
<a href="{% url map_add %}" class="reveal">
<div class="panel radius callout" align="center">
<strong>Test me</strong>
</div>
</a>
<a href="https://bitbucket.org/yohanboniface/youmap_project">
<div class="panel radius callout" align="center">
<strong>Fork me</strong>
</div>
</a>
</div>
<!-- End Content -->
</div>
</div>
</div>
<div class="row">
<div class="twelve columns">
<hr />
<h2>Browse maps</h2>
</div>
</div>
<div class="row">
<div class="twelve columns">
<div class="row map_list">
{% for map_inst in maps %}
<div class="twelve mobile-six columns">
{% map_fragment map_inst %}
<div class="panel"><strong>{{ map_inst.name }}</strong> — {{ map_inst.description }} <a href="{{ map_inst.get_absolute_url }}">See this map!</a></div>
</div>
{% endfor %}
</div>
</div>
</div>
<!-- Footer -->
<footer class="row">
<div class="twelve columns"><hr />
<div class="row">
<div class="six columns">
<p>&copy; Copyright no one at all. Go to town.</p>
</div>
<div class="six columns">
<ul class="link-list right">
<li><a href="#TODO">About</a></li>
<li><a href="https://bitbucket.org/yohanboniface/youmap_project">Fork me</a></li>
<li><a href="#">Link 3</a></li>
<li><a href="#">Link 4</a></li>
</ul>
</div>
</div>
</div>
</footer>
<!-- End Footer -->
<!-- Included JS Files -->
{% endblock content %}
{% block bottom_js %}
{{ block.super }}
<script type="text/javascript">
$(window).load(function() {
$('#featured').orbit({
fluid: '2x1',
timer: false
});
});
</script>
{% endblock bottom_js %}

23
youmap/urls.py Normal file
View file

@ -0,0 +1,23 @@
from django.conf import settings
from django.conf.urls.static import static
from django.conf.urls.defaults import patterns, url, include
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from django.contrib import admin
from . import views
admin.autodiscover()
urlpatterns = patterns('',
# (r'', include('youmap.apps.')),
(r'^admin/doc/', include('django.contrib.admindocs.urls')),
(r'^admin/', include(admin.site.urls)),
url(r'^$', views.home, name="home"),
(r'', include('chickpea.urls')),
)
if settings.DEBUG and settings.MEDIA_ROOT:
urlpatterns += static(settings.MEDIA_URL,
document_root=settings.MEDIA_ROOT)
urlpatterns += staticfiles_urlpatterns()

15
youmap/views.py Normal file
View file

@ -0,0 +1,15 @@
from django.views.generic import TemplateView
from chickpea.models import Map
class Home(TemplateView):
template_name = "youmap/home.html"
def get_context_data(self, **kwargs):
maps = Map.objects.all()[:20]
return {
"maps": maps
}
home = Home.as_view()

29
youmap/wsgi.py Normal file
View file

@ -0,0 +1,29 @@
"""
WSGI config for youmap project.
This module contains the WSGI application used by Django's development server
and any production WSGI deployments. It should expose a module-level variable
named ``application``. Django's ``runserver`` and ``runfcgi`` commands discover
this application via the ``WSGI_APPLICATION`` setting.
Usually you will have the standard Django WSGI application here, but it also
might make sense to replace the whole Django WSGI application with a custom one
that later delegates to the Django one. For example, you could introduce WSGI
middleware here, or combine a Django application with an application of another
framework.
"""
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE",
"youmap.settings.local")
# This application object is used by any WSGI server configured to use this
# file. This includes Django's development server, if the WSGI_APPLICATION
# setting points here.
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
# Apply WSGI middleware here.
# from helloworld.wsgi import HelloWorldApplication
# application = HelloWorldApplication(application)