├── .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 | {{DOMAIN}}{% trans 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 |
{% csrf_token %} 4 | 5 | 6 | 7 | {% if form.non_field_errors %} 8 | {% for error in form.non_field_errors %} 9 |
{{ error }}
10 | {% endfor %} 11 | {% endif %} 12 | 13 | 14 | 15 | {% for field in form %} 16 | 17 | {% if field.name == "name" %} 18 | 19 |
20 | 21 |
22 | 23 | {% if field.errors %}{{ field.errors }}{% endif %} 24 |
25 |
26 | 27 | {% elif field.name == "email" %} 28 | 29 | 30 |
31 | 32 |
33 | 34 | {% if field.errors %}{{ field.errors }}{% endif %} 35 |
36 |
37 | 38 | {% elif field.name == "url" %} 39 | 40 |
41 | 42 |
43 | 44 | {% if field.errors %}{{ field.errors }}{% endif %} 45 |
46 |
47 | 48 | {% elif field.name == "comment" %} 49 | 50 |
51 | 52 |
53 | 54 | {% if field.errors %}{{ field.errors }}{% endif %} 55 |
56 |
57 | 58 | {% elif field.name == "honeypot" %} 59 | 60 |
{{ field }}
61 | 62 | {% else %}{{ field }}{% endif %} 63 | 64 | {% endfor %} 65 | 66 | 67 | 68 | 69 |
70 |
71 |
72 | 73 | 74 |
75 |
76 |
77 |
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 |
11 | 12 |
13 | 14 |

Thank you for your comment.

15 | 16 | 17 | 18 |
19 | 20 |
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 |
8 |
9 |
10 | 11 |
{% csrf_token %} 12 |
13 |
14 | 15 |

{% trans "Feedback" %}

16 |
17 |
18 |
19 |
20 |
21 | {% if form.errors or form.non_field_errors %} 22 |

23 | {% trans "Please correct the following" %} {% blocktrans count form.errors as counter %}error{% plural %}errors{% endblocktrans %}: 24 |

25 | {% endif %} 26 | {% if form.non_field_errors %} 27 | {% for error in form.non_field_errors %} 28 |
{{ error }}
29 | {% endfor %} 30 | {% endif %} 31 |
32 |
33 |
34 | 35 |
36 | 37 | {% if form.name.errors %}{{ form.name.errors }}{% endif %} 38 |
39 |
40 |
41 | 42 |
43 | 44 | {% if form.email.errors %}{{ form.email.errors }}{% endif %} 45 |
46 |
47 |
48 | 49 |
50 | 51 | {% if form.body.errors %}{{ form.body.errors }}{% endif %} 52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 | 61 |
62 |
63 |
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 |
12 |
13 | 14 |

{% trans "Delete event" %}

15 |
16 |
17 | {% trans "The following event will be deleted:" %} 18 | {{ event.startdate }} : {{ event.title }} 19 |
20 |
21 |
22 |
23 |
24 | {% if form.errors or form.non_field_errors %} 25 |

26 | {% trans "Please correct the following" %} {% blocktrans count form.errors as counter %}error{% plural %}errors{% endblocktrans %}: 27 |

28 | {% endif %} 29 | {% if form.non_field_errors %} 30 | {% for error in form.non_field_errors %} 31 |
{{ error }}
32 | {% endfor %} 33 | {% endif %} 34 | {% for field in form %} 35 | {% for error in field.errors %} 36 |
{{ field.name }}: {{ error }}
37 | {% endfor %} 38 | {% endfor %} 39 |
40 |
41 |
42 |
43 |
    44 | {{ form.as_ul }} 45 |
46 | {% include "also_recurrences_form.html" %} 47 |
48 |
49 |
50 |
51 |
52 |
53 |
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 | 29 | {% if form.event_astext.errors %}{{ form.event_astext.errors }}{% endif %} 30 |
31 |
32 |
33 |
34 | {% include "also_recurrences_form.html" %} 35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 | 45 | {% comment %} 46 |
47 | {% trans "edit this event with a form" %} 48 |
{% trans "Warning: clicking this link will make you lose any data changes done in the box above" %} 49 |
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 |
7 |
8 |
9 | ICAL 10 |  |  11 | {% trans "show" %} 12 | {% if not READ_ONLY %} 13 |  |  14 | {% trans "edit" %} 15 |  |  16 | {% trans "edit as text" %} 17 |  |  18 | {% trans "add to group" %} 19 | {% endif %} 20 |
21 |
22 |
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 | 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 | ICAL  10 | 11 | RSS  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 |
8 |
9 |
10 |
11 |
{% csrf_token %} 12 |
13 |

{% trans "Create a group" %}

14 |
15 |
16 |
17 | {% if form.errors or form.non_field_errors %} 18 |

19 | {% trans "Please correct the following" %} {% blocktrans count form.errors as counter %}error{% plural %}errors{% endblocktrans %}: 20 |

21 | {% endif %} 22 | {% if form.non_field_errors %} 23 | {% for error in form.non_field_errors %} 24 |
{{ error }}
25 | {% endfor %} 26 | {% endif %} 27 |
28 |
29 |
30 | 31 |
32 | 33 | {% if form.name.errors %}{{ form.name.errors }}{% endif %} 34 |
35 |
36 |
37 | 38 |
39 | 40 | {% if form.description.errors %}{{ form.description.errors }}{% endif %} 41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
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 |
8 |
9 |
10 | 11 | {% block extraheaders %} 12 | 13 | {%endblock extraheaders %} 14 | 15 |

16 | {% blocktrans with group.name as group_name %} 17 | Group {{ group_name }} 18 | {% endblocktrans %} 19 |

20 |

21 | 22 | RSS{% blocktrans with group.name as group_name %} 23 | Subscribe to the "{{ group_name }}" group's feed{% endblocktrans %} 24 |

25 |

26 | 27 | ICAL{% blocktrans with group.name as group_name %} 28 | Get the upcoming events in the group "{{ group_name }}" as iCalendar{% endblocktrans %} 29 |

30 |

{{ group.description|urlize }}

31 |

{% trans "Members" %}

32 |
    33 | {% for user in group.get_users %} 34 |
  • {{ user.username }}
  • 35 | {% endfor %} 36 |
37 | {% if group.has_coming_events %} 38 |

{% trans "Next upcoming events" %}

39 | {% for event in events %} 40 |

{% include "event_show_small.html" %}

41 | {% endfor %} 42 | {% else %} 43 |

{% trans "There are no upcoming events." %}

44 | {% comment %}TODO: show option to see past events {% endcomment %} 45 | {% endif %} 46 | 47 |
48 |
49 |
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 |

10 | 11 | ICAL 12 | 13 | 14 | RSS 15 | 16 | {{ group.name }} 17 |

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 |
8 |
9 |
10 |
11 | 12 |
{% csrf_token %} 13 |
14 |

{% trans "Invite a member to the group" %}

15 |
16 |
17 |
18 | {% if form.errors or form.non_field_errors %} 19 |

20 | {% trans "Please correct the following" %} {% blocktrans count form.errors as counter %}error{% plural %}errors{% endblocktrans %}: 21 |

22 | {% endif %} 23 | {% if form.non_field_errors %} 24 | {% for error in form.non_field_errors %} 25 |
{{ error }}
26 | {% endfor %} 27 | {% endif %} 28 |
29 |
30 |
31 | 32 |
33 | 34 | {% if form.username.errors %}{{ form.username.errors }}{% endif %} 35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 | 44 |
45 |
46 |
47 |
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 |
8 |
9 |
10 |

{% trans "My groups" %}:

11 | 12 | {% if groups %} 13 | 23 | 24 |

{% trans "Create a new group." %}

25 | {% else %} 26 |

{% trans "You are not a member of any group." %}

27 |

{% trans "Create a new group." %}.

28 | {% endif %} 29 |
30 |
31 |
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 |
14 |
15 |
16 |

{% trans "Account successfully activated" %}

17 |

{% trans "Log in" %}

18 |
19 |
20 |
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 |
19 | 20 |
21 |
22 |
23 |
24 |
25 | 26 |
27 |
28 |
29 |
30 | {% comment %} 31 | 34 | {% endcomment %} 35 | {% trans "Forgot your password ?" %} 36 |
37 |
38 |
39 |
40 |
41 |
{% trans "Not a member yet?" %} {% trans "Get a new account." %}
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 |
15 |
16 | 17 |

{% trans "Password reset" %}

18 |
19 |

{% trans "Forgot your password? Enter your e-mail address below. We'll e-mail you instructions for setting a new one." %}

20 |
21 |
22 |
23 |
24 | {% if form.errors or form.non_field_errors %} 25 |

26 | {% trans "Please correct the following" %} {% blocktrans count form.errors as counter %}error{% plural %}errors{% endblocktrans %}: 27 |

28 | {% endif %} 29 | {% if form.non_field_errors %} 30 | {% for error in form.non_field_errors %} 31 |
{{ error }}
32 | {% endfor %} 33 | {% endif %} 34 |
35 |
36 |
37 | 38 |
39 | 40 | {% if form.email.errors %}{{ form.email.errors }}{% endif %} 41 |
42 |
43 |
44 |
45 |
46 |
47 |
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 |
14 | 15 |
16 |
17 | {% for error in form.username.errors %}
{{ error }}
{% endfor %} 18 |
19 |
20 |
21 | 22 |
23 |
24 | {% for error in form.email.errors %}
{{ error }}
{% endfor %} 25 |
26 |
27 |
28 | 29 |
30 |
31 | {% for error in form.password1.errors %}
{{ error }}
{% endfor %} 32 |
33 |
34 |
35 | 36 |
37 |
38 | {% for error in form.password2.errors %}
{{ error }}
{% endfor %} 39 |
40 |
41 |
42 |
43 |
{% trans "Are you a member?" %} {% trans "Click here to login." %}
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 | ICAL 17 |   18 | RSS 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 | --------------------------------------------------------------------------------