├── .gitignore
├── AGPLv3.TXT
├── CHANGELOG.rst
├── README.rst
├── copyright.rst
├── db_migration
├── README.rst
├── migrate.sql
└── move_schema.sql
├── grical
├── ABOUT.TXT
├── USAGE.TXT
├── __init__.py
├── accounts
│ ├── __init__.py
│ └── views.py
├── celery.py
├── contact_form
│ ├── LICENSE.txt
│ ├── __init__.py
│ ├── forms.py
│ ├── locale
│ │ ├── da
│ │ │ └── LC_MESSAGES
│ │ │ │ ├── django.mo
│ │ │ │ └── django.po
│ │ ├── de
│ │ │ └── LC_MESSAGES
│ │ │ │ ├── django.mo
│ │ │ │ └── django.po
│ │ ├── es
│ │ │ └── LC_MESSAGES
│ │ │ │ ├── django.mo
│ │ │ │ └── django.po
│ │ ├── eu
│ │ │ └── LC_MESSAGES
│ │ │ │ ├── django.mo
│ │ │ │ └── django.po
│ │ ├── fi
│ │ │ └── LC_MESSAGES
│ │ │ │ ├── django.mo
│ │ │ │ └── django.po
│ │ ├── fr
│ │ │ └── LC_MESSAGES
│ │ │ │ ├── django.mo
│ │ │ │ └── django.po
│ │ ├── hr
│ │ │ └── LC_MESSAGES
│ │ │ │ ├── django.mo
│ │ │ │ └── django.po
│ │ ├── no
│ │ │ └── LC_MESSAGES
│ │ │ │ ├── django.mo
│ │ │ │ └── django.po
│ │ ├── pl
│ │ │ └── LC_MESSAGES
│ │ │ │ ├── django.mo
│ │ │ │ └── django.po
│ │ ├── ru
│ │ │ └── LC_MESSAGES
│ │ │ │ ├── django.mo
│ │ │ │ └── django.po
│ │ └── sv
│ │ │ └── LC_MESSAGES
│ │ │ ├── django.mo
│ │ │ └── django.po
│ ├── urls.py
│ └── views.py
├── context_processors.py
├── data
│ ├── __init__.py
│ ├── fixtures
│ │ └── borders.json
│ ├── migrations
│ │ ├── 0001_initial.py
│ │ ├── 0002_country_continent_borders_initial_data.py
│ │ └── __init__.py
│ └── models.py
├── events
│ ├── __init__.py
│ ├── admin.py
│ ├── decorators.py
│ ├── feeds.py
│ ├── forms.py
│ ├── management
│ │ ├── __init__.py
│ │ └── commands
│ │ │ ├── __init__.py
│ │ │ ├── cleanupinvitations.py
│ │ │ ├── createrevisioninfo.py
│ │ │ ├── createuser.py
│ │ │ ├── graph.py
│ │ │ └── imap.py
│ ├── migrations
│ │ ├── 0001_initial.py
│ │ └── __init__.py
│ ├── models.py
│ ├── search.py
│ ├── tables.py
│ ├── tasks.py
│ ├── templatetags
│ │ ├── __init__.py
│ │ ├── event_tags.py
│ │ └── urlsearch.py
│ ├── tests
│ │ ├── __init__.py
│ │ ├── test_doctests.py
│ │ ├── test_main.py
│ │ ├── test_models.py
│ │ ├── test_utils.py
│ │ └── test_views.py
│ ├── urls.py
│ ├── utils.py
│ └── views.py
├── middlewares.py
├── settings
│ ├── __init__.py
│ ├── development.py
│ └── settings_base.py
├── static
│ ├── agpl3.png
│ ├── android-icon-144x144.png
│ ├── android-icon-192x192.png
│ ├── android-icon-36x36.png
│ ├── android-icon-48x48.png
│ ├── android-icon-72x72.png
│ ├── android-icon-96x96.png
│ ├── apple-icon-114x114.png
│ ├── apple-icon-120x120.png
│ ├── apple-icon-144x144.png
│ ├── apple-icon-152x152.png
│ ├── apple-icon-180x180.png
│ ├── apple-icon-57x57.png
│ ├── apple-icon-60x60.png
│ ├── apple-icon-72x72.png
│ ├── apple-icon-76x76.png
│ ├── apple-icon-precomposed.png
│ ├── apple-icon.png
│ ├── cc-by-sa-germany.png
│ ├── css
│ │ └── base.css
│ ├── dates-icon.png
│ ├── deadlines-icon.png
│ ├── favicon-16x16.png
│ ├── favicon-32x32.png
│ ├── favicon-96x96.png
│ ├── favicon.ico
│ ├── flags
│ ├── flattr-badge-large.png
│ ├── fonts
│ │ ├── glyphicons-halflings-regular.eot
│ │ ├── glyphicons-halflings-regular.svg
│ │ ├── glyphicons-halflings-regular.ttf
│ │ ├── glyphicons-halflings-regular.woff
│ │ └── glyphicons-halflings-regular.woff2
│ ├── grical-70.png
│ ├── grical-90.png
│ ├── grical-logo-v4-317x90.png
│ ├── icalicon.png
│ ├── icalrecurrencesicon.png
│ ├── js
│ │ ├── datepicker.js
│ │ └── selectpicker.js
│ ├── links-icon.png
│ ├── manifest.json
│ ├── marker_red.png
│ ├── markers
│ │ ├── bunt3.tar
│ │ ├── color_0_nr_0.png
│ │ ├── color_0_nr_1.png
│ │ ├── color_0_nr_2.png
│ │ ├── color_0_nr_3.png
│ │ ├── color_0_nr_4.png
│ │ ├── color_0_nr_5.png
│ │ ├── color_0_nr_6.png
│ │ ├── color_0_nr_7.png
│ │ ├── color_0_nr_8.png
│ │ ├── color_0_nr_9.png
│ │ ├── color_1_nr_0.png
│ │ ├── color_1_nr_1.png
│ │ ├── color_1_nr_2.png
│ │ ├── color_1_nr_3.png
│ │ ├── color_1_nr_4.png
│ │ ├── color_1_nr_5.png
│ │ ├── color_1_nr_6.png
│ │ ├── color_1_nr_7.png
│ │ ├── color_1_nr_8.png
│ │ ├── color_1_nr_9.png
│ │ ├── color_2_nr_0.png
│ │ ├── color_2_nr_1.png
│ │ ├── color_2_nr_2.png
│ │ ├── color_2_nr_3.png
│ │ ├── color_2_nr_4.png
│ │ ├── color_2_nr_5.png
│ │ ├── color_2_nr_6.png
│ │ ├── color_2_nr_7.png
│ │ ├── color_2_nr_8.png
│ │ ├── color_2_nr_9.png
│ │ ├── color_3_nr_0.png
│ │ ├── color_3_nr_1.png
│ │ ├── color_3_nr_2.png
│ │ ├── color_3_nr_3.png
│ │ ├── color_3_nr_4.png
│ │ ├── color_3_nr_5.png
│ │ ├── color_3_nr_6.png
│ │ ├── color_3_nr_7.png
│ │ ├── color_3_nr_8.png
│ │ ├── color_3_nr_9.png
│ │ ├── color_4_nr_0.png
│ │ ├── color_4_nr_1.png
│ │ ├── color_4_nr_2.png
│ │ ├── color_4_nr_3.png
│ │ ├── color_4_nr_4.png
│ │ ├── color_4_nr_5.png
│ │ ├── color_4_nr_6.png
│ │ ├── color_4_nr_7.png
│ │ ├── color_4_nr_8.png
│ │ ├── color_4_nr_9.png
│ │ ├── color_5_nr_0.png
│ │ ├── color_5_nr_1.png
│ │ ├── color_5_nr_2.png
│ │ ├── color_5_nr_3.png
│ │ ├── color_5_nr_4.png
│ │ ├── color_5_nr_5.png
│ │ ├── color_5_nr_6.png
│ │ ├── color_5_nr_7.png
│ │ ├── color_5_nr_8.png
│ │ ├── color_5_nr_9.png
│ │ ├── color_6_nr_0.png
│ │ ├── color_6_nr_1.png
│ │ ├── color_6_nr_2.png
│ │ ├── color_6_nr_3.png
│ │ ├── color_6_nr_4.png
│ │ ├── color_6_nr_5.png
│ │ ├── color_6_nr_6.png
│ │ ├── color_6_nr_7.png
│ │ ├── color_6_nr_8.png
│ │ ├── color_6_nr_9.png
│ │ ├── color_7_nr_0.png
│ │ ├── color_7_nr_1.png
│ │ ├── color_7_nr_2.png
│ │ ├── color_7_nr_3.png
│ │ ├── color_7_nr_4.png
│ │ ├── color_7_nr_5.png
│ │ ├── color_7_nr_6.png
│ │ ├── color_7_nr_7.png
│ │ ├── color_7_nr_8.png
│ │ ├── color_7_nr_9.png
│ │ ├── color_8_nr_0.png
│ │ ├── color_8_nr_1.png
│ │ ├── color_8_nr_2.png
│ │ ├── color_8_nr_3.png
│ │ ├── color_8_nr_4.png
│ │ ├── color_8_nr_5.png
│ │ ├── color_8_nr_6.png
│ │ ├── color_8_nr_7.png
│ │ ├── color_8_nr_8.png
│ │ ├── color_8_nr_9.png
│ │ ├── color_9_nr_0.png
│ │ ├── color_9_nr_1.png
│ │ ├── color_9_nr_2.png
│ │ ├── color_9_nr_3.png
│ │ ├── color_9_nr_4.png
│ │ ├── color_9_nr_5.png
│ │ ├── color_9_nr_6.png
│ │ ├── color_9_nr_7.png
│ │ ├── color_9_nr_8.png
│ │ └── color_9_nr_9.png
│ ├── ms-icon-144x144.png
│ ├── ms-icon-150x150.png
│ ├── ms-icon-310x310.png
│ ├── ms-icon-70x70.png
│ ├── open-data-80x15-blue.png
│ ├── os_80x15_blue.png
│ ├── rssicon.png
│ ├── tags-icon.png
│ ├── venue-icon.png
│ └── wikipedia_banner_125x125.jpg
├── tagging
│ ├── __init__.py
│ ├── admin.py
│ ├── fields.py
│ ├── forms.py
│ ├── generic.py
│ ├── managers.py
│ ├── migrations
│ │ ├── 0001_initial.py
│ │ └── __init__.py
│ ├── models.py
│ ├── settings.py
│ ├── templatetags
│ │ ├── __init__.py
│ │ └── tagging_tags.py
│ ├── tests
│ │ ├── __init__.py
│ │ ├── models.py
│ │ ├── settings.py.old
│ │ ├── tags.txt
│ │ └── tests.py
│ ├── utils.py
│ └── views.py
├── templates
│ ├── 404.html
│ ├── README.TXT
│ ├── accounts
│ │ ├── cookies_not_enabled.html
│ │ └── profile.html
│ ├── admin
│ │ └── base_site.html
│ ├── also_recurrences_form.html
│ ├── base.html
│ ├── base_main.html
│ ├── boxes.html
│ ├── comments
│ │ ├── form.html
│ │ ├── posted.html
│ │ └── preview.html
│ ├── contact_form
│ │ ├── contact_form.html
│ │ ├── contact_form.txt
│ │ ├── contact_form_sent.html
│ │ └── contact_form_subject.txt
│ ├── event_delete.html
│ ├── event_deleted.html
│ ├── event_edit.html
│ ├── event_edit_raw.html
│ ├── event_edit_recurrences.html
│ ├── event_history.html
│ ├── event_new_raw.html
│ ├── event_options.html
│ ├── event_show_all.html
│ ├── event_show_medium.html
│ ├── event_show_raw.html
│ ├── event_show_small.html
│ ├── event_show_small_start.html
│ ├── event_undelete_error.html
│ ├── events_xml.txt
│ ├── filter_edit.html
│ ├── group_list.html
│ ├── groups
│ │ ├── add_event_to_group.html
│ │ ├── create.html
│ │ ├── group_view.html
│ │ ├── groups_coming_events.html
│ │ ├── invitation_activate.html
│ │ ├── invitation_activate_failed.html
│ │ ├── invitation_email.txt
│ │ ├── invitation_email_subject.txt
│ │ ├── invite.html
│ │ ├── list_my.html
│ │ └── quit_group_confirm.html
│ ├── help.html
│ ├── legal_entity.html
│ ├── legal_notice.html
│ ├── list_events_my.html
│ ├── list_events_of_user.html
│ ├── list_events_wrapper.html
│ ├── list_filters_my.html
│ ├── mail
│ │ ├── email_accepted_event.txt
│ │ ├── email_parsing_errors.txt
│ │ └── event_notice.txt
│ ├── pagination.html
│ ├── registration
│ │ ├── activate.html
│ │ ├── activation_email.txt
│ │ ├── activation_email_subject.txt
│ │ ├── login.html
│ │ ├── logout.html
│ │ ├── password_change_done.html
│ │ ├── password_change_form.html
│ │ ├── password_reset_complete.html
│ │ ├── password_reset_confirm.html
│ │ ├── password_reset_done.html
│ │ ├── password_reset_email.html
│ │ ├── password_reset_form.html
│ │ ├── register.html
│ │ ├── registration_complete.html
│ │ └── registration_form.html
│ ├── rss
│ │ ├── groupevents_description.html
│ │ ├── groupevents_title.html
│ │ ├── searchevents_description.html
│ │ └── searchevents_title.html
│ ├── search.html
│ ├── search_calendars.html
│ ├── search_map.html
│ ├── search_table.html
│ ├── settings.html
│ ├── settings_filters.html
│ └── settings_groups.html
├── urls.py
└── wsgi.py
├── manage_development.py
├── requirements
├── base.apt
├── base.ext
├── base.key
├── base.npm
├── base.pip
├── base.repo
├── bower.json
├── db.apt
├── development.apt
├── development.pip
├── development.trusty.apt
└── development.xenial.apt
└── tox.ini
/.gitignore:
--------------------------------------------------------------------------------
1 | grical_db.sql
2 | manage.py
3 |
4 | *.pyc
5 | .*.swp
6 | *.bak
7 | *.orig
8 | .tox
9 |
10 | .*\~
11 |
12 | local/
13 | node_modules/
14 | grical/static/bower_components/
15 | docs/_build/
16 | docs/html/
17 |
18 | (.*/)?\#[^/]*\#$
19 |
--------------------------------------------------------------------------------
/CHANGELOG.rst:
--------------------------------------------------------------------------------
1 | Version 1.0
2 | ===========
3 |
4 | * Upgraded Django to 1.8 LTS from 1.3
5 | * Updated requirements
6 | * Fixed deprecated code.
7 | * Introduced Bootstrap for CSS
8 | * Introduced Bower for JS dependencies.
9 |
10 | Incompatible changes
11 | --------------------
12 |
13 | * Capability to output to a Unix pipe was removed by removing the
14 | related custom setting: ``LOG_PIPE``.
15 | * The ``irclogger.py`` script was removed, which was intended to be used in
16 | conjunction with the ``LOG_PIPE`` setting.
17 |
--------------------------------------------------------------------------------
/copyright.rst:
--------------------------------------------------------------------------------
1 | Legal and meta
2 | ==============
3 |
4 | Copyright and license
5 | ---------------------
6 |
7 | | Copyright (C) 2010-2016 The authors
8 |
9 | The authors can be determined by looking into individual source files
10 | or examining the history in the version control system.
11 |
12 | Permission is granted to redistribute and/or modify GriCal under
13 | the terms of the GNU Affero General Public License (AGPL) as published
14 | by the Free Software Foundation; either version 3 of the License, or,
15 | at your option, any later version.
16 |
17 | Permission is granted to redistribute and/or modify the GriCalDroid
18 | subproject under the terms of the GNU General Public License (GPL) as
19 | published by the Free Software Foundation; either version 3 of the
20 | License, or, at your option, any later version.
21 |
22 | The software is distributed in the hope that it will be useful, but
23 | without any warranty; without even the implied warranty of
24 | merchantability or fitness for a particular purpose. See the AGPL and
25 | the GPL for more details.
26 |
27 | You should have received a copy of AGPL and of the GPL
28 | along with this program. If not, see
29 | http://www.gnu.org/licenses/.
30 |
31 |
32 | Bootstrap
33 | ---------
34 |
35 | The Bower component bootstrap__ is copyrighted 2011-2016 by Twitter, Inc. and
36 | licensed__ under the `MIT license`_.
37 |
38 | __ http://getbootstrap.com
39 | __ https://github.com/twbs/bootstrap/blob/master/LICENSE
40 |
41 |
42 | bootstrap-datepicker
43 | --------------------
44 |
45 | The Bower component bootstrap_datepicker__ is copyrighted eternicode__
46 | and licensed under the Apache_License_Version_2
47 |
48 | __ https://github.com/eternicode/bootstrap-datepicker
49 | __ https://github.com/eternicode
50 | __ http://www.apache.org/licenses/LICENSE-2.0
51 |
52 |
53 | icalicon.png
54 | ------------
55 |
56 | The calendar small icon is
57 |
58 | | Copyright (C) Mark James
59 |
60 | Permission is granted to reproduce and/or modify the icon under the
61 | terms of the `Creative Commons Attribution 3.0 License`__. Mark James'
62 | icons are available at http://www.famfamfam.com/lab/icons/silk/.
63 |
64 | __ Creative Commons Attribution 3.0 License: http://creativecommons.org/licenses/by/3.0/
65 |
66 |
67 | Contact
68 | -------
69 |
70 | | GridMind Vorgründungsgesellschaft Iván Fernando Villanueva Barrio EU
71 | | Malmöer Str. 6
72 | | 10439 Berlin
73 | | Germany
74 | |
75 | | Tel. +49 3039820596
76 | | E-Mail: info ät gridmind.org
77 |
78 | .. _MIT license: https://en.wikipedia.org/wiki/Mit_license
79 |
--------------------------------------------------------------------------------
/db_migration/move_schema.sql:
--------------------------------------------------------------------------------
1 | BEGIN;
2 |
3 | -- Drop some tables we don't need such as cache table, country /
4 | -- continent borders that will be recreated with the migration script
5 | -- and potential celery tables that we don't use anymore
6 |
7 | DO
8 | $$
9 | DECLARE
10 | row record;
11 | BEGIN
12 | FOR row IN (SELECT tablename FROM pg_tables WHERE tablename LIKE 'djcelery_%') UNION
13 | (SELECT tablename FROM pg_tables WHERE tablename LIKE 'celery_%') UNION
14 | (SELECT tablename FROM pg_tables WHERE tablename LIKE 'data_%')
15 | LOOP
16 | EXECUTE 'DROP TABLE IF EXISTS ' || quote_ident(row.tablename) || ' CASCADE ;';
17 | END LOOP;
18 | END;
19 | $$;
20 |
21 | DROP TABLE IF EXISTS cache CASCADE;
22 |
23 |
24 | CREATE SCHEMA old_public;
25 |
26 | DO
27 | $$
28 | DECLARE
29 | row record;
30 | BEGIN
31 | FOR row IN SELECT tablename FROM pg_tables WHERE schemaname = 'public'
32 | LOOP
33 | EXECUTE 'ALTER TABLE public.' || quote_ident(row.tablename) || ' SET SCHEMA old_public;';
34 | END LOOP;
35 | END;
36 | $$;
37 |
38 | COMMIT;
39 |
--------------------------------------------------------------------------------
/grical/ABOUT.TXT:
--------------------------------------------------------------------------------
1 | .. This file is written in ReStructuredText, and is used for generating the web content
2 |
3 | **Grical** (abbreviated as **grical**), is an open web where people store quickly a few information about interesting events, so that others can also easily know about them. Grical makes easy and fast for its users to get notified and store interesting events in its own external calendars.
4 |
5 | Grical also has groups. Once you have an account, you can create a group and invite others. You can also become a member of an already created group after you log in. Members of groups can add private events to their groups, which are seen only by the group members.
6 |
7 | This site offers its content as `Free content`_ except for events marked as private. This site is run by `Free Software`_ and respects the TIO_ guidelines of the FFII_
8 |
9 | .. _TIO: http://tio.ffii.org/
10 | .. _FFII: http://www.ffii.org
11 | .. _Free content: http://en.wikipedia.org/wiki/Free_content
12 | .. _Free Software: http://en.wikipedia.org/wiki/Free_software
13 |
--------------------------------------------------------------------------------
/grical/__init__.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- encoding: utf-8 -*-
3 | # vim: set expandtab tabstop=4 shiftwidth=4 textwidth=79 foldmethod=marker:
4 | # gpl {{{1
5 | #############################################################################
6 | # Copyright 2009-2016 Stefanos Kozanis
7 | #
8 | # This file is part of GriCal.
9 | #
10 | # GriCal is free software: you can redistribute it and/or modify it under
11 | # the terms of the GNU Affero General Public License as published by the Free
12 | # Software Foundation, either version 3 of the License, or (at your option) any
13 | # later version.
14 | #
15 | # GriCal is distributed in the hope that it will be useful, but WITHOUT
16 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17 | # FOR A PARTICULAR PURPOSE. See the Affero GNU General Public License for more
18 | # details.
19 | #
20 | # You should have received a copy of the GNU Affero General Public License
21 | # along with GriCal. If not, see .
22 | #############################################################################
23 |
24 | # See: http://docs.celeryproject.org/en/latest/django/first-steps-with-django.html
25 | # DO NOT* remove this, it is used to load celery application.
26 | from .celery import app as celery_app
27 |
28 | VERSION = (1,0)
29 |
--------------------------------------------------------------------------------
/grical/accounts/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/accounts/__init__.py
--------------------------------------------------------------------------------
/grical/accounts/views.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- encoding: utf-8 -*-
3 | # vim: set expandtab tabstop=4 shiftwidth=4 textwidth=79 foldmethod=marker:
4 | # gpl {{{1
5 | #############################################################################
6 | # Copyright 2009-2016 Ivan F. Villanueva B.
7 | #
8 | # This file is part of GriCal.
9 | #
10 | # GriCal is free software: you can redistribute it and/or modify it under
11 | # the terms of the GNU Affero General Public License as published by the Free
12 | # Software Foundation, either version 3 of the License, or (at your option) any
13 | # later version.
14 | #
15 | # GriCal is distributed in the hope that it will be useful, but WITHOUT
16 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17 | # FOR A PARTICULAR PURPOSE. See the Affero GNU General Public License for more
18 | # details.
19 | #
20 | # You should have received a copy of the GNU Affero General Public License
21 | # along with GriCal. If not, see .
22 | #############################################################################
23 |
24 | # docs {{{1
25 | """ VIEWS """
26 |
27 | # imports {{{1
28 | from django.contrib import messages
29 | from django.contrib.sites.models import Site
30 | from django.shortcuts import render
31 | from django.utils.translation import ugettext as _
32 |
33 | def csrf_failure(request, reason=""): # {{{1
34 | # TODO: log the reason (which is not intended to end users)
35 | messages.error( request, _('Error.') )
36 | return render(request, 'accounts/cookies_not_enabled.html', {
37 | 'title': Site.objects.get_current().name + \
38 | ' - ' + _( 'cookies not enabled' )})
39 |
--------------------------------------------------------------------------------
/grical/celery.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- encoding: utf-8 -*-
3 | # vim: set expandtab tabstop=4 shiftwidth=4 textwidth=79 foldmethod=marker:
4 | # gpl {{{1
5 | #############################################################################
6 | # Copyright 2009-2016 Stefanos Kozanis
7 | #
8 | # This file is part of GriCal.
9 | #
10 | # GriCal is free software: you can redistribute it and/or modify it under
11 | # the terms of the GNU Affero General Public License as published by the Free
12 | # Software Foundation, either version 3 of the License, or (at your option) any
13 | # later version.
14 | #
15 | # GriCal is distributed in the hope that it will be useful, but WITHOUT
16 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17 | # FOR A PARTICULAR PURPOSE. See the Affero GNU General Public License for more
18 | # details.
19 | #
20 | # You should have received a copy of the GNU Affero General Public License
21 | # along with GriCal. If not, see .
22 | #############################################################################
23 |
24 | # Source:
25 | # http://docs.celeryproject.org/en/latest/django/first-steps-with-django.html
26 |
27 | from __future__ import absolute_import
28 |
29 | import os
30 |
31 | from celery import Celery
32 |
33 | # set the default Django settings module for the 'celery' program.
34 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'grical.settings.settings')
35 |
36 | from django.conf import settings
37 |
38 | # http://docs.celeryproject.org/en/latest/django/first-steps-with-django.html
39 | app = Celery('grical')
40 |
41 | # Using a string here means the worker will not have to
42 | # pickle the object when using Windows.
43 | app.config_from_object('django.conf:settings')
44 | app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
45 |
--------------------------------------------------------------------------------
/grical/contact_form/LICENSE.txt:
--------------------------------------------------------------------------------
1 | Copyright (c) 2007, James Bennett
2 | All rights reserved.
3 |
4 | Redistribution and use in source and binary forms, with or without
5 | modification, are permitted provided that the following conditions are
6 | met:
7 |
8 | * Redistributions of source code must retain the above copyright
9 | notice, this list of conditions and the following disclaimer.
10 | * Redistributions in binary form must reproduce the above
11 | copyright notice, this list of conditions and the following
12 | disclaimer in the documentation and/or other materials provided
13 | with the distribution.
14 | * Neither the name of the author nor the names of other
15 | contributors may be used to endorse or promote products derived
16 | from this software without specific prior written permission.
17 |
18 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 |
--------------------------------------------------------------------------------
/grical/contact_form/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/contact_form/__init__.py
--------------------------------------------------------------------------------
/grical/contact_form/locale/da/LC_MESSAGES/django.mo:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/contact_form/locale/da/LC_MESSAGES/django.mo
--------------------------------------------------------------------------------
/grical/contact_form/locale/da/LC_MESSAGES/django.po:
--------------------------------------------------------------------------------
1 | # Danish translation of django contact form.
2 | # Copyright (C) 2009 Mikkel Høgh
3 | # This file is distributed under the same license as the django contact form package.
4 | # Mikkel Høgh , YEAR.
5 | #
6 | #, fuzzy
7 | msgid ""
8 | msgstr ""
9 | "Project-Id-Version: hg\n"
10 | "Report-Msgid-Bugs-To: \n"
11 | "POT-Creation-Date: 2009-09-29 14:22+0200\n"
12 | "PO-Revision-Date: 2009-09-29 14:31+0200\n"
13 | "Last-Translator: Mikkel Høgh \n"
14 | "Language-Team: Dansk\n"
15 | "MIME-Version: 1.0\n"
16 | "Content-Type: text/plain; charset=UTF-8\n"
17 | "Content-Transfer-Encoding: 8bit\n"
18 |
19 | #: forms.py:143
20 | msgid "Your name"
21 | msgstr "Dit navn"
22 |
23 | #: forms.py:146
24 | msgid "Your email address"
25 | msgstr "Din e-mail-adresse"
26 |
27 | #: forms.py:148
28 | msgid "Your message"
29 | msgstr "Din besked"
30 |
31 | #: forms.py:259
32 | msgid "Akismet thinks this message is spam"
33 | msgstr "Akismet mener denne besked er spam"
34 |
35 |
--------------------------------------------------------------------------------
/grical/contact_form/locale/de/LC_MESSAGES/django.mo:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/contact_form/locale/de/LC_MESSAGES/django.mo
--------------------------------------------------------------------------------
/grical/contact_form/locale/de/LC_MESSAGES/django.po:
--------------------------------------------------------------------------------
1 | # SOME DESCRIPTIVE TITLE.
2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
3 | # This file is distributed under the same license as the PACKAGE package.
4 | # FIRST AUTHOR , YEAR.
5 | #
6 | msgid ""
7 | msgstr ""
8 | "Project-Id-Version: PACKAGE VERSION\n"
9 | "Report-Msgid-Bugs-To: \n"
10 | "POT-Creation-Date: 2008-11-13 01:31+0100\n"
11 | "PO-Revision-Date: 2009-01-26 13:12+0100\n"
12 | "Last-Translator: Horst Gutmann \n"
13 | "Language-Team: LANGUAGE \n"
14 | "MIME-Version: 1.0\n"
15 | "Content-Type: text/plain; charset=UTF-8\n"
16 | "Content-Transfer-Encoding: 8bit\n"
17 |
18 | #: forms.py:143
19 | msgid "Your name"
20 | msgstr "Dein Name"
21 |
22 | #: forms.py:146
23 | msgid "Your email address"
24 | msgstr "Deine E-Mail-Adresse"
25 |
26 | #: forms.py:148
27 | msgid "Your message"
28 | msgstr "Deine Nachricht"
29 |
30 | #: forms.py:259
31 | msgid "Akismet thinks this message is spam"
32 | msgstr "Akismet hält das für SPAM"
33 |
34 |
--------------------------------------------------------------------------------
/grical/contact_form/locale/es/LC_MESSAGES/django.mo:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/contact_form/locale/es/LC_MESSAGES/django.mo
--------------------------------------------------------------------------------
/grical/contact_form/locale/es/LC_MESSAGES/django.po:
--------------------------------------------------------------------------------
1 | # SOME DESCRIPTIVE TITLE.
2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
3 | # This file is distributed under the same license as the PACKAGE package.
4 | # FIRST AUTHOR , YEAR.
5 | #
6 | msgid ""
7 | msgstr ""
8 | "Project-Id-Version: PACKAGE VERSION\n"
9 | "Report-Msgid-Bugs-To: \n"
10 | "POT-Creation-Date: 2009-09-14 03:44-0500\n"
11 | "PO-Revision-Date: 2009-09-14 10:45+0100\n"
12 | "Last-Translator: Ales Zabala Alava (Shagi) \n"
13 | "Language-Team: Spanish \n"
14 | "MIME-Version: 1.0\n"
15 | "Content-Type: text/plain; charset=UTF-8\n"
16 | "Content-Transfer-Encoding: 8bit\n"
17 | "X-Poedit-Language: Spanish\n"
18 |
19 | #: forms.py:143
20 | msgid "Your name"
21 | msgstr "Tu nombre"
22 |
23 | #: forms.py:146
24 | msgid "Your email address"
25 | msgstr "Tu dirección de correo"
26 |
27 | #: forms.py:148
28 | msgid "Your message"
29 | msgstr "Tu mensaje"
30 |
31 | #: forms.py:259
32 | msgid "Akismet thinks this message is spam"
33 | msgstr "Akismet piensa que este mensaje es spam"
34 |
35 |
--------------------------------------------------------------------------------
/grical/contact_form/locale/eu/LC_MESSAGES/django.mo:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/contact_form/locale/eu/LC_MESSAGES/django.mo
--------------------------------------------------------------------------------
/grical/contact_form/locale/eu/LC_MESSAGES/django.po:
--------------------------------------------------------------------------------
1 | # SOME DESCRIPTIVE TITLE.
2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
3 | # This file is distributed under the same license as the PACKAGE package.
4 | # FIRST AUTHOR , YEAR.
5 | #
6 | msgid ""
7 | msgstr ""
8 | "Project-Id-Version: PACKAGE VERSION\n"
9 | "Report-Msgid-Bugs-To: \n"
10 | "POT-Creation-Date: 2009-09-14 03:40-0500\n"
11 | "PO-Revision-Date: 2009-09-14 10:43+0100\n"
12 | "Last-Translator: Ales Zabala Alava (Shagi) \n"
13 | "Language-Team: Basque \n"
14 | "MIME-Version: 1.0\n"
15 | "Content-Type: text/plain; charset=UTF-8\n"
16 | "Content-Transfer-Encoding: 8bit\n"
17 | "X-Poedit-Language: Basque\n"
18 |
19 | #: forms.py:143
20 | msgid "Your name"
21 | msgstr "Zure izena"
22 |
23 | #: forms.py:146
24 | msgid "Your email address"
25 | msgstr "Zure eposta helbidea"
26 |
27 | #: forms.py:148
28 | msgid "Your message"
29 | msgstr "Zure mezua"
30 |
31 | #: forms.py:259
32 | msgid "Akismet thinks this message is spam"
33 | msgstr "Akismet-ek mezu hau spam-a dela pentsatzen du"
34 |
35 |
--------------------------------------------------------------------------------
/grical/contact_form/locale/fi/LC_MESSAGES/django.mo:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/contact_form/locale/fi/LC_MESSAGES/django.mo
--------------------------------------------------------------------------------
/grical/contact_form/locale/fi/LC_MESSAGES/django.po:
--------------------------------------------------------------------------------
1 | # Finnish translations for the django-contact-form reusable app.
2 | # Copyright (C) 2007,2009 James Bennett and translators
3 | # This file is distributed under the same license as the django-contact-form package.
4 | # Antti Kaihola , 2009.
5 | #
6 | msgid ""
7 | msgstr ""
8 | "Project-Id-Version: django-contact-form-i18n r70\n"
9 | "Report-Msgid-Bugs-To: \n"
10 | "POT-Creation-Date: 2009-11-09 17:21+0200\n"
11 | "PO-Revision-Date: 2009-11-09 17:27+0200\n"
12 | "Last-Translator: Antti Kaihola \n"
13 | "Language-Team: Finnish \n"
14 | "MIME-Version: 1.0\n"
15 | "Content-Type: text/plain; charset=UTF-8\n"
16 | "Content-Transfer-Encoding: 8bit\n"
17 |
18 | #: forms.py:143
19 | msgid "Your name"
20 | msgstr "Nimesi"
21 |
22 | #: forms.py:146
23 | msgid "Your email address"
24 | msgstr "Sähköpostiosoitteesi"
25 |
26 | #: forms.py:148
27 | msgid "Your message"
28 | msgstr "Viestisi"
29 |
30 | #: forms.py:259
31 | msgid "Akismet thinks this message is spam"
32 | msgstr "Akismet-roskapostisuodatin tunnisti tämän viestin roskapostiksi"
33 |
--------------------------------------------------------------------------------
/grical/contact_form/locale/fr/LC_MESSAGES/django.mo:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/contact_form/locale/fr/LC_MESSAGES/django.mo
--------------------------------------------------------------------------------
/grical/contact_form/locale/fr/LC_MESSAGES/django.po:
--------------------------------------------------------------------------------
1 | # SOME DESCRIPTIVE TITLE.
2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
3 | # This file is distributed under the same license as the PACKAGE package.
4 | # Éric Veiras Galisson , 2009.
5 | #
6 | #, fuzzy
7 | msgid ""
8 | msgstr ""
9 | "Project-Id-Version: PACKAGE VERSION\n"
10 | "Report-Msgid-Bugs-To: \n"
11 | "POT-Creation-Date: 2009-02-02 23:00+0100\n"
12 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13 | "Last-Translator: FULL NAME \n"
14 | "Language-Team: LANGUAGE \n"
15 | "MIME-Version: 1.0\n"
16 | "Content-Type: text/plain; charset=UTF-8\n"
17 | "Content-Transfer-Encoding: 8bit\n"
18 |
19 | #: forms.py:143
20 | msgid "Your name"
21 | msgstr "Votre nom"
22 |
23 | #: forms.py:146
24 | msgid "Your email address"
25 | msgstr "Votre adresse e-mail"
26 |
27 | #: forms.py:148
28 | msgid "Your message"
29 | msgstr "Votre message"
30 |
31 | #: forms.py:259
32 | msgid "Akismet thinks this message is spam"
33 | msgstr "Akismet pense que ce message est un spam"
34 |
--------------------------------------------------------------------------------
/grical/contact_form/locale/hr/LC_MESSAGES/django.mo:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/contact_form/locale/hr/LC_MESSAGES/django.mo
--------------------------------------------------------------------------------
/grical/contact_form/locale/hr/LC_MESSAGES/django.po:
--------------------------------------------------------------------------------
1 | # SOME DESCRIPTIVE TITLE.
2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
3 | # This file is distributed under the same license as the PACKAGE package.
4 | # FIRST AUTHOR , YEAR.
5 | #
6 | msgid ""
7 | msgstr ""
8 | "Project-Id-Version: django-contact-form\n"
9 | "Report-Msgid-Bugs-To: \n"
10 | "POT-Creation-Date: 2010-12-01 14:26+0100\n"
11 | "PO-Revision-Date: 2010-12-01 14:51+0100\n"
12 | "Last-Translator: Enis Afgan \n"
13 | "Language-Team: \n"
14 | "MIME-Version: 1.0\n"
15 | "Content-Type: text/plain; charset=UTF-8\n"
16 | "Content-Transfer-Encoding: 8bit\n"
17 | "X-Poedit-Language: Croatian\n"
18 | "X-Poedit-Country: CROATIA\n"
19 |
20 | #: forms.py:143
21 | msgid "Your name"
22 | msgstr "Vaše ime"
23 |
24 | #: forms.py:146
25 | msgid "Your email address"
26 | msgstr "Vaša e-mail adresa"
27 |
28 | #: forms.py:148
29 | msgid "Your message"
30 | msgstr "Poruka"
31 |
32 | #: forms.py:259
33 | msgid "Akismet thinks this message is spam"
34 | msgstr "Akismet misli da je ova poruka spam"
35 |
36 |
--------------------------------------------------------------------------------
/grical/contact_form/locale/no/LC_MESSAGES/django.mo:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/contact_form/locale/no/LC_MESSAGES/django.mo
--------------------------------------------------------------------------------
/grical/contact_form/locale/no/LC_MESSAGES/django.po:
--------------------------------------------------------------------------------
1 | # SOME DESCRIPTIVE TITLE.
2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
3 | # This file is distributed under the same license as the PACKAGE package.
4 | # FIRST AUTHOR , YEAR.
5 | #
6 | #, fuzzy
7 | msgid ""
8 | msgstr ""
9 | "Project-Id-Version: PACKAGE VERSION\n"
10 | "Report-Msgid-Bugs-To: \n"
11 | "POT-Creation-Date: 2009-02-18 11:54+0100\n"
12 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13 | "Last-Translator: FULL NAME \n"
14 | "Language-Team: LANGUAGE \n"
15 | "MIME-Version: 1.0\n"
16 | "Content-Type: text/plain; charset=UTF-8\n"
17 | "Content-Transfer-Encoding: 8bit\n"
18 |
19 | #: forms.py:143
20 | msgid "Your name"
21 | msgstr "Ditt navn"
22 |
23 | #: forms.py:146
24 | msgid "Your email address"
25 | msgstr "Din epostadresse"
26 |
27 | #: forms.py:148
28 | msgid "Your message"
29 | msgstr "Din beskjed"
30 |
31 | #: forms.py:259
32 | msgid "Akismet thinks this message is spam"
33 | msgstr "Akismet tror denne beskjeden er spam"
34 |
--------------------------------------------------------------------------------
/grical/contact_form/locale/pl/LC_MESSAGES/django.mo:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/contact_form/locale/pl/LC_MESSAGES/django.mo
--------------------------------------------------------------------------------
/grical/contact_form/locale/pl/LC_MESSAGES/django.po:
--------------------------------------------------------------------------------
1 | # SOME DESCRIPTIVE TITLE.
2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
3 | # This file is distributed under the same license as the PACKAGE package.
4 | # FIRST AUTHOR , YEAR.
5 | #
6 | msgid ""
7 | msgstr ""
8 | "Project-Id-Version: django-contact-form\n"
9 | "Report-Msgid-Bugs-To: \n"
10 | "POT-Creation-Date: 2010-03-06 14:26+0100\n"
11 | "PO-Revision-Date: 2010-03-19 14:51+0100\n"
12 | "Last-Translator: Ludwik Trammer \n"
13 | "Language-Team: \n"
14 | "MIME-Version: 1.0\n"
15 | "Content-Type: text/plain; charset=UTF-8\n"
16 | "Content-Transfer-Encoding: 8bit\n"
17 | "X-Poedit-Language: Polish\n"
18 | "X-Poedit-Country: POLAND\n"
19 |
20 | #: forms.py:143
21 | msgid "Your name"
22 | msgstr "Imię i nazwisko"
23 |
24 | #: forms.py:146
25 | msgid "Your email address"
26 | msgstr "Adres e-mail"
27 |
28 | #: forms.py:148
29 | msgid "Your message"
30 | msgstr "Wiadomość"
31 |
32 | #: forms.py:259
33 | msgid "Akismet thinks this message is spam"
34 | msgstr "Akismet uważa, że ta wiadomość jest spamem"
35 |
36 |
--------------------------------------------------------------------------------
/grical/contact_form/locale/ru/LC_MESSAGES/django.mo:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/contact_form/locale/ru/LC_MESSAGES/django.mo
--------------------------------------------------------------------------------
/grical/contact_form/locale/ru/LC_MESSAGES/django.po:
--------------------------------------------------------------------------------
1 | # SOME DESCRIPTIVE TITLE.
2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
3 | # This file is distributed under the same license as the PACKAGE package.
4 | # FIRST AUTHOR , YEAR.
5 | #
6 | #, fuzzy
7 | msgid ""
8 | msgstr ""
9 | "Project-Id-Version: PACKAGE VERSION\n"
10 | "Report-Msgid-Bugs-To: \n"
11 | "POT-Creation-Date: 2009-12-13 19:26+0500\n"
12 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13 | "Last-Translator: Mikhail Korobov \n"
14 | "Language-Team: Russian\n"
15 | "MIME-Version: 1.0\n"
16 | "Content-Type: text/plain; charset=UTF-8\n"
17 | "Content-Transfer-Encoding: 8bit\n"
18 |
19 | #: forms.py:143
20 | msgid "Your name"
21 | msgstr "Ваше имя"
22 |
23 | #: forms.py:146
24 | msgid "Your email address"
25 | msgstr "Ваш адрес электронной почты"
26 |
27 | #: forms.py:148
28 | msgid "Your message"
29 | msgstr "Ваше сообщение"
30 |
31 | #: forms.py:259
32 | msgid "Akismet thinks this message is spam"
33 | msgstr "Askimet считает это сообщение спамом"
34 |
35 |
--------------------------------------------------------------------------------
/grical/contact_form/locale/sv/LC_MESSAGES/django.mo:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/contact_form/locale/sv/LC_MESSAGES/django.mo
--------------------------------------------------------------------------------
/grical/contact_form/locale/sv/LC_MESSAGES/django.po:
--------------------------------------------------------------------------------
1 | # SOME DESCRIPTIVE TITLE.
2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
3 | # This file is distributed under the same license as the PACKAGE package.
4 | # Håkan Waara , 2009.
5 | #
6 | msgid ""
7 | msgstr ""
8 | "Project-Id-Version: PACKAGE VERSION\n"
9 | "Report-Msgid-Bugs-To: \n"
10 | "POT-Creation-Date: 2009-01-25 21:37+0100\n"
11 | "PO-Revision-Date: 2009-01-26 13:13+0100\n"
12 | "Last-Translator: Håkan Waara \n"
13 | "Language-Team: LANGUAGE \n"
14 | "MIME-Version: 1.0\n"
15 | "Content-Type: text/plain; charset=UTF-8\n"
16 | "Content-Transfer-Encoding: 8bit\n"
17 |
18 | #: forms.py:143
19 | msgid "Your name"
20 | msgstr "Ditt namn"
21 |
22 | #: forms.py:146
23 | msgid "Your email address"
24 | msgstr "Din e-postadress"
25 |
26 | #: forms.py:148
27 | msgid "Your message"
28 | msgstr "Meddelande"
29 |
30 | #: forms.py:259
31 | msgid "Akismet thinks this message is spam"
32 | msgstr "Akismet har flaggat detta meddelande som skräppost"
33 |
34 |
--------------------------------------------------------------------------------
/grical/contact_form/urls.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- encoding: utf-8 -*-
3 | # vim: set expandtab tabstop=4 shiftwidth=4 textwidth=79 foldmethod=marker:
4 | # gpl {{{1
5 | #############################################################################
6 | # Copyright 2009-2016 Stefanos Kozanis
7 | #
8 | # This file is part of GriCal.
9 | #
10 | # GriCal is free software: you can redistribute it and/or modify it under
11 | # the terms of the GNU Affero General Public License as published by the Free
12 | # Software Foundation, either version 3 of the License, or (at your option) any
13 | # later version.
14 | #
15 | # GriCal is distributed in the hope that it will be useful, but WITHOUT
16 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17 | # FOR A PARTICULAR PURPOSE. See the Affero GNU General Public License for more
18 | # details.
19 | #
20 | # You should have received a copy of the GNU Affero General Public License
21 | # along with GriCal. If not, see .
22 | #############################################################################
23 | """
24 | Example URLConf for a contact form.
25 |
26 | Because the ``contact_form`` view takes configurable arguments, it's
27 | recommended that you manually place it somewhere in your URL
28 | configuration with the arguments you want. If you just prefer the
29 | default, however, you can hang this URLConf somewhere in your URL
30 | hierarchy (for best results with the defaults, include it under
31 | ``/contact/``).
32 |
33 | """
34 |
35 |
36 | from django.conf.urls import *
37 | from django.views.generic.base import TemplateView
38 |
39 | from grical.contact_form.views import contact_form
40 |
41 |
42 | urlpatterns = [
43 | url(r'^$',
44 | contact_form,
45 | name='contact_form'),
46 | url(r'^sent/$',
47 | TemplateView.as_view(template_name='contact_form/contact_form_sent.html'),
48 | name='contact_form_sent'),
49 | ]
50 |
--------------------------------------------------------------------------------
/grical/context_processors.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- encoding: utf-8 -*-
3 | # vim: set expandtab tabstop=4 shiftwidth=4 textwidth=79 foldmethod=marker:
4 | # gpl {{{1
5 | #############################################################################
6 | # Copyright 2009-2016 Stefanos Kozanis
7 | #
8 | # This file is part of GriCal.
9 | #
10 | # GriCal is free software: you can redistribute it and/or modify it under
11 | # the terms of the GNU Affero General Public License as published by the Free
12 | # Software Foundation, either version 3 of the License, or (at your option) any
13 | # later version.
14 | #
15 | # GriCal is distributed in the hope that it will be useful, but WITHOUT
16 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17 | # FOR A PARTICULAR PURPOSE. See the Affero GNU General Public License for more
18 | # details.
19 | #
20 | # You should have received a copy of the GNU Affero General Public License
21 | # along with GriCal. If not, see .
22 | #############################################################################
23 | """ Adds variables to all templates """
24 | # This file is needed for example for:
25 | # return render_to_response( ... , context_instance=RequestContext(request))
26 |
27 | # TODO: think of (also) using TEMPLATE_CONTEXT_PROCESSORS =
28 | # ('django.core.context_processors.request',)
29 |
30 | from django.contrib.sites.models import Site
31 | from django.conf import settings
32 | from django.contrib.auth.models import User
33 | from django.core.cache import cache
34 |
35 | from grical.events.models import Event, Group
36 | from grical.events.models import ExtendedUser
37 |
38 | def global_template_vars(request):
39 | """
40 | Adds variables to all templates.
41 |
42 | It uses memcached to minimize hitting the db.
43 | """
44 | def get_user():
45 | if request.user.is_authenticated():
46 | return ExtendedUser.objects.get( id = request.user.id )
47 | else:
48 | return None
49 | vars_funcs = {
50 | 'SITE_NAME': lambda: Site.objects.get_current().name,
51 | 'SITE_DOMAIN': lambda: Site.objects.get_current().domain,
52 | 'USERS_NR': lambda: User.objects.count(),
53 | 'EVENTS_NR': lambda: Event.objects.count(),
54 | 'GROUPS_NR': lambda: Group.objects.count(), }
55 | # protocol (computed below)
56 | vars_dic = cache.get_many( vars_funcs.keys() )
57 | if not vars_dic:
58 | vars_dic = {}
59 | # we get the values
60 | for key, func in vars_funcs.items():
61 | vars_dic[ key ] = func()
62 | # we put the values in the cache
63 | cache.set_many( vars_dic )
64 | # we add protocol
65 | if request.is_secure():
66 | vars_dic['PROTOCOL'] = "https"
67 | else:
68 | vars_dic['PROTOCOL'] = "http"
69 | vars_dic['VERSION'] = settings.VERSION
70 | vars_dic['MEDIA_URL'] = settings.MEDIA_URL
71 | # TODO: think on the trick to get the user out of a signed Django-1.4 cookie
72 | vars_dic['USER'] = get_user()
73 | vars_dic['READ_ONLY'] = settings.READ_ONLY
74 | # return
75 | return vars_dic
76 |
--------------------------------------------------------------------------------
/grical/data/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/data/__init__.py
--------------------------------------------------------------------------------
/grical/data/migrations/0001_initial.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- encoding: utf-8 -*-
3 | # vim: set expandtab tabstop=4 shiftwidth=4 textwidth=79 foldmethod=marker:
4 | # gpl {{{1
5 | #############################################################################
6 | # Copyright 2009-2016 Stefanos Kozanis
7 | #
8 | # This file is part of GriCal.
9 | #
10 | # GriCal is free software: you can redistribute it and/or modify it under
11 | # the terms of the GNU Affero General Public License as published by the Free
12 | # Software Foundation, either version 3 of the License, or (at your option) any
13 | # later version.
14 | #
15 | # GriCal is distributed in the hope that it will be useful, but WITHOUT
16 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17 | # FOR A PARTICULAR PURPOSE. See the Affero GNU General Public License for more
18 | # details.
19 | #
20 | # You should have received a copy of the GNU Affero General Public License
21 | # along with GriCal. If not, see .
22 | #############################################################################
23 | from __future__ import unicode_literals
24 |
25 | from django.db import migrations, models
26 | import django.contrib.gis.db.models.fields
27 |
28 |
29 | class Migration(migrations.Migration):
30 |
31 | dependencies = [
32 | ]
33 |
34 | operations = [
35 | migrations.CreateModel(
36 | name='ContinentBorder',
37 | fields=[
38 | ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
39 | ('code', models.CharField(max_length=2, choices=[(b'AF', 'Africa'), (b'AS', 'Asia'), (b'EU', 'Europe'), (b'NA', 'North America'), (b'SA', 'South America'), (b'OC', 'Oceania'), (b'AN', 'Antarctica')])),
40 | ('mpoly', django.contrib.gis.db.models.fields.MultiPolygonField(srid=4326)),
41 | ],
42 | options={
43 | 'verbose_name_plural': 'Continent Borders',
44 | },
45 | ),
46 | migrations.CreateModel(
47 | name='CountryBorder',
48 | fields=[
49 | ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
50 | ('code', models.CharField(max_length=2)),
51 | ('mpoly', django.contrib.gis.db.models.fields.MultiPolygonField(srid=4326)),
52 | ],
53 | options={
54 | 'verbose_name_plural': 'Country Borders',
55 | },
56 | ),
57 | ]
58 |
--------------------------------------------------------------------------------
/grical/data/migrations/0002_country_continent_borders_initial_data.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- encoding: utf-8 -*-
3 | # vim: set expandtab tabstop=4 shiftwidth=4 textwidth=79 foldmethod=marker:
4 | # gpl {{{1
5 | #############################################################################
6 | # Copyright 2009-2016 Stefanos Kozanis
7 | #
8 | # This file is part of GriCal.
9 | #
10 | # GriCal is free software: you can redistribute it and/or modify it under
11 | # the terms of the GNU Affero General Public License as published by the Free
12 | # Software Foundation, either version 3 of the License, or (at your option) any
13 | # later version.
14 | #
15 | # GriCal is distributed in the hope that it will be useful, but WITHOUT
16 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17 | # FOR A PARTICULAR PURPOSE. See the Affero GNU General Public License for more
18 | # details.
19 | #
20 | # You should have received a copy of the GNU Affero General Public License
21 | # along with GriCal. If not, see .
22 | #############################################################################
23 | from __future__ import unicode_literals
24 |
25 | import os.path
26 |
27 | from django.core import serializers
28 | from django.db import migrations
29 |
30 | fixture_dir = os.path.abspath(os.path.join(os.path.dirname(__file__),
31 | '../fixtures'))
32 | fixture_filename = 'borders.json'
33 |
34 | def load_fixture(apps, schema_editor):
35 | from django.conf import settings
36 | if settings.TESTS_RUNNING:
37 | # Currently we don't have any test relying to borders, we skip
38 | # to accelerate tests
39 | return
40 |
41 | fixture_file = os.path.join(fixture_dir, fixture_filename)
42 |
43 | with open(fixture_file) as fixture:
44 | objects = serializers.deserialize('json', fixture, ignorenonexistent=True)
45 | for obj in objects:
46 | if obj.object.code in (u'GB', u'EU'):
47 | # FIXME: It looks some problem with GB/EU mpoly line that
48 | # raises some "Not null constraint" error though mpoly
49 | # has points and it is not null. It looks some sqlite
50 | # bug.
51 | continue
52 | obj.save()
53 |
54 | # Most probably we won't add some revertion code to go to 0001, so this code
55 | # won't execute ever and I take it out for coverage. At some point we may
56 | # delete. Stefanos 2015-10-12 16:46:00+03:00
57 | def unload_fixture(apps, schema_editor): # pragma: no cover
58 | "Brutally deleting all entries for this model..."
59 |
60 | CountryBorder = apps.get_model("data", "CountryBorder")
61 | CountryBorder.objects.all().delete()
62 | ContinentBorder = apps.get_model("data", "ContinentBorder")
63 | ContinentBorder.objects.all().delete()
64 |
65 | class Migration(migrations.Migration):
66 |
67 | """
68 | Loads country borders
69 | See:
70 | http://stackoverflow.com/questions/25960850/loading-initial-data-with-django-1-7-and-data-migrations
71 | """
72 |
73 | dependencies = [
74 | ('data', '0001_initial'),
75 | ]
76 |
77 | operations = [
78 | migrations.RunPython(load_fixture, reverse_code=unload_fixture),
79 | ]
80 |
--------------------------------------------------------------------------------
/grical/data/migrations/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/data/migrations/__init__.py
--------------------------------------------------------------------------------
/grical/events/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/events/__init__.py
--------------------------------------------------------------------------------
/grical/events/admin.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- encoding: utf-8 -*-
3 | # vim: set expandtab tabstop=4 shiftwidth=4 textwidth=79 foldmethod=marker:
4 | # gpl {{{1
5 | #############################################################################
6 | # Copyright 2009-2016 Stefanos Kozanis
7 | #
8 | # This file is part of GriCal.
9 | #
10 | # GriCal is free software: you can redistribute it and/or modify it under
11 | # the terms of the GNU Affero General Public License as published by the Free
12 | # Software Foundation, either version 3 of the License, or (at your option) any
13 | # later version.
14 | #
15 | # GriCal is distributed in the hope that it will be useful, but WITHOUT
16 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17 | # FOR A PARTICULAR PURPOSE. See the Affero GNU General Public License for more
18 | # details.
19 | #
20 | # You should have received a copy of the GNU Affero General Public License
21 | # along with GriCal. If not, see .
22 | #############################################################################
23 | """ Django admin definitions file adding related data in the admin views. See
24 | http://docs.djangoproject.com/en/dev/ref/contrib/admin/#working-with-many-to-many-intermediary-models
25 | """
26 |
27 | # NOTE: allowing to edit events (including deadlines, urls and sessions) is not
28 | # possible at the moment in the admin because:
29 | # - revisions would be very tricky to keep
30 | # - the admin performs bulk updates which circunvent the delete and save
31 | # methods of the models
32 |
33 | from django.contrib import admin
34 | from grical.events.models import Group, Membership, Calendar
35 |
36 | class MembershipInline(admin.TabularInline):
37 | """ Membership """
38 | model = Membership
39 | extra = 1
40 |
41 | class CalendarInline(admin.TabularInline):
42 | """ Calendar """
43 | model = Calendar
44 | extra = 1
45 |
46 | class GroupAdmin(admin.ModelAdmin): # pylint: disable-msg=R0904
47 | """ ModelAdmin for Groups """
48 | inlines = (MembershipInline, CalendarInline,)
49 |
50 | admin.site.register(Group, GroupAdmin)
51 |
--------------------------------------------------------------------------------
/grical/events/decorators.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- encoding: utf-8 -*-
3 | # vim: set expandtab tabstop=4 shiftwidth=4 textwidth=79 foldmethod=marker:
4 | # gpl {{{1
5 | #############################################################################
6 | # Copyright 2009-2016 Stefanos Kozanis
7 | #
8 | # This file is part of GriCal.
9 | #
10 | # GriCal is free software: you can redistribute it and/or modify it under
11 | # the terms of the GNU Affero General Public License as published by the Free
12 | # Software Foundation, either version 3 of the License, or (at your option) any
13 | # later version.
14 | #
15 | # GriCal is distributed in the hope that it will be useful, but WITHOUT
16 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17 | # FOR A PARTICULAR PURPOSE. See the Affero GNU General Public License for more
18 | # details.
19 | #
20 | # You should have received a copy of the GNU Affero General Public License
21 | # along with GriCal. If not, see .
22 | #############################################################################
23 | # docs {{{1
24 | """ VIEWS """
25 |
26 | # imports {{{1
27 | from django.conf import settings
28 | from django.contrib import messages
29 | from django.core.urlresolvers import reverse
30 | from django.http import HttpResponseRedirect
31 | from django.utils.translation import ugettext as _
32 |
33 | def only_if_write_enabled(func):
34 | """decorator for view functions that disable the view and redirects to the
35 | main page if ``settings.READ_ONLY`` is True
36 | """
37 | def closure(request, *args, **kwargs):
38 | if settings.READ_ONLY:
39 | messages.info(request, _("Currently it is not possible to enter" \
40 | " or edit any data. Please wait a few minutes and then " \
41 | "try again."))
42 | return HttpResponseRedirect(reverse('main'))
43 | return func( request, *args, **kwargs )
44 |
45 | return closure
46 |
--------------------------------------------------------------------------------
/grical/events/management/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/events/management/__init__.py
--------------------------------------------------------------------------------
/grical/events/management/commands/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/events/management/commands/__init__.py
--------------------------------------------------------------------------------
/grical/events/management/commands/cleanupinvitations.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- encoding: utf-8 -*-
3 | # vim: set expandtab tabstop=4 shiftwidth=4 textwidth=79 foldmethod=marker:
4 | # gpl {{{1
5 | #############################################################################
6 | # Copyright 2009-2012 Ivan F. Villanueva B.
7 | #
8 | # This file is part of GriCal.
9 | #
10 | # GriCal is free software: you can redistribute it and/or modify it under
11 | # the terms of the GNU Affero General Public License as published by the Free
12 | # Software Foundation, either version 3 of the License, or (at your option) any
13 | # later version.
14 | #
15 | # GriCal is distributed in the hope that it will be useful, but WITHOUT
16 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17 | # FOR A PARTICULAR PURPOSE. See the Affero GNU General Public License for more
18 | # details.
19 | #
20 | # You should have received a copy of the GNU Affero General Public License
21 | # along with GriCal. If not, see .
22 | #############################################################################
23 | """ A management command which deletes expired group invitations from the
24 | database. """
25 |
26 | from django.conf import settings
27 | from django.core.management.base import BaseCommand
28 | from grical.events.models import GroupInvitation
29 |
30 | class Command(BaseCommand):
31 | """ A management command which deletes expired group invitations from the
32 | database.
33 |
34 | Calls ``GroupInvitation.objects.delete_expired_invitations()``, which
35 | contains the actual logic for determining which invitations are deleted.
36 | """
37 |
38 | help = "Delete expired group invitations from the database"
39 |
40 | def handle(self, *args, **options):
41 | """ Executes the action, or do nothing if settings.READ_ONLY is True.
42 | """
43 | if settings.READ_ONLY == True:
44 | return
45 | GroupInvitation.objects.delete_expired_invitations()
46 |
--------------------------------------------------------------------------------
/grical/events/management/commands/createrevisioninfo.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- encoding: utf-8 -*-
3 | # vim: set expandtab tabstop=4 shiftwidth=4 textwidth=79 foldmethod=marker:
4 | # gpl {{{1
5 | #############################################################################
6 | # Copyright 2009-2012 Antonis Christofides
7 | #
8 | # This file is part of GriCal.
9 | #
10 | # GriCal is free software: you can redistribute it and/or modify it under
11 | # the terms of the GNU Affero General Public License as published by the Free
12 | # Software Foundation, either version 3 of the License, or (at your option) any
13 | # later version.
14 | #
15 | # GriCal is distributed in the hope that it will be useful, but WITHOUT
16 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17 | # FOR A PARTICULAR PURPOSE. See the Affero GNU General Public License for more
18 | # details.
19 | #
20 | # You should have received a copy of the GNU Affero General Public License
21 | # along with GriCal. If not, see .
22 | #############################################################################
23 | import sys
24 |
25 | from django.conf import settings
26 | from django.core.management.base import NoArgsCommand
27 | from django.db import transaction
28 | from django.utils.encoding import smart_unicode
29 |
30 | from reversion.models import Version
31 |
32 | from grical.events.models import Event, RevisionInfo
33 |
34 | class Command( NoArgsCommand ): # {{{1
35 | """ management command """
36 | help = "add RevisionInfo provided there is only one version for each event"
37 | @transaction.commit_on_success # see http://docs.djangoproject.com/en/1.3/topics/db/transactions/#controlling-transaction-management-in-views
38 | def handle_noargs( self, **options ): # {{{2
39 | """ Executes the action or do nothing if settings.READ_ONLY is True.
40 | """
41 | if settings.READ_ONLY == True:
42 | return
43 | events = Event.objects.all()
44 | count = 0
45 | for event in events:
46 | version_list = Version.objects.get_for_object(event)
47 | assert version_list, 'event %d has no versions' % event.id
48 | assert len( version_list ) == 1, \
49 | 'event %d has more than one version' % event.id
50 | version = version_list[0]
51 | revision = version.revision
52 | infos = revision.revisioninfo_set.all()
53 | if not infos:
54 | RevisionInfo.objects.create( revision = revision, as_text =
55 | smart_unicode( event.as_text() ) )
56 | count = count + 1
57 | else:
58 | assert len( infos ) == 1, \
59 | 'event %d has more than one RevisionInfo' % event.id
60 | assert infos[0].as_text == smart_unicode( event.as_text() ), \
61 | 'event %d has already a RevisionInfo' % event.id
62 | print "created %d RevisionInfo records" % count
63 |
64 | # setting stdout and stderr {{{1
65 | try:
66 | getattr( Command, 'stdout' )
67 | except AttributeError:
68 | Command.stdout = sys.stdout
69 | try:
70 | getattr( Command, 'stderr' )
71 | except AttributeError:
72 | Command.stderr = sys.stderr
73 |
--------------------------------------------------------------------------------
/grical/events/management/commands/createuser.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- encoding: utf-8 -*-
3 | # vi:expandtab:tabstop=4 shiftwidth=4 textwidth=79 foldmethod=marker
4 | # Copyright 2014 Stefanos Kozanis
5 | # Copyright 2014 Ivan Villanueava
6 |
7 | from django.contrib.auth import get_user_model
8 | from django.core.management.base import BaseCommand
9 |
10 | class Command(BaseCommand):
11 |
12 | help = 'Creates a user'
13 |
14 | def add_arguments(self, parser):
15 | # https://docs.python.org/2.7/library/argparse.html#module-argparse
16 | parser.add_argument('username', type=str, nargs=1)
17 | parser.add_argument('password', type=str, nargs=1)
18 | parser.add_argument('email', type=str, nargs=1)
19 | parser.add_argument('--superuser', action = 'store_true',
20 | default = False,
21 | help = 'If set, it creates a superuser'
22 | )
23 |
24 | def handle(self, *args, **options):
25 | username = options['username'][0]
26 | password = options['password'][0]
27 | email = options['email'][0]
28 | User = get_user_model()
29 |
30 | def create_user():
31 | if User.objects.filter(username__iexact=username).exists():
32 | raise RuntimeError('A similar user already exists whose name '
33 | 'collisions on a case insensitive comparison with '
34 | '"{}"'.format(username))
35 | credentials = \
36 | {'username': username, 'password': password,
37 | 'email': email,}
38 | if options.get('superuser'):
39 | user = User.objects.create_superuser(**credentials)
40 | else:
41 | user = User.objects.create_user(**credentials)
42 | user.save()
43 |
44 | try:
45 | User.objects.get(username=username)
46 | self.stdout.write('User with this username already exists\n')
47 | except User.DoesNotExist:
48 | create_user()
49 |
--------------------------------------------------------------------------------
/grical/events/migrations/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/events/migrations/__init__.py
--------------------------------------------------------------------------------
/grical/events/tables.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- encoding: utf-8 -*-
3 | # vim: set expandtab tabstop=4 shiftwidth=4 textwidth=79 foldmethod=marker:
4 | # gpl {{{1
5 | #############################################################################
6 | # Copyright 2009-2016 Stefanos Kozanis
7 | #
8 | # This file is part of GriCal.
9 | #
10 | # GriCal is free software: you can redistribute it and/or modify it under
11 | # the terms of the GNU Affero General Public License as published by the Free
12 | # Software Foundation, either version 3 of the License, or (at your option) any
13 | # later version.
14 | #
15 | # GriCal is distributed in the hope that it will be useful, but WITHOUT
16 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17 | # FOR A PARTICULAR PURPOSE. See the Affero GNU General Public License for more
18 | # details.
19 | #
20 | # You should have received a copy of the GNU Affero General Public License
21 | # along with GriCal. If not, see .
22 | #############################################################################
23 | # docs {{{1
24 |
25 | """ Events tables """
26 |
27 | # imports {{{1
28 | from django.utils.translation import ugettext as _
29 |
30 | from django_tables2 import Table, Column
31 |
32 | class EventTable(Table): # {{{1
33 | upcoming = Column( verbose_name = _( u"upcoming") )
34 | start = Column( verbose_name = _( u"start date" ), orderable = True,
35 | default = '' )
36 | end = Column( verbose_name = _( u"end date" ), orderable = True,
37 | default = '')
38 | city = Column( verbose_name = _( u"city" ), default = '' )
39 | country = Column( verbose_name = _( "country" ), default = '' )
40 | title = Column( verbose_name = _( "title" ) )
41 | tags = Column(
42 | verbose_name = _( "tags" ), orderable = False, default = '' )
43 | id = Column( orderable = False, visible = False )
44 |
45 | @staticmethod
46 | def convert(event_list): # {{{2
47 | """ converts a list of events to a list of dictionaries.
48 |
49 | See http://elsdoerfer.name/docs/django-tables/#indices-and-tables
50 | """
51 | lis = list()
52 | for event in event_list:
53 | dic = dict()
54 | dic['upcoming'] = \
55 | event.upcoming
56 | dic['start'] = event.start
57 | if hasattr( event, 'end') and event.end:
58 | dic['end'] = event.end
59 | if event.city:
60 | dic['city'] = event.city
61 | if event.country:
62 | dic['country'] = event.country
63 | dic['title'] = event.title
64 | dic['tags'] = event.tags
65 | dic['id'] = event.id
66 | lis.append( dic )
67 | return lis
68 |
69 |
70 |
--------------------------------------------------------------------------------
/grical/events/templatetags/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/events/templatetags/__init__.py
--------------------------------------------------------------------------------
/grical/events/templatetags/event_tags.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- encoding: utf-8 -*-
3 | # vim: set expandtab tabstop=4 shiftwidth=4 textwidth=79 foldmethod=marker:
4 | # gpl {{{1
5 | #############################################################################
6 | # Copyright 2009-2012 Ivan F. Villanueva B.
7 | #
8 | # This file is part of GriCal.
9 | #
10 | # GriCal is free software: you can redistribute it and/or modify it under
11 | # the terms of the GNU Affero General Public License as published by the Free
12 | # Software Foundation, either version 3 of the License, or (at your option) any
13 | # later version.
14 | #
15 | # GriCal is distributed in the hope that it will be useful, but WITHOUT
16 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17 | # FOR A PARTICULAR PURPOSE. See the Affero GNU General Public License for more
18 | # details.
19 | #
20 | # You should have received a copy of the GNU Affero General Public License
21 | # along with GriCal. If not, see .
22 | #############################################################################
23 | """ custom tags """
24 |
25 | from django import template
26 | from grical.events.models import Group, Calendar
27 |
28 | register = template.Library()
29 |
30 | # see http://docs.djangoproject.com/en/1.2/howto/custom-template-tags/
31 | @register.inclusion_tag( 'groups/show_add_to_group.html', takes_context=True )
32 | def show_add_to_group(context):
33 | """ custom tag to know and show (if needed) an "add to group" link when an
34 | event can be added to one or more of the groups of the logged-in user """
35 | # NOTE: think of problems with the caching system when using it
36 | user = context['user']
37 | event = context['event']
38 | if user is None or user.id is None:
39 | return {'show_add_to_group': False,}
40 | groups = Group.objects.filter(membership__user = user)
41 | if len(groups) < 1:
42 | return {'show_add_to_group': False,}
43 | for group in groups:
44 | times_event_in_group = Calendar.objects.filter(
45 | event__id__exact = event.id,
46 | group__id__exact = group.id ).count()
47 | if times_event_in_group == 0:
48 | return {'show_add_to_group': True, 'event': event}
49 | return {'show_add_to_group': False,}
50 |
51 | # The decorator above is equivalent to:
52 | #register.inclusion_tag('groups/add_to_group_link.html', takes_context=True)(show_add_to_group )
53 |
54 |
55 |
--------------------------------------------------------------------------------
/grical/events/tests/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/events/tests/__init__.py
--------------------------------------------------------------------------------
/grical/events/tests/test_doctests.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- encoding: utf-8 -*-
3 | # vim: set expandtab tabstop=4 shiftwidth=4 textwidth=79 foldmethod=marker:
4 | # gpl {{{1
5 | #############################################################################
6 | # Copyright 2009-2016 Stefanos Kozanis
7 | #
8 | # This file is part of GriCal.
9 | #
10 | # GriCal is free software: you can redistribute it and/or modify it under
11 | # the terms of the GNU Affero General Public License as published by the Free
12 | # Software Foundation, either version 3 of the License, or (at your option) any
13 | # later version.
14 | #
15 | # GriCal is distributed in the hope that it will be useful, but WITHOUT
16 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17 | # FOR A PARTICULAR PURPOSE. See the Affero GNU General Public License for more
18 | # details.
19 | #
20 | # You should have received a copy of the GNU Affero General Public License
21 | # along with GriCal. If not, see .
22 | #############################################################################
23 | """
24 | Loading of ``wikical.core`` doctests
25 | """
26 |
27 | from doctest import DocTestSuite
28 |
29 | from .. import forms, models, utils
30 |
31 | def load_tests(loader, tests, ignore): #{{{1
32 | """ Load doctests from modules containing such tests. """
33 | tests.addTest(DocTestSuite(forms))
34 | tests.addTest(DocTestSuite(models))
35 | tests.addTest(DocTestSuite(utils))
36 | return tests
37 |
--------------------------------------------------------------------------------
/grical/settings/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/settings/__init__.py
--------------------------------------------------------------------------------
/grical/static/agpl3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/agpl3.png
--------------------------------------------------------------------------------
/grical/static/android-icon-144x144.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/android-icon-144x144.png
--------------------------------------------------------------------------------
/grical/static/android-icon-192x192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/android-icon-192x192.png
--------------------------------------------------------------------------------
/grical/static/android-icon-36x36.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/android-icon-36x36.png
--------------------------------------------------------------------------------
/grical/static/android-icon-48x48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/android-icon-48x48.png
--------------------------------------------------------------------------------
/grical/static/android-icon-72x72.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/android-icon-72x72.png
--------------------------------------------------------------------------------
/grical/static/android-icon-96x96.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/android-icon-96x96.png
--------------------------------------------------------------------------------
/grical/static/apple-icon-114x114.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/apple-icon-114x114.png
--------------------------------------------------------------------------------
/grical/static/apple-icon-120x120.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/apple-icon-120x120.png
--------------------------------------------------------------------------------
/grical/static/apple-icon-144x144.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/apple-icon-144x144.png
--------------------------------------------------------------------------------
/grical/static/apple-icon-152x152.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/apple-icon-152x152.png
--------------------------------------------------------------------------------
/grical/static/apple-icon-180x180.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/apple-icon-180x180.png
--------------------------------------------------------------------------------
/grical/static/apple-icon-57x57.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/apple-icon-57x57.png
--------------------------------------------------------------------------------
/grical/static/apple-icon-60x60.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/apple-icon-60x60.png
--------------------------------------------------------------------------------
/grical/static/apple-icon-72x72.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/apple-icon-72x72.png
--------------------------------------------------------------------------------
/grical/static/apple-icon-76x76.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/apple-icon-76x76.png
--------------------------------------------------------------------------------
/grical/static/apple-icon-precomposed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/apple-icon-precomposed.png
--------------------------------------------------------------------------------
/grical/static/apple-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/apple-icon.png
--------------------------------------------------------------------------------
/grical/static/cc-by-sa-germany.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/cc-by-sa-germany.png
--------------------------------------------------------------------------------
/grical/static/dates-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/dates-icon.png
--------------------------------------------------------------------------------
/grical/static/deadlines-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/deadlines-icon.png
--------------------------------------------------------------------------------
/grical/static/favicon-16x16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/favicon-16x16.png
--------------------------------------------------------------------------------
/grical/static/favicon-32x32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/favicon-32x32.png
--------------------------------------------------------------------------------
/grical/static/favicon-96x96.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/favicon-96x96.png
--------------------------------------------------------------------------------
/grical/static/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/favicon.ico
--------------------------------------------------------------------------------
/grical/static/flags:
--------------------------------------------------------------------------------
1 | /usr/share/flags/countries/16x11
--------------------------------------------------------------------------------
/grical/static/flattr-badge-large.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/flattr-badge-large.png
--------------------------------------------------------------------------------
/grical/static/fonts/glyphicons-halflings-regular.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/fonts/glyphicons-halflings-regular.eot
--------------------------------------------------------------------------------
/grical/static/fonts/glyphicons-halflings-regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/fonts/glyphicons-halflings-regular.ttf
--------------------------------------------------------------------------------
/grical/static/fonts/glyphicons-halflings-regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/fonts/glyphicons-halflings-regular.woff
--------------------------------------------------------------------------------
/grical/static/fonts/glyphicons-halflings-regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/fonts/glyphicons-halflings-regular.woff2
--------------------------------------------------------------------------------
/grical/static/grical-70.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/grical-70.png
--------------------------------------------------------------------------------
/grical/static/grical-90.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/grical-90.png
--------------------------------------------------------------------------------
/grical/static/grical-logo-v4-317x90.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/grical-logo-v4-317x90.png
--------------------------------------------------------------------------------
/grical/static/icalicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/icalicon.png
--------------------------------------------------------------------------------
/grical/static/icalrecurrencesicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/icalrecurrencesicon.png
--------------------------------------------------------------------------------
/grical/static/js/datepicker.js:
--------------------------------------------------------------------------------
1 | $(document).ready( function() {
2 | var datepicker = $( ".datePicker" );
3 |
4 | datepicker.datepicker({
5 | format: 'yyyy-mm-dd',
6 | autoclose: true,
7 | todayHighlight: true
8 | });
9 | $(window).on("resize", function () {
10 | datepicker.datepicker( 'hide' );
11 | });
12 | });
13 |
--------------------------------------------------------------------------------
/grical/static/js/selectpicker.js:
--------------------------------------------------------------------------------
1 | $(document).ready( function() {
2 | var select = $( "select" );
3 | select.addClass('selectpicker');
4 | $('.selectpicker').selectpicker({
5 | style: 'btn-outline-primary select-button'
6 | });
7 | });
8 |
--------------------------------------------------------------------------------
/grical/static/links-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/links-icon.png
--------------------------------------------------------------------------------
/grical/static/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "App",
3 | "icons": [
4 | {
5 | "src": "\/android-icon-36x36.png",
6 | "sizes": "36x36",
7 | "type": "image\/png",
8 | "density": "0.75"
9 | },
10 | {
11 | "src": "\/android-icon-48x48.png",
12 | "sizes": "48x48",
13 | "type": "image\/png",
14 | "density": "1.0"
15 | },
16 | {
17 | "src": "\/android-icon-72x72.png",
18 | "sizes": "72x72",
19 | "type": "image\/png",
20 | "density": "1.5"
21 | },
22 | {
23 | "src": "\/android-icon-96x96.png",
24 | "sizes": "96x96",
25 | "type": "image\/png",
26 | "density": "2.0"
27 | },
28 | {
29 | "src": "\/android-icon-144x144.png",
30 | "sizes": "144x144",
31 | "type": "image\/png",
32 | "density": "3.0"
33 | },
34 | {
35 | "src": "\/android-icon-192x192.png",
36 | "sizes": "192x192",
37 | "type": "image\/png",
38 | "density": "4.0"
39 | }
40 | ]
41 | }
--------------------------------------------------------------------------------
/grical/static/marker_red.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/marker_red.png
--------------------------------------------------------------------------------
/grical/static/markers/bunt3.tar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/bunt3.tar
--------------------------------------------------------------------------------
/grical/static/markers/color_0_nr_0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_0_nr_0.png
--------------------------------------------------------------------------------
/grical/static/markers/color_0_nr_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_0_nr_1.png
--------------------------------------------------------------------------------
/grical/static/markers/color_0_nr_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_0_nr_2.png
--------------------------------------------------------------------------------
/grical/static/markers/color_0_nr_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_0_nr_3.png
--------------------------------------------------------------------------------
/grical/static/markers/color_0_nr_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_0_nr_4.png
--------------------------------------------------------------------------------
/grical/static/markers/color_0_nr_5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_0_nr_5.png
--------------------------------------------------------------------------------
/grical/static/markers/color_0_nr_6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_0_nr_6.png
--------------------------------------------------------------------------------
/grical/static/markers/color_0_nr_7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_0_nr_7.png
--------------------------------------------------------------------------------
/grical/static/markers/color_0_nr_8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_0_nr_8.png
--------------------------------------------------------------------------------
/grical/static/markers/color_0_nr_9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_0_nr_9.png
--------------------------------------------------------------------------------
/grical/static/markers/color_1_nr_0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_1_nr_0.png
--------------------------------------------------------------------------------
/grical/static/markers/color_1_nr_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_1_nr_1.png
--------------------------------------------------------------------------------
/grical/static/markers/color_1_nr_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_1_nr_2.png
--------------------------------------------------------------------------------
/grical/static/markers/color_1_nr_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_1_nr_3.png
--------------------------------------------------------------------------------
/grical/static/markers/color_1_nr_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_1_nr_4.png
--------------------------------------------------------------------------------
/grical/static/markers/color_1_nr_5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_1_nr_5.png
--------------------------------------------------------------------------------
/grical/static/markers/color_1_nr_6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_1_nr_6.png
--------------------------------------------------------------------------------
/grical/static/markers/color_1_nr_7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_1_nr_7.png
--------------------------------------------------------------------------------
/grical/static/markers/color_1_nr_8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_1_nr_8.png
--------------------------------------------------------------------------------
/grical/static/markers/color_1_nr_9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_1_nr_9.png
--------------------------------------------------------------------------------
/grical/static/markers/color_2_nr_0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_2_nr_0.png
--------------------------------------------------------------------------------
/grical/static/markers/color_2_nr_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_2_nr_1.png
--------------------------------------------------------------------------------
/grical/static/markers/color_2_nr_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_2_nr_2.png
--------------------------------------------------------------------------------
/grical/static/markers/color_2_nr_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_2_nr_3.png
--------------------------------------------------------------------------------
/grical/static/markers/color_2_nr_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_2_nr_4.png
--------------------------------------------------------------------------------
/grical/static/markers/color_2_nr_5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_2_nr_5.png
--------------------------------------------------------------------------------
/grical/static/markers/color_2_nr_6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_2_nr_6.png
--------------------------------------------------------------------------------
/grical/static/markers/color_2_nr_7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_2_nr_7.png
--------------------------------------------------------------------------------
/grical/static/markers/color_2_nr_8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_2_nr_8.png
--------------------------------------------------------------------------------
/grical/static/markers/color_2_nr_9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_2_nr_9.png
--------------------------------------------------------------------------------
/grical/static/markers/color_3_nr_0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_3_nr_0.png
--------------------------------------------------------------------------------
/grical/static/markers/color_3_nr_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_3_nr_1.png
--------------------------------------------------------------------------------
/grical/static/markers/color_3_nr_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_3_nr_2.png
--------------------------------------------------------------------------------
/grical/static/markers/color_3_nr_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_3_nr_3.png
--------------------------------------------------------------------------------
/grical/static/markers/color_3_nr_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_3_nr_4.png
--------------------------------------------------------------------------------
/grical/static/markers/color_3_nr_5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_3_nr_5.png
--------------------------------------------------------------------------------
/grical/static/markers/color_3_nr_6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_3_nr_6.png
--------------------------------------------------------------------------------
/grical/static/markers/color_3_nr_7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_3_nr_7.png
--------------------------------------------------------------------------------
/grical/static/markers/color_3_nr_8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_3_nr_8.png
--------------------------------------------------------------------------------
/grical/static/markers/color_3_nr_9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_3_nr_9.png
--------------------------------------------------------------------------------
/grical/static/markers/color_4_nr_0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_4_nr_0.png
--------------------------------------------------------------------------------
/grical/static/markers/color_4_nr_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_4_nr_1.png
--------------------------------------------------------------------------------
/grical/static/markers/color_4_nr_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_4_nr_2.png
--------------------------------------------------------------------------------
/grical/static/markers/color_4_nr_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_4_nr_3.png
--------------------------------------------------------------------------------
/grical/static/markers/color_4_nr_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_4_nr_4.png
--------------------------------------------------------------------------------
/grical/static/markers/color_4_nr_5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_4_nr_5.png
--------------------------------------------------------------------------------
/grical/static/markers/color_4_nr_6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_4_nr_6.png
--------------------------------------------------------------------------------
/grical/static/markers/color_4_nr_7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_4_nr_7.png
--------------------------------------------------------------------------------
/grical/static/markers/color_4_nr_8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_4_nr_8.png
--------------------------------------------------------------------------------
/grical/static/markers/color_4_nr_9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_4_nr_9.png
--------------------------------------------------------------------------------
/grical/static/markers/color_5_nr_0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_5_nr_0.png
--------------------------------------------------------------------------------
/grical/static/markers/color_5_nr_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_5_nr_1.png
--------------------------------------------------------------------------------
/grical/static/markers/color_5_nr_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_5_nr_2.png
--------------------------------------------------------------------------------
/grical/static/markers/color_5_nr_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_5_nr_3.png
--------------------------------------------------------------------------------
/grical/static/markers/color_5_nr_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_5_nr_4.png
--------------------------------------------------------------------------------
/grical/static/markers/color_5_nr_5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_5_nr_5.png
--------------------------------------------------------------------------------
/grical/static/markers/color_5_nr_6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_5_nr_6.png
--------------------------------------------------------------------------------
/grical/static/markers/color_5_nr_7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_5_nr_7.png
--------------------------------------------------------------------------------
/grical/static/markers/color_5_nr_8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_5_nr_8.png
--------------------------------------------------------------------------------
/grical/static/markers/color_5_nr_9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_5_nr_9.png
--------------------------------------------------------------------------------
/grical/static/markers/color_6_nr_0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_6_nr_0.png
--------------------------------------------------------------------------------
/grical/static/markers/color_6_nr_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_6_nr_1.png
--------------------------------------------------------------------------------
/grical/static/markers/color_6_nr_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_6_nr_2.png
--------------------------------------------------------------------------------
/grical/static/markers/color_6_nr_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_6_nr_3.png
--------------------------------------------------------------------------------
/grical/static/markers/color_6_nr_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_6_nr_4.png
--------------------------------------------------------------------------------
/grical/static/markers/color_6_nr_5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_6_nr_5.png
--------------------------------------------------------------------------------
/grical/static/markers/color_6_nr_6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_6_nr_6.png
--------------------------------------------------------------------------------
/grical/static/markers/color_6_nr_7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_6_nr_7.png
--------------------------------------------------------------------------------
/grical/static/markers/color_6_nr_8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_6_nr_8.png
--------------------------------------------------------------------------------
/grical/static/markers/color_6_nr_9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_6_nr_9.png
--------------------------------------------------------------------------------
/grical/static/markers/color_7_nr_0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_7_nr_0.png
--------------------------------------------------------------------------------
/grical/static/markers/color_7_nr_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_7_nr_1.png
--------------------------------------------------------------------------------
/grical/static/markers/color_7_nr_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_7_nr_2.png
--------------------------------------------------------------------------------
/grical/static/markers/color_7_nr_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_7_nr_3.png
--------------------------------------------------------------------------------
/grical/static/markers/color_7_nr_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_7_nr_4.png
--------------------------------------------------------------------------------
/grical/static/markers/color_7_nr_5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_7_nr_5.png
--------------------------------------------------------------------------------
/grical/static/markers/color_7_nr_6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_7_nr_6.png
--------------------------------------------------------------------------------
/grical/static/markers/color_7_nr_7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_7_nr_7.png
--------------------------------------------------------------------------------
/grical/static/markers/color_7_nr_8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_7_nr_8.png
--------------------------------------------------------------------------------
/grical/static/markers/color_7_nr_9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_7_nr_9.png
--------------------------------------------------------------------------------
/grical/static/markers/color_8_nr_0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_8_nr_0.png
--------------------------------------------------------------------------------
/grical/static/markers/color_8_nr_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_8_nr_1.png
--------------------------------------------------------------------------------
/grical/static/markers/color_8_nr_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_8_nr_2.png
--------------------------------------------------------------------------------
/grical/static/markers/color_8_nr_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_8_nr_3.png
--------------------------------------------------------------------------------
/grical/static/markers/color_8_nr_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_8_nr_4.png
--------------------------------------------------------------------------------
/grical/static/markers/color_8_nr_5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_8_nr_5.png
--------------------------------------------------------------------------------
/grical/static/markers/color_8_nr_6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_8_nr_6.png
--------------------------------------------------------------------------------
/grical/static/markers/color_8_nr_7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_8_nr_7.png
--------------------------------------------------------------------------------
/grical/static/markers/color_8_nr_8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_8_nr_8.png
--------------------------------------------------------------------------------
/grical/static/markers/color_8_nr_9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_8_nr_9.png
--------------------------------------------------------------------------------
/grical/static/markers/color_9_nr_0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_9_nr_0.png
--------------------------------------------------------------------------------
/grical/static/markers/color_9_nr_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_9_nr_1.png
--------------------------------------------------------------------------------
/grical/static/markers/color_9_nr_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_9_nr_2.png
--------------------------------------------------------------------------------
/grical/static/markers/color_9_nr_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_9_nr_3.png
--------------------------------------------------------------------------------
/grical/static/markers/color_9_nr_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_9_nr_4.png
--------------------------------------------------------------------------------
/grical/static/markers/color_9_nr_5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_9_nr_5.png
--------------------------------------------------------------------------------
/grical/static/markers/color_9_nr_6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_9_nr_6.png
--------------------------------------------------------------------------------
/grical/static/markers/color_9_nr_7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_9_nr_7.png
--------------------------------------------------------------------------------
/grical/static/markers/color_9_nr_8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_9_nr_8.png
--------------------------------------------------------------------------------
/grical/static/markers/color_9_nr_9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/markers/color_9_nr_9.png
--------------------------------------------------------------------------------
/grical/static/ms-icon-144x144.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/ms-icon-144x144.png
--------------------------------------------------------------------------------
/grical/static/ms-icon-150x150.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/ms-icon-150x150.png
--------------------------------------------------------------------------------
/grical/static/ms-icon-310x310.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/ms-icon-310x310.png
--------------------------------------------------------------------------------
/grical/static/ms-icon-70x70.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/ms-icon-70x70.png
--------------------------------------------------------------------------------
/grical/static/open-data-80x15-blue.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/open-data-80x15-blue.png
--------------------------------------------------------------------------------
/grical/static/os_80x15_blue.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/os_80x15_blue.png
--------------------------------------------------------------------------------
/grical/static/rssicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/rssicon.png
--------------------------------------------------------------------------------
/grical/static/tags-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/tags-icon.png
--------------------------------------------------------------------------------
/grical/static/venue-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/venue-icon.png
--------------------------------------------------------------------------------
/grical/static/wikipedia_banner_125x125.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/static/wikipedia_banner_125x125.jpg
--------------------------------------------------------------------------------
/grical/tagging/__init__.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- encoding: utf-8 -*-
3 | # vim: set expandtab tabstop=4 shiftwidth=4 textwidth=79 foldmethod=marker:
4 | # gpl {{{1
5 | #############################################################################
6 | # Copyright 2009-2011 Ivan F. Villanueva B.
7 | #
8 | # This file is part of GriCal.
9 | #
10 | # GriCal is free software: you can redistribute it and/or modify it under
11 | # the terms of the GNU Affero General Public License as published by the Free
12 | # Software Foundation, either version 3 of the License, or (at your option) any
13 | # later version.
14 | #
15 | # GriCal is distributed in the hope that it will be useful, but WITHOUT
16 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17 | # FOR A PARTICULAR PURPOSE. See the Affero GNU General Public License for more
18 | # details.
19 | #
20 | # You should have received a copy of the GNU Affero General Public License
21 | # along with GriCal. If not, see .
22 | #############################################################################
23 | VERSION = (0, 3, 1, "final", 0)
24 |
25 |
26 |
27 | def get_version():
28 | if VERSION[3] == "final":
29 | return "%s.%s.%s" % (VERSION[0], VERSION[1], VERSION[2])
30 | elif VERSION[3] == "dev":
31 | if VERSION[2] == 0:
32 | return "%s.%s.%s%s" % (VERSION[0], VERSION[1], VERSION[3], VERSION[4])
33 | return "%s.%s.%s.%s%s" % (VERSION[0], VERSION[1], VERSION[2], VERSION[3], VERSION[4])
34 | else:
35 | return "%s.%s.%s%s" % (VERSION[0], VERSION[1], VERSION[2], VERSION[3])
36 |
37 |
38 | __version__ = get_version()
39 |
40 |
41 | class AlreadyRegistered(Exception):
42 | """
43 | An attempt was made to register a model more than once.
44 | """
45 | pass
46 |
47 |
48 | registry = []
49 |
50 |
51 | def register(model, tag_descriptor_attr='tags',
52 | tagged_item_manager_attr='tagged'):
53 | """
54 | Sets the given model class up for working with tags.
55 | """
56 |
57 | from tagging.managers import ModelTaggedItemManager, TagDescriptor
58 |
59 | if model in registry:
60 | raise AlreadyRegistered("The model '%s' has already been "
61 | "registered." % model._meta.object_name)
62 | if hasattr(model, tag_descriptor_attr):
63 | raise AttributeError("'%s' already has an attribute '%s'. You must "
64 | "provide a custom tag_descriptor_attr to register." % (
65 | model._meta.object_name,
66 | tag_descriptor_attr,
67 | )
68 | )
69 | if hasattr(model, tagged_item_manager_attr):
70 | raise AttributeError("'%s' already has an attribute '%s'. You must "
71 | "provide a custom tagged_item_manager_attr to register." % (
72 | model._meta.object_name,
73 | tagged_item_manager_attr,
74 | )
75 | )
76 |
77 | # Add tag descriptor
78 | setattr(model, tag_descriptor_attr, TagDescriptor())
79 |
80 | # Add custom manager
81 | ModelTaggedItemManager().contribute_to_class(model, tagged_item_manager_attr)
82 |
83 | # Finally register in registry
84 | registry.append(model)
85 |
--------------------------------------------------------------------------------
/grical/tagging/admin.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- encoding: utf-8 -*-
3 | # vim: set expandtab tabstop=4 shiftwidth=4 textwidth=79 foldmethod=marker:
4 | # gpl {{{1
5 | #############################################################################
6 | # Copyright 2009-2012 Ivan F. Villanueva B.
7 | #
8 | # This file is part of GriCal.
9 | #
10 | # GriCal is free software: you can redistribute it and/or modify it under
11 | # the terms of the GNU Affero General Public License as published by the Free
12 | # Software Foundation, either version 3 of the License, or (at your option) any
13 | # later version.
14 | #
15 | # GriCal is distributed in the hope that it will be useful, but WITHOUT
16 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17 | # FOR A PARTICULAR PURPOSE. See the Affero GNU General Public License for more
18 | # details.
19 | #
20 | # You should have received a copy of the GNU Affero General Public License
21 | # along with GriCal. If not, see .
22 | #############################################################################
23 | from django.contrib import admin
24 | from grical.tagging.models import Tag, TaggedItem
25 | from grical.tagging.forms import TagAdminForm
26 |
27 | class TagAdmin(admin.ModelAdmin):
28 | form = TagAdminForm
29 |
30 | admin.site.register(TaggedItem)
31 | admin.site.register(Tag, TagAdmin)
32 |
--------------------------------------------------------------------------------
/grical/tagging/forms.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- encoding: utf-8 -*-
3 | # vim: set expandtab tabstop=4 shiftwidth=4 textwidth=79 foldmethod=marker:
4 | # gpl {{{1
5 | #############################################################################
6 | # Copyright 2009-2016 Stefanos Kozanis
7 | #
8 | # This file is part of GriCal.
9 | #
10 | # GriCal is free software: you can redistribute it and/or modify it under
11 | # the terms of the GNU Affero General Public License as published by the Free
12 | # Software Foundation, either version 3 of the License, or (at your option) any
13 | # later version.
14 | #
15 | # GriCal is distributed in the hope that it will be useful, but WITHOUT
16 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17 | # FOR A PARTICULAR PURPOSE. See the Affero GNU General Public License for more
18 | # details.
19 | #
20 | # You should have received a copy of the GNU Affero General Public License
21 | # along with GriCal. If not, see .
22 | #############################################################################
23 | """
24 | Tagging components for Django's form library.
25 | """
26 | from django import forms
27 | from django.utils.translation import ugettext as _
28 |
29 | from grical.tagging import settings
30 | from grical.tagging.models import Tag
31 | from grical.tagging.utils import parse_tag_input
32 |
33 | class TagAdminForm(forms.ModelForm):
34 |
35 | class Meta:
36 | model = Tag
37 | fields = ('id', 'name')
38 |
39 | def clean_name(self):
40 | value = self.cleaned_data['name']
41 | tag_names = parse_tag_input(value)
42 | if len(tag_names) > 1:
43 | raise forms.ValidationError(_('Multiple tags were given.'))
44 | elif len(tag_names[0]) > settings.MAX_TAG_LENGTH:
45 | raise forms.ValidationError(
46 | _('A tag may be no more than %(count)s characters long.') %
47 | {'count': settings.MAX_TAG_LENGTH})
48 | return value
49 |
50 | class TagField(forms.CharField):
51 | """
52 | A ``CharField`` which validates that its input is a valid list of
53 | tag names.
54 | """
55 | def clean(self, value):
56 | value = super(TagField, self).clean(value)
57 | if value == u'':
58 | return value
59 | for tag_name in parse_tag_input(value):
60 | if len(tag_name) > settings.MAX_TAG_LENGTH:
61 | raise forms.ValidationError(
62 | _('Each tag may be no more than %(count)s characters long.') %
63 | {'count': settings.MAX_TAG_LENGTH})
64 | return value
65 |
--------------------------------------------------------------------------------
/grical/tagging/generic.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- encoding: utf-8 -*-
3 | # vim: set expandtab tabstop=4 shiftwidth=4 textwidth=79 foldmethod=marker:
4 | # gpl {{{1
5 | #############################################################################
6 | # Copyright 2009-2011 Ivan F. Villanueva B.
7 | #
8 | # This file is part of GriCal.
9 | #
10 | # GriCal is free software: you can redistribute it and/or modify it under
11 | # the terms of the GNU Affero General Public License as published by the Free
12 | # Software Foundation, either version 3 of the License, or (at your option) any
13 | # later version.
14 | #
15 | # GriCal is distributed in the hope that it will be useful, but WITHOUT
16 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17 | # FOR A PARTICULAR PURPOSE. See the Affero GNU General Public License for more
18 | # details.
19 | #
20 | # You should have received a copy of the GNU Affero General Public License
21 | # along with GriCal. If not, see .
22 | #############################################################################
23 | from django.contrib.contenttypes.models import ContentType
24 |
25 | def fetch_content_objects(tagged_items, select_related_for=None):
26 | """
27 | Retrieves ``ContentType`` and content objects for the given list of
28 | ``TaggedItems``, grouping the retrieval of content objects by model
29 | type to reduce the number of queries executed.
30 |
31 | This results in ``number_of_content_types + 1`` queries rather than
32 | the ``number_of_tagged_items * 2`` queries you'd get by iterating
33 | over the list and accessing each item's ``object`` attribute.
34 |
35 | A ``select_related_for`` argument can be used to specify a list of
36 | of model names (corresponding to the ``model`` field of a
37 | ``ContentType``) for which ``select_related`` should be used when
38 | retrieving model instances.
39 | """
40 | if select_related_for is None: select_related_for = []
41 |
42 | # Group content object pks by their content type pks
43 | objects = {}
44 | for item in tagged_items:
45 | objects.setdefault(item.content_type_id, []).append(item.object_id)
46 |
47 | # Retrieve content types and content objects in bulk
48 | content_types = ContentType._default_manager.in_bulk(objects.keys())
49 | for content_type_pk, object_pks in objects.iteritems():
50 | model = content_types[content_type_pk].model_class()
51 | if content_types[content_type_pk].model in select_related_for:
52 | objects[content_type_pk] = model._default_manager.select_related().in_bulk(object_pks)
53 | else:
54 | objects[content_type_pk] = model._default_manager.in_bulk(object_pks)
55 |
56 | # Set content types and content objects in the appropriate cache
57 | # attributes, so accessing the 'content_type' and 'object'
58 | # attributes on each tagged item won't result in further database
59 | # hits.
60 | for item in tagged_items:
61 | item._object_cache = objects[item.content_type_id][item.object_id]
62 | item._content_type_cache = content_types[item.content_type_id]
63 |
--------------------------------------------------------------------------------
/grical/tagging/migrations/0001_initial.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- encoding: utf-8 -*-
3 | # vim: set expandtab tabstop=4 shiftwidth=4 textwidth=79 foldmethod=marker:
4 | # gpl {{{1
5 | #############################################################################
6 | # Copyright 2009-2016 Stefanos Kozanis
7 | #
8 | # This file is part of GriCal.
9 | #
10 | # GriCal is free software: you can redistribute it and/or modify it under
11 | # the terms of the GNU Affero General Public License as published by the Free
12 | # Software Foundation, either version 3 of the License, or (at your option) any
13 | # later version.
14 | #
15 | # GriCal is distributed in the hope that it will be useful, but WITHOUT
16 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17 | # FOR A PARTICULAR PURPOSE. See the Affero GNU General Public License for more
18 | # details.
19 | #
20 | # You should have received a copy of the GNU Affero General Public License
21 | # along with GriCal. If not, see .
22 | #############################################################################
23 | from __future__ import unicode_literals
24 |
25 | from django.db import migrations, models
26 |
27 |
28 | class Migration(migrations.Migration):
29 |
30 | dependencies = [
31 | ('contenttypes', '0002_remove_content_type_name'),
32 | ]
33 |
34 | operations = [
35 | migrations.CreateModel(
36 | name='Tag',
37 | fields=[
38 | ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
39 | ('name', models.CharField(unique=True, max_length=50, verbose_name='name', db_index=True)),
40 | ],
41 | options={
42 | 'ordering': ('name',),
43 | 'verbose_name': 'tag',
44 | 'verbose_name_plural': 'tags',
45 | },
46 | ),
47 | migrations.CreateModel(
48 | name='TaggedItem',
49 | fields=[
50 | ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
51 | ('object_id', models.PositiveIntegerField(verbose_name='object id', db_index=True)),
52 | ('content_type', models.ForeignKey(verbose_name='content type', to='contenttypes.ContentType')),
53 | ('tag', models.ForeignKey(related_name='items', verbose_name='tag', to='tagging.Tag')),
54 | ],
55 | options={
56 | 'verbose_name': 'tagged item',
57 | 'verbose_name_plural': 'tagged items',
58 | },
59 | ),
60 | migrations.AlterUniqueTogether(
61 | name='taggeditem',
62 | unique_together=set([('tag', 'content_type', 'object_id')]),
63 | ),
64 | ]
65 |
--------------------------------------------------------------------------------
/grical/tagging/migrations/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/tagging/migrations/__init__.py
--------------------------------------------------------------------------------
/grical/tagging/settings.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- encoding: utf-8 -*-
3 | # vim: set expandtab tabstop=4 shiftwidth=4 textwidth=79 foldmethod=marker:
4 | # gpl {{{1
5 | #############################################################################
6 | # Copyright 2009-2012 Ivan F. Villanueva B.
7 | #
8 | # This file is part of GriCal.
9 | #
10 | # GriCal is free software: you can redistribute it and/or modify it under
11 | # the terms of the GNU Affero General Public License as published by the Free
12 | # Software Foundation, either version 3 of the License, or (at your option) any
13 | # later version.
14 | #
15 | # GriCal is distributed in the hope that it will be useful, but WITHOUT
16 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17 | # FOR A PARTICULAR PURPOSE. See the Affero GNU General Public License for more
18 | # details.
19 | #
20 | # You should have received a copy of the GNU Affero General Public License
21 | # along with GriCal. If not, see .
22 | #############################################################################
23 | """
24 | Convenience module for access of custom tagging application settings,
25 | which enforces default settings when the main settings module does not
26 | contain the appropriate settings.
27 | """
28 | from django.conf import settings
29 |
30 | # The maximum length of a tag's name.
31 | MAX_TAG_LENGTH = getattr(settings, 'MAX_TAG_LENGTH', 50)
32 |
33 | # Whether to force all tags to lowercase before they are saved to the
34 | # database.
35 | FORCE_LOWERCASE_TAGS = getattr(settings, 'FORCE_LOWERCASE_TAGS', False)
36 |
--------------------------------------------------------------------------------
/grical/tagging/templatetags/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/tagging/templatetags/__init__.py
--------------------------------------------------------------------------------
/grical/tagging/tests/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/tagging/tests/__init__.py
--------------------------------------------------------------------------------
/grical/tagging/tests/models.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- encoding: utf-8 -*-
3 | # vim: set expandtab tabstop=4 shiftwidth=4 textwidth=79 foldmethod=marker:
4 | # gpl {{{1
5 | #############################################################################
6 | # Copyright 2009-2012 Ivan F. Villanueva B.
7 | #
8 | # This file is part of GriCal.
9 | #
10 | # GriCal is free software: you can redistribute it and/or modify it under
11 | # the terms of the GNU Affero General Public License as published by the Free
12 | # Software Foundation, either version 3 of the License, or (at your option) any
13 | # later version.
14 | #
15 | # GriCal is distributed in the hope that it will be useful, but WITHOUT
16 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17 | # FOR A PARTICULAR PURPOSE. See the Affero GNU General Public License for more
18 | # details.
19 | #
20 | # You should have received a copy of the GNU Affero General Public License
21 | # along with GriCal. If not, see .
22 | #############################################################################
23 | from django.db import models
24 |
25 | from grical.tagging.fields import TagField
26 |
27 | class Perch(models.Model):
28 | size = models.IntegerField()
29 | smelly = models.BooleanField(default=True)
30 |
31 | class Parrot(models.Model):
32 | state = models.CharField(max_length=50)
33 | perch = models.ForeignKey(Perch, null=True)
34 |
35 | def __unicode__(self):
36 | return self.state
37 |
38 | class Meta:
39 | ordering = ['state']
40 |
41 | class Link(models.Model):
42 | name = models.CharField(max_length=50)
43 |
44 | def __unicode__(self):
45 | return self.name
46 |
47 | class Meta:
48 | ordering = ['name']
49 |
50 | class Article(models.Model):
51 | name = models.CharField(max_length=50)
52 |
53 | def __unicode__(self):
54 | return self.name
55 |
56 | class Meta:
57 | ordering = ['name']
58 |
59 | class FormTest(models.Model):
60 | tags = TagField('Test', help_text='Test')
61 |
--------------------------------------------------------------------------------
/grical/tagging/tests/settings.py.old:
--------------------------------------------------------------------------------
1 | import os
2 | DIRNAME = os.path.dirname(__file__)
3 |
4 | DEFAULT_CHARSET = 'utf-8'
5 |
6 | test_engine = os.environ.get("TAGGING_TEST_ENGINE", "sqlite3")
7 |
8 | DATABASE_ENGINE = test_engine
9 | DATABASE_NAME = os.environ.get("TAGGING_DATABASE_NAME", "tagging_test")
10 | DATABASE_USER = os.environ.get("TAGGING_DATABASE_USER", "")
11 | DATABASE_PASSWORD = os.environ.get("TAGGING_DATABASE_PASSWORD", "")
12 | DATABASE_HOST = os.environ.get("TAGGING_DATABASE_HOST", "localhost")
13 |
14 | if test_engine == "sqlite":
15 | DATABASE_NAME = os.path.join(DIRNAME, 'tagging_test.db')
16 | DATABASE_HOST = ""
17 | elif test_engine == "mysql":
18 | DATABASE_PORT = os.environ.get("TAGGING_DATABASE_PORT", 3306)
19 | elif test_engine == "postgresql_psycopg2":
20 | DATABASE_PORT = os.environ.get("TAGGING_DATABASE_PORT", 5432)
21 |
22 |
23 | INSTALLED_APPS = (
24 | 'django.contrib.contenttypes',
25 | 'grical.tagging',
26 | 'grical.tagging.tests',
27 | )
28 |
--------------------------------------------------------------------------------
/grical/tagging/tests/tags.txt:
--------------------------------------------------------------------------------
1 | NewMedia 53
2 | Website 45
3 | PR 44
4 | Status 44
5 | Collaboration 41
6 | Drupal 34
7 | Journalism 31
8 | Transparency 30
9 | Theory 29
10 | Decentralization 25
11 | EchoChamberProject 24
12 | OpenSource 23
13 | Film 22
14 | Blog 21
15 | Interview 21
16 | Political 21
17 | Worldview 21
18 | Communications 19
19 | Conference 19
20 | Folksonomy 15
21 | MediaCriticism 15
22 | Volunteer 15
23 | Dialogue 13
24 | InternationalLaw 13
25 | Rosen 12
26 | Evolution 11
27 | KentBye 11
28 | Objectivity 11
29 | Plante 11
30 | ToDo 11
31 | Advisor 10
32 | Civics 10
33 | Roadmap 10
34 | Wilber 9
35 | About 8
36 | CivicSpace 8
37 | Ecosystem 8
38 | Choice 7
39 | Murphy 7
40 | Sociology 7
41 | ACH 6
42 | del.icio.us 6
43 | IntelligenceAnalysis 6
44 | Science 6
45 | Credibility 5
46 | Distribution 5
47 | Diversity 5
48 | Errors 5
49 | FinalCutPro 5
50 | Fundraising 5
51 | Law 5
52 | PhilosophyofScience 5
53 | Podcast 5
54 | PoliticalBias 5
55 | Activism 4
56 | Analysis 4
57 | CBS 4
58 | DeceptionDetection 4
59 | Editing 4
60 | History 4
61 | RSS 4
62 | Social 4
63 | Subjectivity 4
64 | Vlog 4
65 | ABC 3
66 | ALTubes 3
67 | Economics 3
68 | FCC 3
69 | NYT 3
70 | Sirota 3
71 | Sundance 3
72 | Training 3
73 | Wiki 3
74 | XML 3
75 | Borger 2
76 | Brody 2
77 | Deliberation 2
78 | EcoVillage 2
79 | Identity 2
80 | LAMP 2
81 | Lobe 2
82 | Maine 2
83 | May 2
84 | MediaLogic 2
85 | Metaphor 2
86 | Mitchell 2
87 | NBC 2
88 | OHanlon 2
89 | Psychology 2
90 | Queen 2
91 | Software 2
92 | SpiralDynamics 2
93 | Strobel 2
94 | Sustainability 2
95 | Transcripts 2
96 | Brown 1
97 | Buddhism 1
98 | Community 1
99 | DigitalDivide 1
100 | Donnelly 1
101 | Education 1
102 | FairUse 1
103 | FireANT 1
104 | Google 1
105 | HumanRights 1
106 | KM 1
107 | Kwiatkowski 1
108 | Landay 1
109 | Loiseau 1
110 | Math 1
111 | Music 1
112 | Nature 1
113 | Schechter 1
114 | Screencast 1
115 | Sivaraksa 1
116 | Skype 1
117 | SocialCapital 1
118 | TagCloud 1
119 | Thielmann 1
120 | Thomas 1
121 | Tiger 1
122 | Wedgwood 1
--------------------------------------------------------------------------------
/grical/tagging/views.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- encoding: utf-8 -*-
3 | # vim: set expandtab tabstop=4 shiftwidth=4 textwidth=79 foldmethod=marker:
4 | # gpl {{{1
5 | #############################################################################
6 | # Copyright 2009-2016 Stefanos Kozanis
7 | #
8 | # This file is part of GriCal.
9 | #
10 | # GriCal is free software: you can redistribute it and/or modify it under
11 | # the terms of the GNU Affero General Public License as published by the Free
12 | # Software Foundation, either version 3 of the License, or (at your option) any
13 | # later version.
14 | #
15 | # GriCal is distributed in the hope that it will be useful, but WITHOUT
16 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17 | # FOR A PARTICULAR PURPOSE. See the Affero GNU General Public License for more
18 | # details.
19 | #
20 | # You should have received a copy of the GNU Affero General Public License
21 | # along with GriCal. If not, see .
22 | #############################################################################
23 | """
24 | Tagging related views.
25 | """
26 | from django.http import Http404
27 | from django.utils.translation import ugettext as _
28 | from django.views.generic.list_detail import object_list
29 |
30 | from tagging.models import Tag, TaggedItem
31 | from tagging.utils import get_tag
32 |
33 | def tagged_object_list(request, queryset_or_model=None, tag=None,
34 | related_tags=False, related_tag_counts=True, **kwargs):
35 | """
36 | A thin wrapper around
37 | ``django.views.generic.list_detail.object_list`` which creates a
38 | ``QuerySet`` containing instances of the given queryset or model
39 | tagged with the given tag.
40 |
41 | In addition to the context variables set up by ``object_list``, a
42 | ``tag`` context variable will contain the ``Tag`` instance for the
43 | tag.
44 |
45 | If ``related_tags`` is ``True``, a ``related_tags`` context variable
46 | will contain tags related to the given tag for the given model.
47 | Additionally, if ``related_tag_counts`` is ``True``, each related
48 | tag will have a ``count`` attribute indicating the number of items
49 | which have it in addition to the given tag.
50 | """
51 | if queryset_or_model is None:
52 | try:
53 | queryset_or_model = kwargs.pop('queryset_or_model')
54 | except KeyError:
55 | raise AttributeError(_('tagged_object_list must be called with a queryset or a model.'))
56 |
57 | if tag is None:
58 | try:
59 | tag = kwargs.pop('tag')
60 | except KeyError:
61 | raise AttributeError(_('tagged_object_list must be called with a tag.'))
62 |
63 | tag_instance = get_tag(tag)
64 | if tag_instance is None:
65 | raise Http404(_('No Tag found matching "%(tag)s".') % {'tag': tag})
66 | queryset = TaggedItem.objects.get_by_model(queryset_or_model, tag_instance)
67 | if not kwargs.has_key('extra_context'):
68 | kwargs['extra_context'] = {}
69 | kwargs['extra_context']['tag'] = tag_instance
70 | if related_tags:
71 | kwargs['extra_context']['related_tags'] = \
72 | Tag.objects.related_for_model(tag_instance, queryset_or_model,
73 | counts=related_tag_counts)
74 | return object_list(request, queryset, **kwargs)
75 |
--------------------------------------------------------------------------------
/grical/templates/404.html:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wikical/grical/491abdcd0076243a7641cc631d6d3ff1c4db9e66/grical/templates/404.html
--------------------------------------------------------------------------------
/grical/templates/README.TXT:
--------------------------------------------------------------------------------
1 | This file is part of Grical and describes the structure of its html templates. It uses the
2 | Django's template system which is well summarized on http://www.djangobook.com/en/2.0/chapter04/
3 |
4 | ---------
5 | base.html
6 | ---------
7 |
8 | It holds the main look and feel and uses the variables:
9 |
10 | ------------- ---------------------------------------------------------------------
11 | LANGUAGE_CODE is the current user's preferred language, as a string. Example: en-us
12 | DOMAIN example: grical.net
13 | STATIC_URL example: http://grical.net/media/
14 | PROTOCOL example: https
15 | title the title of the page, example: Grical - home
16 | VERSION the version of the software, example: 1.0
17 | ------------- ---------------------------------------------------------------------
18 |
19 | It contains the blocks:
20 |
21 | --------- ---------------------------------------------------------------
22 | feeds empty block in the header of the html page
23 | blockbots block in the header which blocks robots for indexing the pages
24 | css empty block in the header for potential custom css
25 | column1 empty block for the content of the left column
26 | column2 empty block for the content of the right column
27 | --------- ---------------------------------------------------------------
28 |
--------------------------------------------------------------------------------
/grical/templates/accounts/cookies_not_enabled.html:
--------------------------------------------------------------------------------
1 | {# Copyright: 2016 Stefanos Kozanis #}
2 | {% extends "base.html" %}
3 | {% load i18n %}
4 |
5 | {% block container %}
6 |
7 |
8 | {% blocktrans %}
9 | Cookies
10 | are requeired for the operation you have tried. Please enable.
11 | {% endblocktrans %}
12 |
13 |
14 |
15 | {% url "contact_form" as contact_form_url %}
16 | {% blocktrans %}
17 | If the error persists after enabling cookies, please
18 | contact us .
19 | {% endblocktrans %}
20 |
21 |
22 | {% endblock %}
23 |
--------------------------------------------------------------------------------
/grical/templates/accounts/profile.html:
--------------------------------------------------------------------------------
1 | {# Copyright: 2010 Ivan F. Villanueva B. #}
2 | {% extends "base.html" %}
3 |
4 | {% block container }
5 |
6 | {% trans "Your profile" %}
7 |
8 |
--------------------------------------------------------------------------------
/grical/templates/admin/base_site.html:
--------------------------------------------------------------------------------
1 | {# Copyright: 2016 Stefanos Kozanis #}
2 | {% extends "admin/base.html" %}
3 | {% load i18n %}
4 |
5 | {% block title %}{{ title }} | {{ DOMAIN }} {% trans " site admin" %}{% endblock %}
6 |
7 | {% block branding %}
8 |
9 | {{ DOMAIN }} - {% trans "Administrative Interface" %}
10 | {{ VERSION }}
11 | {% endblock %}
12 |
13 | {% block nav-global %}{% endblock %}
14 |
--------------------------------------------------------------------------------
/grical/templates/also_recurrences_form.html:
--------------------------------------------------------------------------------
1 | {# Copyright: 2011 Ivan F. Villanueva B. #}
2 | {% load i18n %}
3 | {% if also_recurrences_form %}
4 |
5 | {% trans "Warning! This is a recurring event. If not only this event is selected below, the other selected events' data will be overwritten except start date, end date, deadlines and sessions." %}
6 | {{ also_recurrences_form.as_p }}
7 |
8 | {% endif %}
9 |
--------------------------------------------------------------------------------
/grical/templates/boxes.html:
--------------------------------------------------------------------------------
1 | {# Copyright: 2016 George Vlachos #}
2 | {% load i18n %}
3 | {% load humanize %}
4 |
5 |
6 | {% for eventdate in eventdates %}
7 | {% ifchanged eventdate.eventdate_date %}
8 | {% if forloop.first %}
9 |
10 | {% else %}
11 |
12 |
13 | {% endif %}
14 |
{{ eventdate.eventdate_date|naturalday }}
15 | {% endifchanged %}
16 | {% include "event_show_medium.html" %}
17 | {% if forloop.last %}
18 |
19 | {% endif %}
20 | {% endfor %}
21 |
22 |
--------------------------------------------------------------------------------
/grical/templates/comments/form.html:
--------------------------------------------------------------------------------
1 | {% load comments %}
2 |
3 |
78 |
--------------------------------------------------------------------------------
/grical/templates/comments/posted.html:
--------------------------------------------------------------------------------
1 | {# Copyright: 2016 George Vlachos #}
2 | {% extends "base.html" %}
3 |
4 | {% load comments %}
5 | {% load i18n %}
6 | {% load urlsearch %}
7 |
8 | {% block container %}
9 |
10 |
21 |
22 | {% endblock %}
23 |
--------------------------------------------------------------------------------
/grical/templates/contact_form/contact_form.html:
--------------------------------------------------------------------------------
1 | {# Copyright: 2011 Ivan F. Villanueva B. #}
2 | {% extends "base.html" %}
3 | {% load i18n %}
4 |
5 | {% block container %}
6 |
7 |
64 |
65 |
66 | {% endblock %}
67 |
--------------------------------------------------------------------------------
/grical/templates/contact_form/contact_form.txt:
--------------------------------------------------------------------------------
1 | {% load i18n %}{% blocktrans %}{{ site }} feedback{% endblocktrans %}
2 |
3 | {% trans "Name:" %} {{ name }}
4 |
5 | {% trans "Email:" %} {{ email }}
6 |
7 | {% trans "Message:" %}
8 |
9 | {{ body }}
10 |
--------------------------------------------------------------------------------
/grical/templates/contact_form/contact_form_sent.html:
--------------------------------------------------------------------------------
1 | {# Copyright: 2011 Ivan F. Villanueva B. #}
2 | {% extends "base.html" %}
3 | {% load i18n %}
4 |
5 | {% block container %}
6 |
7 | {% trans "Feedback" %}
8 |
9 | {% trans "Thanks a lot for your feedback. We will try our best." %}
10 |
11 | {% endblock %}
12 |
--------------------------------------------------------------------------------
/grical/templates/contact_form/contact_form_subject.txt:
--------------------------------------------------------------------------------
1 | {% load i18n %}{% blocktrans %}{{ site }} feedback{% endblocktrans %}
2 |
--------------------------------------------------------------------------------
/grical/templates/event_delete.html:
--------------------------------------------------------------------------------
1 | {# Copyright: 2016 George Vlachos #}
2 | {% extends "base.html" %}
3 | {% load i18n %}
4 |
5 | {% block container %}
6 |
7 |
8 |
9 |
10 |
{% csrf_token %}
11 |
22 |
41 |
49 |
54 |
55 |
56 |
57 |
58 |
59 | {% endblock %}
60 |
61 |
--------------------------------------------------------------------------------
/grical/templates/event_deleted.html:
--------------------------------------------------------------------------------
1 | {# Copyright: 2016 Stefanos Kozanis #}
2 | {% extends "base.html" %}
3 | {% load i18n %}
4 | {% load humanize %}
5 |
6 | {% block container %}
7 |
8 | {% trans "Deleted event" %}
9 |
10 | {% blocktrans with revision.date_created.date as date and revision.date_created.time as time and revisioninfo.reason as reason %}
11 | The following event was deleted {{ date }} at {{ time }} by {{ username }} given as reason: {{ reason }}.
12 | {% endblocktrans %}
13 |
14 | {{ revisioninfo.as_text }}
15 |
16 |
17 |
18 | {% if not READ_ONLY %}
19 |
20 | {% if USER.is_authenticated %}
21 | {% trans 'You can undelete it.' %}
22 | {% else %}
23 | {% trans "If you were logged-in, you could undelete this event" %}
24 | {% endif %}
25 |
26 | {% endif %}
27 |
28 |
29 | {% if revisions_diffs %}
30 |
{% trans "History" %}
31 | {% for revision, diff in revisions_diffs %}
32 | {% if diff %}
33 |
{{ revision.date_created.isoformat }}
34 | {{ diff|safe }} {# FIXME: when creating the html diff ensure escaping #}
35 | {% endif %}
36 | {% endfor %}
37 | {% else %}
38 |
{% trans "This event has no history so far" %}
39 | {% endif %}
40 |
41 |
42 | {% endblock %}
43 |
44 |
--------------------------------------------------------------------------------
/grical/templates/event_edit_raw.html:
--------------------------------------------------------------------------------
1 | {# Copyright: 2016 George Vlachos #}
2 | {% extends "base.html" %}
3 | {% load i18n %}
4 |
5 | {% block container %}
6 |
7 | {% include "event_options.html" %}
8 |
9 |
10 |
11 |
12 |
{% trans "Edit the event" %}:
13 |
14 |
15 | {% if form.errors or form.non_field_errors %}
16 |
17 | {% trans "Please correct the following" %} {% blocktrans count form.errors as counter %}error{% plural %}errors{% endblocktrans %}:
18 |
19 | {% endif %}
20 | {% if form.non_field_errors %}
21 | {% for error in form.non_field_errors %}
22 |
{{ error }}
23 | {% endfor %}
24 | {% endif %}
25 |
{% csrf_token %}
26 |
27 |
28 | {{ event_textarea }}
29 | {% if form.event_astext.errors %}{{ form.event_astext.errors }}{% endif %}
30 |
31 |
32 |
37 |
42 |
43 |
44 |
45 | {% comment %}
46 |
50 | {% endcomment %}
51 |
52 |
{% trans "Example:" %}
53 |
{{ example }}
54 |
55 |
56 |
57 |
58 | {% endblock %}
59 |
60 |
--------------------------------------------------------------------------------
/grical/templates/event_edit_recurrences.html:
--------------------------------------------------------------------------------
1 | {# Copyright: 2016 George Vlachos #}
2 | {% extends "base.html" %}
3 | {% load i18n %}
4 |
5 | {% block container %}
6 |
7 |
8 |
9 |
10 |
11 |
{% csrf_token %}
12 |
13 |
14 | {% trans "Recurrences of:" %} {{ event }}
15 |
16 |
17 |
18 | {% for month in months %}
19 |
{{ month }}
20 | {% endfor %}
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 | {% endblock %}
31 |
--------------------------------------------------------------------------------
/grical/templates/event_history.html:
--------------------------------------------------------------------------------
1 | {# Copyright: 2016 George Vlachos #}
2 | {% extends "base.html" %}
3 |
4 | {% load i18n %}
5 | {% load event_tags %}
6 | {% load cache %}
7 |
8 | {% block container %}
9 |
10 | {% cache 2592000 event_history event.id event.version user_authenticated %}
11 |
12 | {% include "event_options.html" %}
13 |
14 |
15 |
16 |
17 |
18 |
19 |
{% trans "History of: " %} {% if event.acronym %}{{ event.acronym|escape }} - {% endif %}{{ event.title|escape }}
20 |
21 |
{% trans "Current version" %} ({{ event.modification_time.isoformat }})
22 |
23 | {{ event.as_text|escape }}
24 |
25 |
26 | {% for revision, diff in revisions_diffs %}
27 | {% if diff %}
28 |
{{ revision.date_created.isoformat }}
29 | {% if USER.is_authenticated %}
30 |
31 | {% trans "Revert event to the left version" %}
32 | {% endif %}
33 | {{ diff|safe }} {# FIXME: when creating the html diff ensure escaping #}
34 | {% endif %}
35 | {% empty %}
36 |
{% trans "This event has no history so far" %}
37 | {% endfor %}
38 |
39 |
40 |
41 |
42 |
43 |
44 | {% endcache %}
45 |
46 | {% endblock %}
47 |
--------------------------------------------------------------------------------
/grical/templates/event_options.html:
--------------------------------------------------------------------------------
1 | {# Copyright: 2016 George Vlachos #}
2 | {% load i18n %}
3 | {% load event_tags %}
4 |
5 | {% if event and event.id %}
6 |
23 | {% endif %}
--------------------------------------------------------------------------------
/grical/templates/event_show_raw.html:
--------------------------------------------------------------------------------
1 | {# Copyright: 2016 Stefanos Kozanis #}
2 | {% extends "base.html" %}
3 | {% load i18n %}
4 | {% load event_tags %}
5 |
6 | {% block container %}
7 |
8 |
9 |
10 |
11 |
12 | {% if not READ_ONLY %}
13 | {% trans "edit" %}
14 |
15 | {% trans "edit as text" %}
16 |
17 | {% trans "add to group" %}
18 | {% endif %}
19 |
20 |
21 |
22 |
23 | {{ event_textarea }}
24 |
25 |
26 |
27 |
28 | {% endblock %}
29 |
--------------------------------------------------------------------------------
/grical/templates/event_show_small.html:
--------------------------------------------------------------------------------
1 | {# Copyright: 2016 Stefanos Kozanis #}
2 | {% load i18n %}
3 | {% load urlsearch %}
4 | {% load cache %}
5 |
6 | {% cache 2592000 event_show_small event.id event.version %}
7 |
8 | {% if event.upcomingdate != event.startdate and event.upcomingdate != event.enddate %}
9 | ( {{ event.upcomingdate }} )
10 | {% endif %}
11 | {{ event.startdate }} {% if event.enddate %} : {{ event.enddate }} {% endif %}
12 |
13 | {{ event.title }}
14 | {% if event.acro %} ( {{ event.acro }} ) {% endif %}
15 | {% if event.city or country %}@{% endif %}
16 | {% if event.city %}
17 | {{ event.city|capfirst }} {% if event.country %},{% endif %}
18 | {% endif %}
19 | {% if event.country %}
20 |
21 | {{ event.countryname }}
22 |
23 | {% endif %}
24 | {% endcache %}
25 |
--------------------------------------------------------------------------------
/grical/templates/event_show_small_start.html:
--------------------------------------------------------------------------------
1 | {# Copyright: 2016 Stefanos Kozanis #}
2 | {% load i18n %}
3 | {% load urlsearch %}
4 |
5 |
6 | {{ event.start }}
7 |
8 | {{ event.title }}
9 | {% if event.acro %} ( {{ event.acro }} ) {% endif %}
10 | {% if event.city or country %}@{% endif %}
11 | {% if event.city %}
12 | {{ event.city|capfirst }}
13 | {% endif %}
14 | {% if event.country %}
15 |
16 | {{ event.country|capfirst }}
17 |
18 | {% endif %}
19 |
--------------------------------------------------------------------------------
/grical/templates/event_undelete_error.html:
--------------------------------------------------------------------------------
1 | {# Copyright: 2016 Stefanos Kozanis #}
2 | {% extends "base.html" %}
3 | {% load i18n %}
4 |
5 | {% block container %}
6 |
7 |
8 | {% trans "You have tried to undelete the event below." %}
9 | {% trans "Unfortunately it cannot be undeleted because there is another event with the same title and start date:" %}
10 | {{ equal.start }} : {{ equal.title }}
11 |
12 |
13 | {% trans "To undelete the event below change or delete first the event with the same title and start date:" %}
14 | {{ equal.start }} : {{ equal.title }}
15 |
16 |
17 | {% trans "Not undeleted event" %}
18 |
19 |
20 | {{ as_text }}
21 |
22 |
23 | {% endblock %}
24 |
25 |
--------------------------------------------------------------------------------
/grical/templates/events_xml.txt:
--------------------------------------------------------------------------------
1 |
2 |
3 | {% for event in events %}
4 |
5 | {{ event.title }}
6 | {{ event.start }}
7 | {{ event.upcoming }}
8 | {{ event.tags }}
9 | {{ event.geometry.kml }}
10 | {{ event.url }}
11 |
12 | {% endfor %}
13 |
14 |
--------------------------------------------------------------------------------
/grical/templates/group_list.html:
--------------------------------------------------------------------------------
1 | {# Copyright: 2016 George Vlachos #}
2 | {% load i18n %}
3 |
4 | {% if user.username and groups %}
5 |
6 | {% for group in groups %}
7 |
8 |
9 |
10 |
11 |
12 | {{ group.name }} ({{ group.future_events_count }})
13 | {% if not READ_ONLY %}
14 | | quit |
15 | | invite |
16 | {% endif %}
17 |
18 |
19 | {% for event in group.future_events %}
20 | {% include "event_show_one_line.html" %}
21 | {% empty %}
22 | {% trans "No future events in this group" %}
23 | {% endfor %}
24 |
25 | {% empty %}
26 | {% trans "You are not a member of any group" %}
27 | {% endfor %}
28 |
29 | {% endif %}
30 |
31 | {% if user.username %}
32 | {% if not READ_ONLY %}
33 | {% trans "Create a new group" %}
34 | {% endif %}
35 | {% trans "Coming events in my groups" %}
36 | {% if group_events %}
37 | {% for g in group_events %}
38 | Group: {{g.group_name}}
39 | {% for event in g.el %}
40 |
41 |
42 |
{{ event.title }}
43 |
{{ event.start }} {% if event.end %} : {{ event.end }} {% endif %}
44 |
45 |
46 |
47 | {% endfor %}
48 |
49 | {% endfor %}
50 | {% else %}
51 |
52 | {% trans "No events in your groups." %}
53 | {% endif %}
54 | {% else %}
55 | {% trans "What is Grical?" %}
56 | {{ about_text|restructuredtext }}
57 | {% if not READ_ONLY %}
58 | {% trans "Create an account now" %}
59 | {% endif %}
60 | {% endif %}
61 |
--------------------------------------------------------------------------------
/grical/templates/groups/add_event_to_group.html:
--------------------------------------------------------------------------------
1 | {# Copyright: 2016 George Vlachos #}
2 | {% extends "base.html" %}
3 | {% load i18n %}
4 |
5 | {% block container %}
6 |
7 |
8 |
9 |
10 |
{% csrf_token %}
11 |
12 |
13 | {% blocktrans with event.title as title %}
14 | {{ title }}
15 | can be added to:{% endblocktrans %}
16 |
17 |
18 |
19 | {{ form }}
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 | {% endblock %}
28 |
--------------------------------------------------------------------------------
/grical/templates/groups/create.html:
--------------------------------------------------------------------------------
1 | {# Copyright: 2016 George Vlachos #}
2 | {% extends "base.html" %}
3 | {% load i18n %}
4 |
5 | {% block container %}
6 |
7 |
53 |
54 | {% endblock %}
55 |
--------------------------------------------------------------------------------
/grical/templates/groups/group_view.html:
--------------------------------------------------------------------------------
1 | {# Copyright: 2016 George Vlachos #}
2 | {% extends "base.html" %}
3 | {% load i18n %}
4 |
5 | {% block container %}
6 |
7 |
50 |
51 | {% endblock %}
52 |
--------------------------------------------------------------------------------
/grical/templates/groups/groups_coming_events.html:
--------------------------------------------------------------------------------
1 | {# Copyright: 2016 Stefanos Kozanis #}
2 | {% load i18n %}
3 |
4 |
5 |
{% trans "Next coming dates for events in your groups:" %}
6 |
7 | {% for group in USER.get_groups %}
8 |
9 |
18 |
19 |
20 | {% if group.has_coming_events %}
21 |
22 | {% for event in group.get_coming_events %}
23 | {% include "event_show_small.html" %}
24 | {% endfor %}
25 |
26 | {% else %}
27 |
{% trans "No events with coming dates" %}
28 | {% endif %}
29 |
30 | {% endfor %}
31 |
32 |
--------------------------------------------------------------------------------
/grical/templates/groups/invitation_activate.html:
--------------------------------------------------------------------------------
1 | {# Copyright: 2016 Stefanos Kozanis #}
2 | {% extends "base.html" %}
3 | {% load i18n %}
4 |
5 | {% block container %}
6 |
7 | {% blocktrans with group.name as group_name %}
8 | You have joined the group '{{ group_name }}'
9 | {% endblocktrans %}
10 |
11 |
12 |
13 | {% blocktrans with group.name as group_name %}
14 | You can now visit the {{ group_name }}'s group page.
15 | {% endblocktrans %}
16 |
17 |
18 |
19 | {% trans "Coming events in the group" %}
20 | {% if group.has_coming_events %}
21 | {% for event in group.get_coming_events %}
22 | {% include "event_show_small.html" %}
23 | {% endfor %}
24 | {% else %}
25 | {% trans "No coming events in the group at the moment" %}
26 | {% endif %}
27 |
28 | {% endblock %}
29 |
--------------------------------------------------------------------------------
/grical/templates/groups/invitation_activate_failed.html:
--------------------------------------------------------------------------------
1 | {# Copyright: 2010 Ivan F. Villanueva B. #}
2 | {% extends "base.html" %}
3 | {% load i18n %}
4 |
5 | {% block container %}
6 |
7 |
8 | {% blocktrans with group.name as group_name %}
9 | Your activation key for the following group is invalid: '{{ group_name }}'
10 | {% endblocktrans %}
11 |
12 | {% endblock %}
13 |
--------------------------------------------------------------------------------
/grical/templates/groups/invitation_email.txt:
--------------------------------------------------------------------------------
1 | {% load i18n %}{% blocktrans %}You have been invited to join a group on {{site_name}}.
2 |
3 | Your username: {{ guest }}
4 | The invitation was sent by: {{ host }}
5 | The group to join is: {{ group }}
6 |
7 | To accept the invitation click:{% endblocktrans %}
8 | http://{{site_domain}}{% url "group_invite_activate" activation_key %}
9 |
10 | {% blocktrans %}This need to be done in less than {{ expiration_days }} days.
11 |
12 | To deny the invitation simply do nothing{% endblocktrans %}
13 |
14 | --
15 | http://{{site_domain}}
16 |
--------------------------------------------------------------------------------
/grical/templates/groups/invitation_email_subject.txt:
--------------------------------------------------------------------------------
1 | {% load i18n %}{{ site_name }} - {% blocktrans %}group invitation for {{ guest }} from {{ host }} to {{ group }}{% endblocktrans %}
2 |
--------------------------------------------------------------------------------
/grical/templates/groups/invite.html:
--------------------------------------------------------------------------------
1 | {# Copyright: 2016 George Vlachos #}
2 | {% extends "base.html" %}
3 | {% load i18n %}
4 |
5 | {% block container %}
6 |
7 |
48 |
49 | {% endblock %}
50 |
--------------------------------------------------------------------------------
/grical/templates/groups/list_my.html:
--------------------------------------------------------------------------------
1 | {# Copyright: 2016 George Vlachos #}
2 | {% extends "base.html" %}
3 | {% load i18n %}
4 | {% block container %}
5 |
6 |
7 |
32 |
33 | {% endblock %}
34 |
35 |
--------------------------------------------------------------------------------
/grical/templates/groups/quit_group_confirm.html:
--------------------------------------------------------------------------------
1 | {# Copyright: 2016 George Vlachos #}
2 | {% extends "base.html" %}
3 | {% load i18n %}
4 | {% block container %}
5 |
6 |
7 |
8 |
9 |
10 |
11 |
{% trans "Confirm quitting the group" %}:
12 | {% if group_id %}
13 |
14 | {% trans "You are the only member of the group now. If you quit, the group will be deleted. Are you sure you would like to quit the group"%} "{{group_name}}"?
15 |
16 |
17 |
18 | {% trans "confirm by clicking here" %}
19 |
20 |
21 |
22 | {% trans "Note: this operation is irreversable!" %}
23 | {% trans "You can not join a group by yourself, you can only be invited by someone who is a member of the group." %}
24 |
25 | {% else %}
26 |
{% trans "No groups found!" %}
27 | {% endif %}
28 |
29 |
30 |
31 |
32 |
33 | {% endblock %}
34 |
35 |
--------------------------------------------------------------------------------
/grical/templates/help.html:
--------------------------------------------------------------------------------
1 | {# Copyright: 2016 George Vlachos #}
2 | {% extends "base.html" %}
3 | {% load markup %}
4 |
5 | {% block container %}
6 |
7 |
8 | {{ usage_text|restructuredtext }}
9 |
10 |
11 | {% endblock %}
12 |
--------------------------------------------------------------------------------
/grical/templates/legal_entity.html:
--------------------------------------------------------------------------------
1 | {% load i18n %}
2 |
3 | {# Add legal entity text here, e.g. responsible person etc #}
4 |
--------------------------------------------------------------------------------
/grical/templates/list_events_my.html:
--------------------------------------------------------------------------------
1 | {# Copyright: 2011 Ivan F. Villanueva B. #}
2 | {% extends "base.html" %}
3 | {% load i18n %}
4 |
5 | {% block container %}
6 | {% trans "Events submitted by me" %}:
7 | {% include "list_events_wrapper.html" %}
8 | {% endblock %}
9 |
10 |
--------------------------------------------------------------------------------
/grical/templates/list_events_of_user.html:
--------------------------------------------------------------------------------
1 | {# Copyright: 2010 Ivan F. Villanueva B. #}
2 | {% extends "base.html" %}
3 | {% load i18n %}
4 |
5 | {% block container %}
6 | {% trans "Events created by the user" %} {{ username }}:
7 | {% include "list_events_wrapper.html" %}
8 | {% endblock %}
9 |
10 |
--------------------------------------------------------------------------------
/grical/templates/list_events_wrapper.html:
--------------------------------------------------------------------------------
1 | {# Copyright: 2011 Ivan F. Villanueva B. #}
2 | {% load i18n %}
3 |
4 | {% if events %}
5 | {% for event in events %}
6 |
7 | {% include "event_show_small.html" %}
8 | {% endfor %}
9 | {% else %}
10 | {% trans "No events found" %}!
11 | {% endif %}
12 |
13 |
--------------------------------------------------------------------------------
/grical/templates/list_filters_my.html:
--------------------------------------------------------------------------------
1 | {# Copyright: 2016 George Vlachos #}
2 | {% extends "base.html" %}
3 | {% load i18n %}
4 |
5 | {% block container %}
6 |
7 |
8 |
9 |
10 |
{% trans "My filters" %}:
11 |
12 |
13 | {% for fil in filters %}
14 |
15 | {{ fil.name }}
16 | {# TODO: cache #}
17 | ({{ fil.matches_count }})
18 | {% if not READ_ONLY %}
19 | edit
20 | delete
21 | {% endif %}
22 |
23 |
24 |
25 | {% trans "Query:" %} {{ fil.query }}
26 | {% for event in fil.upcoming_events %}
27 | {% include "event_show_small.html" %}
28 | {% endfor %}
29 |
30 | {% endfor %}
31 |
32 |
33 |
34 |
35 |
36 |
37 | {% endblock %}
38 |
--------------------------------------------------------------------------------
/grical/templates/mail/email_accepted_event.txt:
--------------------------------------------------------------------------------
1 | {% load i18n %}{% autoescape off %}{% blocktrans with event.title as event_title %}Hello,
2 |
3 | you submitted by email an event which has been accepted.
4 | Title: {{ event_title }}{% endblocktrans %}
5 | http://{{ site_domain }}{{ event.get_absolute_url }}
6 |
7 | -- {% blocktrans %}
8 | Your {{ site_name }} team{% endblocktrans %}
9 | http://{{ site_domain }}
10 |
11 | ==== {% trans "original message" %} ====
12 | {{ original_message }}{% endautoescape %}
13 |
--------------------------------------------------------------------------------
/grical/templates/mail/email_parsing_errors.txt:
--------------------------------------------------------------------------------
1 | {% load i18n %}
2 | {% autoescape off %}
3 | {% if errors_dict %}
4 | {% blocktrans count errors_dict|length as counter %}
5 | An email you submitted to {{ site_name }} contained one error:
6 | {% plural %}
7 | An email you submitted to {{ site_name }} contained {{ counter }} errors:
8 | {% endblocktrans %}
9 | {% for field_errors_pairs in errors_dict.items %}
10 | {% blocktrans with field_errors_pairs.0 as field %}
11 | Field {{ field }} is not correct:
12 | {% endblocktrans %}
13 | {% for error in field_errors_pairs.1 %}
14 | {% blocktrans with error as err %}
15 | Error found: {{ err }}
16 | {% endblocktrans %}
17 | {% endfor %}
18 | {% endfor %}
19 |
20 | {% else %}
21 | {% blocktrans count errors_list|length as counter %}
22 | An email you submitted to {{ site_name }} contained one error:
23 | {% plural %}
24 | An email you submitted to {{ site_name }} contained {{ counter }} errors:
25 | {% endblocktrans %}
26 | {% for error in errors_list %}
27 | {{ error }}
28 | {% endfor %}
29 | {% endif %}
30 |
31 | --
32 | {% blocktrans %}Your {{ site_name }} team{% endblocktrans %}
33 | http://{{ site_domain }}
34 |
35 | {% trans "========== original message sent by you: ==========" %}
36 | {{ original_message }}
37 | {% endautoescape %}
38 |
--------------------------------------------------------------------------------
/grical/templates/mail/event_notice.txt:
--------------------------------------------------------------------------------
1 | {% load i18n %}{% autoescape off %}
2 | {% if event.acronym %}{{ event.acronym }} | {% endif %}{{ event.title }}
3 | {% if event.upcoming != event.start and event.upcoming != event.end %}( {{ event.upcoming }} ) {% endif %}{{ event.start }}{% if event.end %} : {{ event.end }}{% endif %}
4 | {% if event.city %}{{ event.city|capfirst }}{% endif %}{% if event.country %} ({{ event.country }}){% endif %}
5 | {% if event.get_tags %}{% for tag in event.get_tags|slice:":10" %}{{ tag }} {% endfor %}{% endif %}
6 |
7 | http://{{ site_domain }}{{ event.get_absolute_url }}
8 |
9 | {% blocktrans with filter.name as filter_name %}Hello {{ username }},
10 |
11 | this is an automated email to inform you as wished that one of your
12 | filters at {{ site_domain }} matches the above event.
13 | Filter name: {{ filter_name }}
14 | {% endblocktrans %}
15 | {% trans "You can edit your filter and turn off notifications at:" %}
16 | http://{{ site_domain }}{{ filter.get_absolute_url }}
17 |
18 | -- {% blocktrans %}
19 | Your {{ site_name }} team{% endblocktrans %}
20 | http://{{ site_domain }}{% endautoescape %}
21 |
--------------------------------------------------------------------------------
/grical/templates/pagination.html:
--------------------------------------------------------------------------------
1 | {# Copyright: 2016 George Vlachos #}
2 | {% load i18n %}
3 |
4 |
5 | {% if page.has_previous %}
6 |
7 | {% trans "previous" %}
8 |
9 | {% endif %}
10 |
11 |
12 | {% blocktrans with page.number as number and page.paginator.num_pages as num_pages %}
13 | Page {{ number }} of {{ num_pages }}.
14 | {% endblocktrans %}
15 |
16 |
17 | {% if page.has_next %}
18 |
19 | {% trans "next" %}
20 |
21 | {% endif %}
22 |
23 |
--------------------------------------------------------------------------------
/grical/templates/registration/activate.html:
--------------------------------------------------------------------------------
1 | {# Copyright: 2016 George Vlachos #}
2 | {% extends "base.html" %}
3 | {% load i18n %}
4 |
5 | {% block title %}
6 | {% trans "user activated" %} | {{ block.super }}
7 | {% endblock %}
8 |
9 | {% block container %}
10 |
11 | {% if account %}
12 |
13 |
21 |
22 | {% else %}
23 |
24 |
25 |
26 |
27 |
{% trans "Account activation failed" %}
28 |
29 |
30 |
31 |
32 | {% endif %}
33 |
34 | {% endblock %}
35 |
--------------------------------------------------------------------------------
/grical/templates/registration/activation_email.txt:
--------------------------------------------------------------------------------
1 | {% load i18n %}
2 | {% blocktrans with site.domain as domain %}
3 | Thanks for registering at {{ domain }}.
4 |
5 | Please activate your account by opening the following link.{% endblocktrans %}
6 | http://{{site.domain}}{% url "registration_activate" activation_key %}
7 | {% blocktrans %}
8 | This need to be done in less than {{ expiration_days }} days.
9 | {% endblocktrans %}
10 |
11 | --
12 | http://{{site.domain}}
13 |
--------------------------------------------------------------------------------
/grical/templates/registration/activation_email_subject.txt:
--------------------------------------------------------------------------------
1 | {% load i18n %}[{{site.domain}}] {% trans "Account activation email" %}
2 |
--------------------------------------------------------------------------------
/grical/templates/registration/login.html:
--------------------------------------------------------------------------------
1 | {# Copyright: 2016 George Vlachos #}
2 | {% extends "base.html" %}
3 | {% load i18n %}
4 |
5 | {% block container %}
6 |
7 |
8 |
9 |
10 |
{% csrf_token %}
11 | {% trans "Login" %}
12 | {% if form.errors %}
13 |
14 |
{% trans "Your username and password didn't match. Please try again" %}.
15 |
16 | {% endif %}
17 |
18 |
22 |
23 |
24 |
28 |
29 |
30 | {% comment %}
31 |
32 |
33 | Remember me
34 | {% endcomment %}
35 | {% trans "Forgot your password ?" %}
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 | {% endblock %}
47 |
48 |
--------------------------------------------------------------------------------
/grical/templates/registration/logout.html:
--------------------------------------------------------------------------------
1 | {# Copyright: 2016 George Vlachos #}
2 | {% extends "base.html" %}
3 | {% load i18n %}
4 |
5 | {% block title %}{% trans 'Logout successful' %}{% endblock %}
6 |
7 | {% block container %}
8 |
9 |
10 |
11 |
12 |
{% trans 'Logout successful' %}
13 |
{% trans "You have been logged out." %}
14 |
15 |
16 |
17 |
18 | {% endblock %}
19 |
--------------------------------------------------------------------------------
/grical/templates/registration/password_change_done.html:
--------------------------------------------------------------------------------
1 | {# Copyright: 2016 George Vlachos #}
2 | {% extends "base.html" %}
3 | {% load i18n %}
4 |
5 | {% block title %}{% trans 'Password change successful' %}{% endblock %}
6 |
7 | {% block container %}
8 |
9 |
10 |
11 |
12 |
{% trans 'Password change successful' %}
13 |
{% trans "Your password was changed." %}
14 |
15 |
16 |
17 |
18 | {% endblock %}
19 |
--------------------------------------------------------------------------------
/grical/templates/registration/password_reset_complete.html:
--------------------------------------------------------------------------------
1 | {# Copyright: 2016 George Vlachos #}
2 | {% extends "base.html" %}
3 | {% load i18n %}
4 |
5 | {% block title %}{% trans 'Password reset complete' %}{% endblock %}
6 |
7 | {% block container %}
8 |
9 |
10 |
11 |
12 |
{% trans 'Password reset complete' %}
13 |
{% trans "Your password has been set. You may go ahead and log in now." %}
14 |
{% trans 'Log in' %}
15 |
16 |
17 |
18 |
19 | {% endblock %}
20 |
--------------------------------------------------------------------------------
/grical/templates/registration/password_reset_done.html:
--------------------------------------------------------------------------------
1 | {# Copyright: 2016 George Vlachos #}
2 | {% extends "base.html" %}
3 | {% load i18n %}
4 |
5 | {% block title %}{% trans 'Password reset successful' %}{% endblock %}
6 |
7 | {% block container %}
8 |
9 |
10 |
11 |
12 |
{% trans 'Password reset successful' %}
13 |
{% trans "We've e-mailed you instructions for setting your password to the e-mail address you submitted. You should be receiving it shortly." %}
14 |
15 |
16 |
17 |
18 | {% endblock %}
19 |
--------------------------------------------------------------------------------
/grical/templates/registration/password_reset_email.html:
--------------------------------------------------------------------------------
1 | {# Copyright: 2016 Stefanos Kozanis #}
2 | {% load i18n %}
3 |
4 | {% autoescape off %}
5 |
6 | {% blocktrans %}Greetings from {{ site_name }}{% endblocktrans %}.
7 | {% trans "You're receiving this e-mail because you requested a password reset" %}.
8 | {% trans "Your username, in case you've forgotten:" %} {{ user.username }}
9 |
10 | {% trans "Please go to the following page and choose a new password:" %}
11 | {% block reset_link %}
12 | {{ protocol }}://{{ domain }}{% url "auth_password_reset_confirm" uidb64=uid token=token %}
13 | {% endblock %}
14 |
15 | {% trans "Thanks for using our site!" %}
16 |
17 | {% blocktrans %}The {{ site_name }} team{% endblocktrans %}
18 |
19 | {% endautoescape %}
20 |
--------------------------------------------------------------------------------
/grical/templates/registration/password_reset_form.html:
--------------------------------------------------------------------------------
1 | {# Copyright: 2016 George Vlachos #}
2 | {% extends "base.html" %}
3 | {% load i18n %}
4 |
5 | {% block title %}{% trans "Password reset" %}{% endblock %}
6 |
7 | {% block container %}
8 |
9 |
10 |
11 |
12 |
13 |
{% csrf_token %}
14 |
22 |
36 |
37 |
{% trans 'E-mail address:' %}
38 |
39 |
40 | {% if form.email.errors %}{{ form.email.errors }}{% endif %}
41 |
42 |
43 |
48 |
49 |
50 |
51 |
52 |
53 | {% endblock %}
54 |
--------------------------------------------------------------------------------
/grical/templates/registration/register.html:
--------------------------------------------------------------------------------
1 | {# Copyright: 2016 Ivan F. Villanueva B. #}
2 | {% load i18n %}
3 | {% extends "base.html" %}
4 |
5 | {% block container %}
6 | {% trans "Create an account" %}
7 | {% csrf_token %}
8 | {{ form.as_p }}
9 |
10 |
11 | {% endblock %}
12 |
--------------------------------------------------------------------------------
/grical/templates/registration/registration_complete.html:
--------------------------------------------------------------------------------
1 | {# Copyright: 2016 George Vlachos #}
2 | {% extends "base.html" %}
3 | {% load i18n %}
4 |
5 | {% block title %}
6 | registration_complete.html | {{ block.super }}
7 | {% endblock %}
8 |
9 | {% block container %}
10 |
11 |
12 |
13 | {% trans "Thank you for signing up. An email with instructions has been sent to you" %}.
14 |
15 |
16 |
17 | {% endblock %}
18 |
--------------------------------------------------------------------------------
/grical/templates/registration/registration_form.html:
--------------------------------------------------------------------------------
1 | {# Copyright: 2016 George Vlachos #}
2 | {% extends "base.html" %}
3 | {% load i18n %}
4 |
5 | {% block container %}
6 |
7 |
8 |
9 |
10 |
{% csrf_token %}
11 | {% trans "Create a new account" %}
12 |
13 |
17 | {% for error in form.username.errors %}{{ error }}
{% endfor %}
18 |
19 |
20 |
24 | {% for error in form.email.errors %}{{ error }}
{% endfor %}
25 |
26 |
27 |
31 | {% for error in form.password1.errors %}{{ error }}
{% endfor %}
32 |
33 |
34 |
38 | {% for error in form.password2.errors %}{{ error }}
{% endfor %}
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 | {% endblock %}
49 |
--------------------------------------------------------------------------------
/grical/templates/rss/groupevents_description.html:
--------------------------------------------------------------------------------
1 | {{ obj.description }}
2 |
--------------------------------------------------------------------------------
/grical/templates/rss/groupevents_title.html:
--------------------------------------------------------------------------------
1 | {{ obj.start|date }} : {{ obj.title }}
2 |
--------------------------------------------------------------------------------
/grical/templates/rss/searchevents_description.html:
--------------------------------------------------------------------------------
1 | {{ obj.description }}
2 |
--------------------------------------------------------------------------------
/grical/templates/rss/searchevents_title.html:
--------------------------------------------------------------------------------
1 | {{ obj.start|date }} : {{ obj.title }}
2 |
--------------------------------------------------------------------------------
/grical/templates/search_calendars.html:
--------------------------------------------------------------------------------
1 | {# Copyright: 2016 George Vlachos #}
2 |
3 |
4 |
5 |
6 | {% for year, cal in years_cals %}
7 |
{{ year }}
8 | {{ cal }}
9 | {% endfor %}
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/grical/templates/settings.html:
--------------------------------------------------------------------------------
1 | {# Copyright: 2016 George Vlachos #}
2 | {% extends "base.html" %}
3 | {% load i18n %}
4 |
5 | {% block container %}
6 |
7 |
8 |
9 |
10 |
{% blocktrans with user.username as name %} {{ name }}'s settings {% endblocktrans %}
11 |
12 | {% trans "Personal data" %}
13 |
14 | {% trans "Username" %}: {{user.username}}
15 | {% comment %}
16 | TODO: let the user introduce/change this date at user creation and here
17 | see the end of http://code.google.com/p/django-registration/issues/detail?id=127
18 | {% trans "Firstname" %}: {{user.firstname}}
19 | {% trans "Lastname" %}: {{user.lastname}}
20 | {% endcomment %}
21 | {% trans "Email" %}: {{user.email}}
22 | {% trans "Last login:" %} {{user.last_login}}
23 |
24 | {% if USER.has_filters %}
25 |
29 | {% endif %}
30 | {% if USER.has_groups %}
31 |
35 | {% endif %}
36 | {% if not READ_ONLY %}
37 |
42 | {% endif %}
43 |
44 |
45 |
46 |
47 |
48 | {% endblock %}
49 |
--------------------------------------------------------------------------------
/grical/templates/settings_filters.html:
--------------------------------------------------------------------------------
1 | {# Copyright: 2016 George Vlachos #}
2 | {% load i18n %}
3 |
4 |
5 |
6 |
7 |
8 | {% for fil in USER.get_filters %}
9 |
10 | {{ fil.name }}
11 |
12 | {# TODO: cache #}
13 | ({{ fil.matches_count }})
14 | {% if not READ_ONLY %}
15 |
16 | edit
17 |
18 | delete
19 | {% comment %}FIXME{% endcomment %}
20 | {% endif %}
21 |
22 | {% endfor %}
23 |
24 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/grical/templates/settings_groups.html:
--------------------------------------------------------------------------------
1 | {# Copyright: 2016 George Vlachos #}
2 |
3 |
4 |
5 |
6 | {% for group in USER.get_groups %}
7 |
8 | {{ group.name }}
9 | {% if not READ_ONLY %}
10 |
11 | quit
12 |
13 | invite
14 | {% endif %}
15 |
16 |
17 |
18 |
19 |
20 | {% endfor %}
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/grical/urls.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- encoding: utf-8 -*-
3 | # vim: set expandtab tabstop=4 shiftwidth=4 textwidth=79 foldmethod=marker:
4 | # gpl {{{1
5 | #############################################################################
6 | # Copyright 2009-2016 Stefanos Kozanis
7 | #
8 | # This file is part of GriCal.
9 | #
10 | # GriCal is free software: you can redistribute it and/or modify it under
11 | # the terms of the GNU Affero General Public License as published by the Free
12 | # Software Foundation, either version 3 of the License, or (at your option) any
13 | # later version.
14 | #
15 | # GriCal is distributed in the hope that it will be useful, but WITHOUT
16 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17 | # FOR A PARTICULAR PURPOSE. See the Affero GNU General Public License for more
18 | # details.
19 | #
20 | # You should have received a copy of the GNU Affero General Public License
21 | # along with GriCal. If not, see .
22 | #############################################################################
23 | """ Main urls definition file. """
24 | # imports {{{1
25 | from django.conf import settings
26 | import django.contrib.auth.views as auth_views
27 | from django.conf.urls import include, url
28 | from django.contrib import admin
29 | from django.contrib.staticfiles.urls import staticfiles_urlpatterns
30 | from django.conf.urls import * # pylint: disable-msg=W0401,W0614,W0614
31 | # previous pylint directive is needed because of a bug in Django:
32 | # http://code.djangoproject.com/ticket/5350
33 |
34 | from grical.events import views
35 |
36 | # registrations {{{1
37 | admin.autodiscover()
38 |
39 | # handler404 and handler500 {{{1
40 | handler404 = views.handler404
41 | handler500 = views.handler500
42 |
43 | # patterns for administrations, db and accounts {{{1
44 | urlpatterns = [
45 | url( r'^a/admin/doc/', include( 'django.contrib.admindocs.urls' ) ),
46 | #(r'^a/admin/(.*)', admin.site.root),
47 | url( r'^a/admin/', admin.site.urls ),
48 | url( r'^a/accounts/', include( 'registration.backends.default.urls' ) ),
49 | url( r'^a/accounts/logout/$',
50 | auth_views.logout, {'next_page': '/'} ),
51 | ]
52 |
53 | # comments / feedback
54 | # see http://docs.djangoproject.com/en/1.3/ref/contrib/comments/
55 | urlpatterns += [
56 | url(r'^c/comments/', include('django_comments.urls')),
57 | url(r'^c/feedback/', include('grical.contact_form.urls')),
58 | ]
59 |
60 | # h pattern for help and legal_notice {{{1
61 | urlpatterns += [
62 | url( r'^h/help/', views.help_page,
63 | name = "help" ),
64 | url( r'^h/legal_notice/', views.legal_notice,
65 | name = "legal_notice" ),
66 | ]
67 |
68 | # include events.urls {{{1
69 | urlpatterns += [
70 | url( r'', include( 'grical.events.urls' ) ),
71 | ]
72 |
73 | # see https://docs.djangoproject.com/en/dev/howto/static-files/#serving-static-files-in-development
74 | urlpatterns += staticfiles_urlpatterns()
75 |
76 | if settings.DEBUG:
77 | import debug_toolbar
78 | urlpatterns += [
79 | url(r'^__debug__/', include(debug_toolbar.urls))
80 | ]
81 |
--------------------------------------------------------------------------------
/grical/wsgi.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- encoding: utf-8 -*-
3 | # vim: set expandtab tabstop=4 shiftwidth=4 textwidth=79 foldmethod=marker:
4 | # gpl {{{1
5 | #############################################################################
6 | # Copyright 2009-2016 Stefanos Kozanis
7 | #
8 | # This file is part of GriCal.
9 | #
10 | # GriCal is free software: you can redistribute it and/or modify it under
11 | # the terms of the GNU Affero General Public License as published by the Free
12 | # Software Foundation, either version 3 of the License, or (at your option) any
13 | # later version.
14 | #
15 | # GriCal is distributed in the hope that it will be useful, but WITHOUT
16 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17 | # FOR A PARTICULAR PURPOSE. See the Affero GNU General Public License for more
18 | # details.
19 | #
20 | # You should have received a copy of the GNU Affero General Public License
21 | # along with GriCal. If not, see .
22 | #############################################################################
23 | """
24 | WSGI config for grical project.
25 |
26 | This module contains the WSGI application used by Django's development server
27 | and any production WSGI deployments. It should expose a module-level variable
28 | named ``application``. Django's ``runserver`` and ``runfcgi`` commands discover
29 | this application via the ``WSGI_APPLICATION`` setting.
30 |
31 | Usually you will have the standard Django WSGI application here, but it also
32 | might make sense to replace the whole Django WSGI application with a custom one
33 | that later delegates to the Django one. For example, you could introduce WSGI
34 | middleware here, or combine a Django application with an application of another
35 | framework.
36 |
37 | """
38 | import os
39 | from os.path import abspath, dirname
40 | from sys import path
41 |
42 | SITE_ROOT = dirname(dirname(abspath(__file__)))
43 | path.append(SITE_ROOT)
44 |
45 | # We defer to a DJANGO_SETTINGS_MODULE already in the environment. This breaks
46 | # if running multiple sites in the same mod_wsgi process. To fix this, use
47 | # mod_wsgi daemon mode with each site in its own daemon process, or use
48 | # os.environ["DJANGO_SETTINGS_MODULE"] = "jajaja.settings"
49 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "grical.settings")
50 |
51 | # This application object is used by any WSGI server configured to use this
52 | # file. This includes Django's development server, if the WSGI_APPLICATION
53 | # setting points here.
54 | from django.core.wsgi import get_wsgi_application
55 | application = get_wsgi_application()
56 |
57 | # Apply WSGI middleware here.
58 | # from helloworld.wsgi import HelloWorldApplication
59 | # application = HelloWorldApplication(application)
60 |
--------------------------------------------------------------------------------
/manage_development.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- encoding: utf-8 -*-
3 | # vim: set expandtab tabstop=4 shiftwidth=4 textwidth=79 foldmethod=marker:
4 | # gpl {{{1
5 | #############################################################################
6 | # Copyright 2009-2016 Stefanos Kozanis
7 | #
8 | # This file is part of GriCal.
9 | #
10 | # GriCal is free software: you can redistribute it and/or modify it under
11 | # the terms of the GNU Affero General Public License as published by the Free
12 | # Software Foundation, either version 3 of the License, or (at your option) any
13 | # later version.
14 | #
15 | # GriCal is distributed in the hope that it will be useful, but WITHOUT
16 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17 | # FOR A PARTICULAR PURPOSE. See the Affero GNU General Public License for more
18 | # details.
19 | #
20 | # You should have received a copy of the GNU Affero General Public License
21 | # along with GriCal. If not, see .
22 | #############################################################################
23 | # code {{{1
24 | import os
25 | import sys
26 | if __name__ == "__main__":
27 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "grical.settings.development")
28 | from django.core.management import execute_from_command_line
29 | execute_from_command_line(sys.argv)
30 |
--------------------------------------------------------------------------------
/requirements/base.apt:
--------------------------------------------------------------------------------
1 | gcc # needed by geoip and gem to compile some stuff
2 | build-essential
3 | famfamfam-flag-gif
4 | libgeoip-dev # needed by geoip to compile some stuff
5 | git # needed to fetch some git packages specified in base.pip
6 | libgdal-dev
7 | libgeos-dev
8 | libmemcached-dev # required by pylibmc to compile
9 | libmemcached11 # required by pylibmc
10 | libmaxminddb-dev # accererates the use of the geolite database
11 | libmaxminddb0 # accererates the use of the geolite database
12 | mmdb-bin # accererates the use of the geolite database
13 | postgresql-9.6-postgis-2.3 # version must match PZ_PG_VERSION
14 | postgresql-9.6-postgis-2.3-scripts # version must match PZ_PG_VERSION
15 | postgresql-contrib-9.6 # includes pg_trgm; version must match PZ_PG_VERSION
16 | python-dev # needed by psycopg2
17 | python-gdal
18 | python-gdal
19 | python-pip
20 | zlib1g-dev # required by pylibmc to compile
21 |
--------------------------------------------------------------------------------
/requirements/base.ext:
--------------------------------------------------------------------------------
1 | postgis
2 | postgis_topology
3 |
--------------------------------------------------------------------------------
/requirements/base.key:
--------------------------------------------------------------------------------
1 | https://deb.nodesource.com/gpgkey/nodesource.gpg.key
2 | https://apt.postgresql.org/pub/repos/apt/ACCC4CF8.asc
3 |
--------------------------------------------------------------------------------
/requirements/base.npm:
--------------------------------------------------------------------------------
1 | bower
2 |
--------------------------------------------------------------------------------
/requirements/base.pip:
--------------------------------------------------------------------------------
1 | # Grical python requirements for production
2 | # The Puppet manifests may be listing more debian packages as requirements
3 | # (python-gdal is one of them).
4 |
5 | celery==3.1.23 # Last stable 3.x
6 | django==1.11.3 # Current LTS Version
7 | django-contrib-comments==1.7.2
8 | django-celery==3.1.17
9 | django-markup-deprecated
10 | django-oembed==0.1.3
11 | django-registration-redux==1.7
12 | django-reversion==2.0.6
13 | django-tables2==1.2.6
14 | geoip2>=2.0,<3.0 # GepIP2 Python API, needs the geoip2 db
15 | docutils==0.12
16 | icalendar==3.10
17 | kombu==3.0.33 # Required by celery
18 | python-dateutil==2.4.2
19 | # FIXME: Upgrading dateutil from 2.4.2 to 2.5.3 made some ISO
20 | # datestring parsing to fail confusing month for day, maybe some
21 | # locale issue. Investigate and restore the newer version when
22 | # possible.
23 | pytz==2016.6.1
24 | pylibmc==1.5.1 # a faster replacement of python-memcached
25 | pyyaml==3.12
26 | simplejson # oembed requires it or else it fails
27 | six==1.10.0 # Required by some django packages
28 | vobject==0.9.3
29 |
--------------------------------------------------------------------------------
/requirements/base.repo:
--------------------------------------------------------------------------------
1 | deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main
2 | deb http://deb.nodesource.com/node_4.x xenial main
3 |
--------------------------------------------------------------------------------
/requirements/bower.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "grical",
3 | "version": "0.0.1",
4 | "authors": [
5 | "George Vlachos ",
6 | "Ivan F. Villanueva B. ",
7 | "Stefanos Kozanis "
8 | ],
9 | "description": "Discover and share great events.",
10 | "ignore": [
11 | "**/.*",
12 | "node_modules",
13 | "bower_components",
14 | "test",
15 | "tests"
16 | ],
17 | "dependencies": {
18 | "bootstrap": "v4.0.0-alpha.4",
19 | "bootstrap-datepicker": "1.6.4",
20 | "bootstrap-select": "^1.11.2",
21 | "openlayers": "https://github.com/openlayers/ol2/archive/release-2.13.1.zip"
22 | },
23 | "private": true
24 | }
25 |
--------------------------------------------------------------------------------
/requirements/db.apt:
--------------------------------------------------------------------------------
1 | postgresql-9.6-postgis-2.3 # required for the extension postgis
2 | postgresql-9.6-postgis-2.3-scripts # required for the extension postgis_topology
3 | postgresql-contrib-9.6 # needed for GIN / GIST indexes
4 | postgresql-plpython-9.6
5 |
--------------------------------------------------------------------------------
/requirements/development.apt:
--------------------------------------------------------------------------------
1 | development.trusty.apt
--------------------------------------------------------------------------------
/requirements/development.pip:
--------------------------------------------------------------------------------
1 | -r base.pip
2 | django-debug-toolbar==1.8
3 | django-webtest==1.9.2
4 | ipdb
5 | ipython>=5.0.0,<6.0.0 # ipython >= 6 is not compatible with Python 2.7
6 | MultipartPostHandler
7 |
--------------------------------------------------------------------------------
/requirements/development.trusty.apt:
--------------------------------------------------------------------------------
1 | build-essential
2 | famfamfam-flag-gif
3 | libgdal-dev
4 | libgeos-dev
5 | libmemcached-dev
6 | libsqlite3-mod-spatialite
7 | python-dev
8 | python-gdal
9 | python-geoip
10 | python-pip
11 | python-virtualenv
12 | spatialite-bin
13 | sqlite3
14 | zlib1g-dev
15 |
--------------------------------------------------------------------------------
/requirements/development.xenial.apt:
--------------------------------------------------------------------------------
1 | build-essential
2 | famfamfam-flag-gif
3 | geoip-database-contrib
4 | libgdal-dev
5 | libgeos-dev
6 | libsqlite3-mod-spatialite
7 | python-dev
8 | python-gdal
9 | python-geoip
10 | python-pip
11 | python-virtualenv
12 | spatialite-bin
13 | sqlite3
14 | libmemcached-dev
15 | zlib1g-dev
16 |
--------------------------------------------------------------------------------
/tox.ini:
--------------------------------------------------------------------------------
1 | [tox]
2 | envlist = py27
3 | skipsdist = True
4 |
5 | [testenv]
6 | deps = -r{toxinidir}/requirements/development.pip
7 | setenv =
8 | PYTHONPATH = {toxinidir}:{toxinidir}
9 | commands = python manage_development.py test --settings grical.settings.development
10 |
--------------------------------------------------------------------------------
Thank you for your comment.