././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1643105481.3081238 django-recurrence-1.11.1/0000755000076500000240000000000000000000000014324 5ustar00aleksistaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1643105481.2713144 django-recurrence-1.11.1/.github/0000755000076500000240000000000000000000000015664 5ustar00aleksistaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642493095.0 django-recurrence-1.11.1/.github/dependabot.yml0000644000076500000240000000022300000000000020511 0ustar00aleksistaffversion: 2 updates: - package-ecosystem: "pip" directory: "/" schedule: interval: "daily" time: "12:00" open-pull-requests-limit: 10 ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1643105481.271768 django-recurrence-1.11.1/.github/workflows/0000755000076500000240000000000000000000000017721 5ustar00aleksistaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642758229.0 django-recurrence-1.11.1/.github/workflows/test.yml0000644000076500000240000000402200000000000021421 0ustar00aleksistaffname: Test on: [push, pull_request] jobs: build: name: build (Python ${{ matrix.python-version }}, Django ${{ matrix.django-version }}) runs-on: ubuntu-latest strategy: fail-fast: false max-parallel: 5 matrix: python-version: ['3.7', '3.8', '3.9', '3.10', 'pypy-3.8'] django-version: ['2.2', '3.2', '4.0'] include: # Tox configuration for documentation environment - python-version: '3.7' django-version: 'docs' # Tox configuration for QA environment - python-version: '3.7' django-version: 'qa' # Django main - python-version: '3.8' django-version: 'main' experimental: true - python-version: '3.9' django-version: 'main' experimental: true - python-version: '3.10' django-version: 'main' experimental: true exclude: # Exclude Django 4.0 for Python 3.7 as it is not supported - python-version: '3.7' django-version: '4.0' steps: - uses: actions/checkout@v2 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v2 with: python-version: ${{ matrix.python-version }} - name: Get pip cache dir id: pip-cache run: | echo "::set-output name=dir::$(pip cache dir)" - name: Cache uses: actions/cache@v2 with: path: ${{ steps.pip-cache.outputs.dir }} key: ${{ matrix.python-version }}-v1-${{ hashFiles('**/setup.py') }} restore-keys: | ${{ matrix.python-version }}-v1- - name: Install dependencies run: | python -m pip install --upgrade pip python -m pip install --upgrade tox tox-gh-actions - name: Tox tests run: | tox -v env: DJANGO: ${{ matrix.django-version }} - name: Upload coverage uses: codecov/codecov-action@v1 with: name: Python ${{ matrix.python-version }} ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642493095.0 django-recurrence-1.11.1/.gitignore0000644000076500000240000000023200000000000016311 0ustar00aleksistaff*.pyc *.egg-info/ tests/test_db.sqlite .coverage htmlcov/ .cache/ .tox/ docs/_build build/ dist/ .pytest_cache/ /.idea /.vscode /venv coverage.xml .eggs/ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642758229.0 django-recurrence-1.11.1/.readthedocs.yaml0000644000076500000240000000044300000000000017554 0ustar00aleksistaff# .readthedocs.yaml # Read the Docs configuration file # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details version: 2 build: os: ubuntu-20.04 tools: python: "3.7" python: install: - requirements: requirements.txt sphinx: configuration: docs/conf.py ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1643105391.0 django-recurrence-1.11.1/CHANGES.rst0000644000076500000240000001345300000000000016134 0ustar00aleksistaff Changes ======= 1.11.1 (2021-01-25) ------------------- - Fix reStructuredTest syntax to be PyPI compliant. 1.11.0 (2021-01-21) ------------------- - Add Django 4.0 and Python 3.10 support. Deprecate EOL Django and Python versions. [aleksihakli] - Fix weekday deserialization typing bug. [apirobot] - Fix default ``recurrence.language_code`` not being set by using ``en-us`` for locale in frontend as the default. [jleclanche] 1.10.3 ------ * Add Hungarian localisation #161. 1.10.2 ------ * Add Hebrew localisation #159. 1.10.1 ------ * Update path to jQuery to match the one Django admin provides #148. 1.10.0 ------ * Fixes and official support for Django 2.1 and 2.2 #143, #142; * Remove support for Python 2.7 and 3.5, remove support for Django 2.0 #145. 1.9.0 ----- * Fix for using the recurrence widget in admin inlines #137. 1.8.2 ----- * Minor fix for Django 2.0 #134; * Minor packaging fix #135. 1.8.1 ----- * Bad release, do not use. 1.8.0 ----- This release contains two backwards incompatible changes - please read the notes below for details. * django-recurrence now returns timezone aware ``datetime`` objects in most cases #130. If ``USE_TZ`` is ``True`` (it defaults to off with a stock Django install) then you'll now get timezone aware ``datetime`` objects back from django-recurrence. If you have ``USE_TZ`` as ``True``, and you don't want this behaviour, you can set ``RECURRENCE_USE_TZ`` to ``False``, but please let us know (via GitHub issues) that you wanted to opt out, so we can understand what your use case is. * ``RecurrenceField`` instances without ``required=False`` will now require at least one rule or date. This change is intended to bring django-recurrence into line with how custom fields should behave. If you don't want to require at least one rule or date, just set ``require=False`` on your field #133. * Improvements to avoid inline styles #85; * Handle changes to ``javascript_catalog`` in Django 2 #131. 1.7.0 ----- * Drop official support for Django versions 1.7, 1.8, 1.9, 1.10; * Fixes for saving ``None`` into a ``RecurrenceField`` causing a ``TypeError`` #89`, #122; * Drop official support for Python 3.3 and Python 3.4; * Provisional support for Python 3.7 (only for Django 2.0 and up); * Ensure use of ``render`` on Django widgets always passes the ``renderer`` argument, to ensure support for Django 2.1 #125; * Django 2.0 compatibility fix for usage of django-recurrence with Django REST framework #126. 1.6.0 ----- * Fixes for Python 3 #105; * Support for Django 2.0 #109, #110; * Switch back a couple of instances of ``DeserializationError`` to ``ValidationError`` #111; * Switch around how we set dates in the date selector widget to avoid issues with short months #113. 1.5.0 ----- * Add Slovakian translations #98; * Add support for events occurring at a fixed point before the end of the month - e.g. the second last Tuesday before the end of the month #88; * Add minor style changes to make django-recurrence compatible with Wagtail #100; * Allow changing the behaviour of generating recurrences on ``dtstart`` by default. You can opt in to this by setting ``include_dtstart=False`` on your ``RecurrenceField`` #93; * Ensure broken values raise ``DeserializationError`` where expected #103. 1.4.1 ----- * Make PO-Revision-Date parseable by babel #75; * Update installation notes to cover Django 1.10 #74; * Add German translation #77; * Add Brazilian translation #79; * Ensure the migrations are included when installing #78; * Fix order of arguments to ``to_dateutil_rruleset`` #81. 1.4.0 ----- * Improve our testing setup to also cover Python 3.5; * Fixes for Django 1.10 #69. 1.3.1 ----- * Add Basque translations #67. 1.3.0 ----- * Drop official support for Django 1.4, Django 1.5, Django 1.6 and Python 2.6 (no changes have been made to deliberately break older versions, but older versions will not be tested going forward); * Add official support for Django 1.8 and Django 1.9 #62; * Fix for a bug in ``Rule`` creation where the weekday parameter is an instance of ``Weekday`` rather than an integer #57. 1.2.0 ----- * Added an option for events to occur on the fourth of a given weekday of the month #29; * Fixed an off-by-one bug in the ``to_text`` method for events happening on a regular month each year #30; * Fixed a bug in the JavaScript widget where the date for monthly events on a fixed date of the month had the description rendered incorrectly if the day selected was more than the number of days in the current calendar month #31; * Added a French translation #32 - this may be backwards incompatible if have overriden the widget JavaScript such that there is no ``language_code`` member of your recurrence object; * Added a Spanish translation #49; * Added database migrations - running ``python manage.py migrate recurrence --fake`` should be sufficient for this version - nothing has changed about the database schema between 1.1.0 and 1.2.0; * Fix broken tests for Django 1.4. 1.1.0 ----- * Added experimental Python 3 support. * Added extensive test coverage (from 0% to 81%). * Added documentation (including this changelog). * Removed ``RecurrenceModelField`` and ``RecurrenceModelDescriptor``, which don't appear to have worked as expected for some time. * Fixed a bug introduced in 1.0.3 which prevented the django-recurrence JavaScript from working #27. * Don't raise ``ValueError`` if you save ``None`` into a ``RecurrenceField`` with ``null=False`` #22, for consistency with other field types. * Make sure an empty recurrence object is falsey #25. * Fix a copy-paste error in ``to_recurrence_object`` which prevented exclusion rules from being populated correctly. * Fix a typo in ``create_from_recurrence_object`` which prevented it working with inclusion or exclusion rules. * Various other very minor bugfixes. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/LICENSE0000644000076500000240000000301200000000000015325 0ustar00aleksistaffCopyright (c) Tamas Kemenczy and individual contributors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of Django nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/MANIFEST.in0000644000076500000240000000040300000000000016057 0ustar00aleksistaffinclude README.md include LICENSE include MANIFEST.in include pytest.ini recursive-include docs Makefile make.bat *.rst *.py *.png recursive-include recurrence/static *.css *.png *.js recursive-include recurrence/locale *.mo *.po recursive-include tests *.py ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642493095.0 django-recurrence-1.11.1/Makefile0000644000076500000240000000037300000000000015767 0ustar00aleksistaffcoverage: pytest test: pytest testall: tox build: clean python setup.py sdist bdist_wheel clean: rm -rf dist/* rm -rf build/* push: build git push release: push twine upload -r pypi dist/* .PHONY: coverage test testall build clean push ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1643105481.3077662 django-recurrence-1.11.1/PKG-INFO0000644000076500000240000002443500000000000015431 0ustar00aleksistaffMetadata-Version: 2.1 Name: django-recurrence Version: 1.11.1 Summary: Django utility wrapping dateutil.rrule Home-page: https://github.com/django-recurrence/django-recurrence Author: Tamas Kemenczy Author-email: tamas.kemenczy@gmail.com License: BSD Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: Environment :: Web Environment Classifier: Environment :: Plugins Classifier: Framework :: Django Classifier: Framework :: Django Classifier: Framework :: Django :: 2.2 Classifier: Framework :: Django :: 3.2 Classifier: Framework :: Django :: 4.0 Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: BSD License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: Implementation Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Requires-Python: >=3.7 License-File: LICENSE django-recurrence ================= .. image:: https://img.shields.io/github/stars/django-recurrence/django-recurrence.svg?label=Stars&style=socialcA :target: https://github.com/jazzband/django-recurrence :alt: GitHub .. image:: https://img.shields.io/pypi/v/django-recurrence.svg :target: https://pypi.org/project/django-recurrence/ :alt: PyPI release .. image:: https://img.shields.io/pypi/pyversions/django-recurrence.svg :target: https://pypi.org/project/django-recurrence/ :alt: Supported Python versions .. image:: https://img.shields.io/pypi/djversions/django-recurrence.svg :target: https://pypi.org/project/django-recurrence/ :alt: Supported Django versions .. image:: https://img.shields.io/readthedocs/django-recurrence.svg :target: https://django-recurrence.readthedocs.io/ :alt: Documentation .. image:: https://github.com/django-recurrence/django-recurrence/workflows/Test/badge.svg :target: https://github.com/django-recurrence/django-recurrence/actions :alt: GitHub actions .. image:: https://codecov.io/gh/django-recurrence/django-recurrence/branch/master/graph/badge.svg :target: https://codecov.io/gh/django-recurrence/django-recurrence :alt: Coverage django-recurrence is a utility for working with recurring dates in Django. Functionality ------------- * Recurrence/Rule objects using a subset of rfc2445 (wraps ``dateutil.rrule``) for specifying recurring date/times, * ``RecurrenceField`` for storing recurring datetimes in the database, and * JavaScript widget. ``RecurrenceField`` provides a Django model field which serializes recurrence information for storage in the database. For example - say you were storing information about a university course in your app. You could use a model like this: .. code:: python import recurrence.fields class Course(models.Model): title = models.CharField(max_length=200) start = models.TimeField() end = models.TimeField() recurrences = recurrence.fields.RecurrenceField() You’ll notice that I’m storing my own start and end time. The recurrence field only deals with *recurrences* not with specific time information. I have an event that starts at 2pm. Its recurrences would be “every Friday”. Documentation ------------- For more information on installation and configuration see the documentation at: https://django-recurrence.readthedocs.io/ Issues ------ If you have questions or have trouble using the app please file a bug report at: https://github.com/django-recurrence/django-recurrence/issues Contributions ------------- All contributions are welcome! It is best to separate proposed changes and PRs into small, distinct patches by type so that they can be merged faster into upstream and released quicker. One way to organize contributions would be to separate PRs for e.g. * bugfixes, * new features, * code and design improvements, * documentation improvements, or * tooling and CI improvements. Merging contributions requires passing the checks configured with the CI. This includes running tests and linters successfully on the currently officially supported Python and Django versions. The test automation is run automatically with GitHub Actions, but you can run it locally with the ``tox`` command before pushing commits. Changes ======= 1.11.1 (2021-01-25) ------------------- - Fix reStructuredTest syntax to be PyPI compliant. 1.11.0 (2021-01-21) ------------------- - Add Django 4.0 and Python 3.10 support. Deprecate EOL Django and Python versions. [aleksihakli] - Fix weekday deserialization typing bug. [apirobot] - Fix default ``recurrence.language_code`` not being set by using ``en-us`` for locale in frontend as the default. [jleclanche] 1.10.3 ------ * Add Hungarian localisation #161. 1.10.2 ------ * Add Hebrew localisation #159. 1.10.1 ------ * Update path to jQuery to match the one Django admin provides #148. 1.10.0 ------ * Fixes and official support for Django 2.1 and 2.2 #143, #142; * Remove support for Python 2.7 and 3.5, remove support for Django 2.0 #145. 1.9.0 ----- * Fix for using the recurrence widget in admin inlines #137. 1.8.2 ----- * Minor fix for Django 2.0 #134; * Minor packaging fix #135. 1.8.1 ----- * Bad release, do not use. 1.8.0 ----- This release contains two backwards incompatible changes - please read the notes below for details. * django-recurrence now returns timezone aware ``datetime`` objects in most cases #130. If ``USE_TZ`` is ``True`` (it defaults to off with a stock Django install) then you'll now get timezone aware ``datetime`` objects back from django-recurrence. If you have ``USE_TZ`` as ``True``, and you don't want this behaviour, you can set ``RECURRENCE_USE_TZ`` to ``False``, but please let us know (via GitHub issues) that you wanted to opt out, so we can understand what your use case is. * ``RecurrenceField`` instances without ``required=False`` will now require at least one rule or date. This change is intended to bring django-recurrence into line with how custom fields should behave. If you don't want to require at least one rule or date, just set ``require=False`` on your field #133. * Improvements to avoid inline styles #85; * Handle changes to ``javascript_catalog`` in Django 2 #131. 1.7.0 ----- * Drop official support for Django versions 1.7, 1.8, 1.9, 1.10; * Fixes for saving ``None`` into a ``RecurrenceField`` causing a ``TypeError`` #89`, #122; * Drop official support for Python 3.3 and Python 3.4; * Provisional support for Python 3.7 (only for Django 2.0 and up); * Ensure use of ``render`` on Django widgets always passes the ``renderer`` argument, to ensure support for Django 2.1 #125; * Django 2.0 compatibility fix for usage of django-recurrence with Django REST framework #126. 1.6.0 ----- * Fixes for Python 3 #105; * Support for Django 2.0 #109, #110; * Switch back a couple of instances of ``DeserializationError`` to ``ValidationError`` #111; * Switch around how we set dates in the date selector widget to avoid issues with short months #113. 1.5.0 ----- * Add Slovakian translations #98; * Add support for events occurring at a fixed point before the end of the month - e.g. the second last Tuesday before the end of the month #88; * Add minor style changes to make django-recurrence compatible with Wagtail #100; * Allow changing the behaviour of generating recurrences on ``dtstart`` by default. You can opt in to this by setting ``include_dtstart=False`` on your ``RecurrenceField`` #93; * Ensure broken values raise ``DeserializationError`` where expected #103. 1.4.1 ----- * Make PO-Revision-Date parseable by babel #75; * Update installation notes to cover Django 1.10 #74; * Add German translation #77; * Add Brazilian translation #79; * Ensure the migrations are included when installing #78; * Fix order of arguments to ``to_dateutil_rruleset`` #81. 1.4.0 ----- * Improve our testing setup to also cover Python 3.5; * Fixes for Django 1.10 #69. 1.3.1 ----- * Add Basque translations #67. 1.3.0 ----- * Drop official support for Django 1.4, Django 1.5, Django 1.6 and Python 2.6 (no changes have been made to deliberately break older versions, but older versions will not be tested going forward); * Add official support for Django 1.8 and Django 1.9 #62; * Fix for a bug in ``Rule`` creation where the weekday parameter is an instance of ``Weekday`` rather than an integer #57. 1.2.0 ----- * Added an option for events to occur on the fourth of a given weekday of the month #29; * Fixed an off-by-one bug in the ``to_text`` method for events happening on a regular month each year #30; * Fixed a bug in the JavaScript widget where the date for monthly events on a fixed date of the month had the description rendered incorrectly if the day selected was more than the number of days in the current calendar month #31; * Added a French translation #32 - this may be backwards incompatible if have overriden the widget JavaScript such that there is no ``language_code`` member of your recurrence object; * Added a Spanish translation #49; * Added database migrations - running ``python manage.py migrate recurrence --fake`` should be sufficient for this version - nothing has changed about the database schema between 1.1.0 and 1.2.0; * Fix broken tests for Django 1.4. 1.1.0 ----- * Added experimental Python 3 support. * Added extensive test coverage (from 0% to 81%). * Added documentation (including this changelog). * Removed ``RecurrenceModelField`` and ``RecurrenceModelDescriptor``, which don't appear to have worked as expected for some time. * Fixed a bug introduced in 1.0.3 which prevented the django-recurrence JavaScript from working #27. * Don't raise ``ValueError`` if you save ``None`` into a ``RecurrenceField`` with ``null=False`` #22, for consistency with other field types. * Make sure an empty recurrence object is falsey #25. * Fix a copy-paste error in ``to_recurrence_object`` which prevented exclusion rules from being populated correctly. * Fix a typo in ``create_from_recurrence_object`` which prevented it working with inclusion or exclusion rules. * Various other very minor bugfixes. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642760842.0 django-recurrence-1.11.1/README.rst0000644000076500000240000000637500000000000016026 0ustar00aleksistaff django-recurrence ================= .. image:: https://img.shields.io/github/stars/django-recurrence/django-recurrence.svg?label=Stars&style=socialcA :target: https://github.com/jazzband/django-recurrence :alt: GitHub .. image:: https://img.shields.io/pypi/v/django-recurrence.svg :target: https://pypi.org/project/django-recurrence/ :alt: PyPI release .. image:: https://img.shields.io/pypi/pyversions/django-recurrence.svg :target: https://pypi.org/project/django-recurrence/ :alt: Supported Python versions .. image:: https://img.shields.io/pypi/djversions/django-recurrence.svg :target: https://pypi.org/project/django-recurrence/ :alt: Supported Django versions .. image:: https://img.shields.io/readthedocs/django-recurrence.svg :target: https://django-recurrence.readthedocs.io/ :alt: Documentation .. image:: https://github.com/django-recurrence/django-recurrence/workflows/Test/badge.svg :target: https://github.com/django-recurrence/django-recurrence/actions :alt: GitHub actions .. image:: https://codecov.io/gh/django-recurrence/django-recurrence/branch/master/graph/badge.svg :target: https://codecov.io/gh/django-recurrence/django-recurrence :alt: Coverage django-recurrence is a utility for working with recurring dates in Django. Functionality ------------- * Recurrence/Rule objects using a subset of rfc2445 (wraps ``dateutil.rrule``) for specifying recurring date/times, * ``RecurrenceField`` for storing recurring datetimes in the database, and * JavaScript widget. ``RecurrenceField`` provides a Django model field which serializes recurrence information for storage in the database. For example - say you were storing information about a university course in your app. You could use a model like this: .. code:: python import recurrence.fields class Course(models.Model): title = models.CharField(max_length=200) start = models.TimeField() end = models.TimeField() recurrences = recurrence.fields.RecurrenceField() You’ll notice that I’m storing my own start and end time. The recurrence field only deals with *recurrences* not with specific time information. I have an event that starts at 2pm. Its recurrences would be “every Friday”. Documentation ------------- For more information on installation and configuration see the documentation at: https://django-recurrence.readthedocs.io/ Issues ------ If you have questions or have trouble using the app please file a bug report at: https://github.com/django-recurrence/django-recurrence/issues Contributions ------------- All contributions are welcome! It is best to separate proposed changes and PRs into small, distinct patches by type so that they can be merged faster into upstream and released quicker. One way to organize contributions would be to separate PRs for e.g. * bugfixes, * new features, * code and design improvements, * documentation improvements, or * tooling and CI improvements. Merging contributions requires passing the checks configured with the CI. This includes running tests and linters successfully on the currently officially supported Python and Django versions. The test automation is run automatically with GitHub Actions, but you can run it locally with the ``tox`` command before pushing commits. ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1643105481.2740004 django-recurrence-1.11.1/django_recurrence.egg-info/0000755000076500000240000000000000000000000021475 5ustar00aleksistaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1643105481.0 django-recurrence-1.11.1/django_recurrence.egg-info/PKG-INFO0000644000076500000240000002443500000000000022602 0ustar00aleksistaffMetadata-Version: 2.1 Name: django-recurrence Version: 1.11.1 Summary: Django utility wrapping dateutil.rrule Home-page: https://github.com/django-recurrence/django-recurrence Author: Tamas Kemenczy Author-email: tamas.kemenczy@gmail.com License: BSD Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: Environment :: Web Environment Classifier: Environment :: Plugins Classifier: Framework :: Django Classifier: Framework :: Django Classifier: Framework :: Django :: 2.2 Classifier: Framework :: Django :: 3.2 Classifier: Framework :: Django :: 4.0 Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: BSD License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: Implementation Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Requires-Python: >=3.7 License-File: LICENSE django-recurrence ================= .. image:: https://img.shields.io/github/stars/django-recurrence/django-recurrence.svg?label=Stars&style=socialcA :target: https://github.com/jazzband/django-recurrence :alt: GitHub .. image:: https://img.shields.io/pypi/v/django-recurrence.svg :target: https://pypi.org/project/django-recurrence/ :alt: PyPI release .. image:: https://img.shields.io/pypi/pyversions/django-recurrence.svg :target: https://pypi.org/project/django-recurrence/ :alt: Supported Python versions .. image:: https://img.shields.io/pypi/djversions/django-recurrence.svg :target: https://pypi.org/project/django-recurrence/ :alt: Supported Django versions .. image:: https://img.shields.io/readthedocs/django-recurrence.svg :target: https://django-recurrence.readthedocs.io/ :alt: Documentation .. image:: https://github.com/django-recurrence/django-recurrence/workflows/Test/badge.svg :target: https://github.com/django-recurrence/django-recurrence/actions :alt: GitHub actions .. image:: https://codecov.io/gh/django-recurrence/django-recurrence/branch/master/graph/badge.svg :target: https://codecov.io/gh/django-recurrence/django-recurrence :alt: Coverage django-recurrence is a utility for working with recurring dates in Django. Functionality ------------- * Recurrence/Rule objects using a subset of rfc2445 (wraps ``dateutil.rrule``) for specifying recurring date/times, * ``RecurrenceField`` for storing recurring datetimes in the database, and * JavaScript widget. ``RecurrenceField`` provides a Django model field which serializes recurrence information for storage in the database. For example - say you were storing information about a university course in your app. You could use a model like this: .. code:: python import recurrence.fields class Course(models.Model): title = models.CharField(max_length=200) start = models.TimeField() end = models.TimeField() recurrences = recurrence.fields.RecurrenceField() You’ll notice that I’m storing my own start and end time. The recurrence field only deals with *recurrences* not with specific time information. I have an event that starts at 2pm. Its recurrences would be “every Friday”. Documentation ------------- For more information on installation and configuration see the documentation at: https://django-recurrence.readthedocs.io/ Issues ------ If you have questions or have trouble using the app please file a bug report at: https://github.com/django-recurrence/django-recurrence/issues Contributions ------------- All contributions are welcome! It is best to separate proposed changes and PRs into small, distinct patches by type so that they can be merged faster into upstream and released quicker. One way to organize contributions would be to separate PRs for e.g. * bugfixes, * new features, * code and design improvements, * documentation improvements, or * tooling and CI improvements. Merging contributions requires passing the checks configured with the CI. This includes running tests and linters successfully on the currently officially supported Python and Django versions. The test automation is run automatically with GitHub Actions, but you can run it locally with the ``tox`` command before pushing commits. Changes ======= 1.11.1 (2021-01-25) ------------------- - Fix reStructuredTest syntax to be PyPI compliant. 1.11.0 (2021-01-21) ------------------- - Add Django 4.0 and Python 3.10 support. Deprecate EOL Django and Python versions. [aleksihakli] - Fix weekday deserialization typing bug. [apirobot] - Fix default ``recurrence.language_code`` not being set by using ``en-us`` for locale in frontend as the default. [jleclanche] 1.10.3 ------ * Add Hungarian localisation #161. 1.10.2 ------ * Add Hebrew localisation #159. 1.10.1 ------ * Update path to jQuery to match the one Django admin provides #148. 1.10.0 ------ * Fixes and official support for Django 2.1 and 2.2 #143, #142; * Remove support for Python 2.7 and 3.5, remove support for Django 2.0 #145. 1.9.0 ----- * Fix for using the recurrence widget in admin inlines #137. 1.8.2 ----- * Minor fix for Django 2.0 #134; * Minor packaging fix #135. 1.8.1 ----- * Bad release, do not use. 1.8.0 ----- This release contains two backwards incompatible changes - please read the notes below for details. * django-recurrence now returns timezone aware ``datetime`` objects in most cases #130. If ``USE_TZ`` is ``True`` (it defaults to off with a stock Django install) then you'll now get timezone aware ``datetime`` objects back from django-recurrence. If you have ``USE_TZ`` as ``True``, and you don't want this behaviour, you can set ``RECURRENCE_USE_TZ`` to ``False``, but please let us know (via GitHub issues) that you wanted to opt out, so we can understand what your use case is. * ``RecurrenceField`` instances without ``required=False`` will now require at least one rule or date. This change is intended to bring django-recurrence into line with how custom fields should behave. If you don't want to require at least one rule or date, just set ``require=False`` on your field #133. * Improvements to avoid inline styles #85; * Handle changes to ``javascript_catalog`` in Django 2 #131. 1.7.0 ----- * Drop official support for Django versions 1.7, 1.8, 1.9, 1.10; * Fixes for saving ``None`` into a ``RecurrenceField`` causing a ``TypeError`` #89`, #122; * Drop official support for Python 3.3 and Python 3.4; * Provisional support for Python 3.7 (only for Django 2.0 and up); * Ensure use of ``render`` on Django widgets always passes the ``renderer`` argument, to ensure support for Django 2.1 #125; * Django 2.0 compatibility fix for usage of django-recurrence with Django REST framework #126. 1.6.0 ----- * Fixes for Python 3 #105; * Support for Django 2.0 #109, #110; * Switch back a couple of instances of ``DeserializationError`` to ``ValidationError`` #111; * Switch around how we set dates in the date selector widget to avoid issues with short months #113. 1.5.0 ----- * Add Slovakian translations #98; * Add support for events occurring at a fixed point before the end of the month - e.g. the second last Tuesday before the end of the month #88; * Add minor style changes to make django-recurrence compatible with Wagtail #100; * Allow changing the behaviour of generating recurrences on ``dtstart`` by default. You can opt in to this by setting ``include_dtstart=False`` on your ``RecurrenceField`` #93; * Ensure broken values raise ``DeserializationError`` where expected #103. 1.4.1 ----- * Make PO-Revision-Date parseable by babel #75; * Update installation notes to cover Django 1.10 #74; * Add German translation #77; * Add Brazilian translation #79; * Ensure the migrations are included when installing #78; * Fix order of arguments to ``to_dateutil_rruleset`` #81. 1.4.0 ----- * Improve our testing setup to also cover Python 3.5; * Fixes for Django 1.10 #69. 1.3.1 ----- * Add Basque translations #67. 1.3.0 ----- * Drop official support for Django 1.4, Django 1.5, Django 1.6 and Python 2.6 (no changes have been made to deliberately break older versions, but older versions will not be tested going forward); * Add official support for Django 1.8 and Django 1.9 #62; * Fix for a bug in ``Rule`` creation where the weekday parameter is an instance of ``Weekday`` rather than an integer #57. 1.2.0 ----- * Added an option for events to occur on the fourth of a given weekday of the month #29; * Fixed an off-by-one bug in the ``to_text`` method for events happening on a regular month each year #30; * Fixed a bug in the JavaScript widget where the date for monthly events on a fixed date of the month had the description rendered incorrectly if the day selected was more than the number of days in the current calendar month #31; * Added a French translation #32 - this may be backwards incompatible if have overriden the widget JavaScript such that there is no ``language_code`` member of your recurrence object; * Added a Spanish translation #49; * Added database migrations - running ``python manage.py migrate recurrence --fake`` should be sufficient for this version - nothing has changed about the database schema between 1.1.0 and 1.2.0; * Fix broken tests for Django 1.4. 1.1.0 ----- * Added experimental Python 3 support. * Added extensive test coverage (from 0% to 81%). * Added documentation (including this changelog). * Removed ``RecurrenceModelField`` and ``RecurrenceModelDescriptor``, which don't appear to have worked as expected for some time. * Fixed a bug introduced in 1.0.3 which prevented the django-recurrence JavaScript from working #27. * Don't raise ``ValueError`` if you save ``None`` into a ``RecurrenceField`` with ``null=False`` #22, for consistency with other field types. * Make sure an empty recurrence object is falsey #25. * Fix a copy-paste error in ``to_recurrence_object`` which prevented exclusion rules from being populated correctly. * Fix a typo in ``create_from_recurrence_object`` which prevented it working with inclusion or exclusion rules. * Various other very minor bugfixes. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1643105481.0 django-recurrence-1.11.1/django_recurrence.egg-info/SOURCES.txt0000644000076500000240000000655700000000000023376 0ustar00aleksistaff.gitignore .readthedocs.yaml CHANGES.rst LICENSE MANIFEST.in Makefile README.rst pytest.ini requirements.txt setup.py tox.ini .github/dependabot.yml .github/workflows/test.yml django_recurrence.egg-info/PKG-INFO django_recurrence.egg-info/SOURCES.txt django_recurrence.egg-info/dependency_links.txt django_recurrence.egg-info/not-zip-safe django_recurrence.egg-info/requires.txt django_recurrence.egg-info/top_level.txt docs/Makefile docs/changelog.rst docs/conf.py docs/contributing.rst docs/github.py docs/index.rst docs/installation.rst docs/make.bat docs/usage/admin.png docs/usage/api.rst docs/usage/getting_started.rst docs/usage/index.rst docs/usage/recurrence_field.rst recurrence/__init__.py recurrence/base.py recurrence/choices.py recurrence/compat.py recurrence/exceptions.py recurrence/fields.py recurrence/forms.py recurrence/managers.py recurrence/models.py recurrence/settings.py recurrence/locale/de/LC_MESSAGES/django.mo recurrence/locale/de/LC_MESSAGES/django.po recurrence/locale/de/LC_MESSAGES/djangojs.mo recurrence/locale/de/LC_MESSAGES/djangojs.po recurrence/locale/en/LC_MESSAGES/django.mo recurrence/locale/en/LC_MESSAGES/django.po recurrence/locale/en/LC_MESSAGES/djangojs.mo recurrence/locale/en/LC_MESSAGES/djangojs.po recurrence/locale/es/LC_MESSAGES/django.mo recurrence/locale/es/LC_MESSAGES/django.po recurrence/locale/es/LC_MESSAGES/djangojs.mo recurrence/locale/es/LC_MESSAGES/djangojs.po recurrence/locale/eu/LC_MESSAGES/django.mo recurrence/locale/eu/LC_MESSAGES/django.po recurrence/locale/eu/LC_MESSAGES/djangojs.mo recurrence/locale/eu/LC_MESSAGES/djangojs.po recurrence/locale/fr/LC_MESSAGES/django.mo recurrence/locale/fr/LC_MESSAGES/django.po recurrence/locale/fr/LC_MESSAGES/djangojs.mo recurrence/locale/fr/LC_MESSAGES/djangojs.po recurrence/locale/he/LC_MESSAGES/django.mo recurrence/locale/he/LC_MESSAGES/django.po recurrence/locale/he/LC_MESSAGES/djangojs.mo recurrence/locale/he/LC_MESSAGES/djangojs.po recurrence/locale/hu/LC_MESSAGES/django.mo recurrence/locale/hu/LC_MESSAGES/django.po recurrence/locale/hu/LC_MESSAGES/djangojs.mo recurrence/locale/hu/LC_MESSAGES/djangojs.po recurrence/locale/nl/LC_MESSAGES/django.mo recurrence/locale/nl/LC_MESSAGES/django.po recurrence/locale/nl/LC_MESSAGES/djangojs.mo recurrence/locale/nl/LC_MESSAGES/djangojs.po recurrence/locale/pt_BR/LC_MESSAGES/django.mo recurrence/locale/pt_BR/LC_MESSAGES/django.po recurrence/locale/pt_BR/LC_MESSAGES/djangojs.mo recurrence/locale/pt_BR/LC_MESSAGES/djangojs.po recurrence/locale/sk/LC_MESSAGES/django.mo recurrence/locale/sk/LC_MESSAGES/django.po recurrence/locale/sk/LC_MESSAGES/djangojs.mo recurrence/locale/sk/LC_MESSAGES/djangojs.po recurrence/migrations/0001_initial.py recurrence/migrations/__init__.py recurrence/static/recurrence/css/recurrence.css recurrence/static/recurrence/img/recurrence-calendar-icon.png recurrence/static/recurrence/js/recurrence-widget.init.js recurrence/static/recurrence/js/recurrence-widget.js recurrence/static/recurrence/js/recurrence.js tests/__init__.py tests/models.py tests/settings.py tests/test_exclusions.py tests/test_fields.py tests/test_magic_methods.py tests/test_managers_recurrence.py tests/test_managers_rule.py tests/test_nulls.py tests/test_occurrences.py tests/test_recurrences_without_limits.py tests/test_saving.py tests/test_serialization.py tests/test_settings.py tests/test_to_text.py tests/test_to_weekday.py tests/test_tz.py tests/test_weekday.py././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1643105481.0 django-recurrence-1.11.1/django_recurrence.egg-info/dependency_links.txt0000644000076500000240000000000100000000000025543 0ustar00aleksistaff ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1643105481.0 django-recurrence-1.11.1/django_recurrence.egg-info/not-zip-safe0000644000076500000240000000000100000000000023723 0ustar00aleksistaff ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1643105481.0 django-recurrence-1.11.1/django_recurrence.egg-info/requires.txt0000644000076500000240000000003400000000000024072 0ustar00aleksistaffdjango>=2.2 python-dateutil ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1643105481.0 django-recurrence-1.11.1/django_recurrence.egg-info/top_level.txt0000644000076500000240000000001300000000000024221 0ustar00aleksistaffrecurrence ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1643105481.2849326 django-recurrence-1.11.1/docs/0000755000076500000240000000000000000000000015254 5ustar00aleksistaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/docs/Makefile0000644000076500000240000001275000000000000016721 0ustar00aleksistaff# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = _build # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . # the i18n builder cannot share the environment and doctrees with the others I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " singlehtml to make a single large HTML file" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " devhelp to make HTML files and a Devhelp project" @echo " epub to make an epub" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " latexpdf to make LaTeX files and run them through pdflatex" @echo " text to make text files" @echo " man to make manual pages" @echo " texinfo to make Texinfo files" @echo " info to make Texinfo files and run them through makeinfo" @echo " gettext to make PO message catalogs" @echo " changes to make an overview of all changed/added/deprecated items" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" clean: -rm -rf $(BUILDDIR)/* html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." singlehtml: $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml @echo @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/django-recurrence.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/django-recurrence.qhc" devhelp: $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp @echo @echo "Build finished." @echo "To view the help file:" @echo "# mkdir -p $$HOME/.local/share/devhelp/django-recurrence" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/django-recurrence" @echo "# devhelp" epub: $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub @echo @echo "Build finished. The epub file is in $(BUILDDIR)/epub." latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make' in that directory to run these through (pdf)latex" \ "(use \`make latexpdf' here to do that automatically)." latexpdf: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through pdflatex..." $(MAKE) -C $(BUILDDIR)/latex all-pdf @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." text: $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text @echo @echo "Build finished. The text files are in $(BUILDDIR)/text." man: $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man @echo @echo "Build finished. The manual pages are in $(BUILDDIR)/man." texinfo: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." @echo "Run \`make' in that directory to run these through makeinfo" \ "(use \`make info' here to do that automatically)." info: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo "Running Texinfo files through makeinfo..." make -C $(BUILDDIR)/texinfo info @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." gettext: $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale @echo @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642760508.0 django-recurrence-1.11.1/docs/changelog.rst0000644000076500000240000000005300000000000017733 0ustar00aleksistaff.. changelog: .. include:: ../CHANGES.rst ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642412798.0 django-recurrence-1.11.1/docs/conf.py0000644000076500000240000002017500000000000016560 0ustar00aleksistaff# flake8: noqa # # This file is execfile()d with the current directory set to its containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. import sys, os # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. html_theme = "default" on_rtd = os.environ.get("READTHEDOCS", None) == "True" if not on_rtd: try: import sphinx_rtd_theme html_theme = "sphinx_rtd_theme" html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] except ImportError: pass # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. sys.path.insert(0, os.path.abspath(".")) # -- General configuration ----------------------------------------------------- # If your documentation needs a minimal Sphinx version, state it here. # needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. extensions = ["github"] # Add any paths that contain templates here, relative to this directory. templates_path = ["_templates"] # The suffix of source filenames. source_suffix = ".rst" # The encoding of source files. # source_encoding = 'utf-8-sig' # The master toctree document. master_doc = "index" # General information about the project. project = u"django-recurrence" copyright = u"2014, django-recurrence developers" # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. version = "1.10.3" # The full version, including alpha/beta/rc tags. release = "1.10.3" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: # today = '' # Else, today_fmt is used as the format for a strftime call. # today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns = ["_build"] # The reST default role (used for this markup: `text`) to use for all documents. # default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. # add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). # add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. # show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = "sphinx" # A list of ignored prefixes for module index sorting. # modindex_common_prefix = [] # -- Options for HTML output --------------------------------------------------- # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. # html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. # html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". # html_title = None # A shorter title for the navigation bar. Default is the same as html_title. # html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. # html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. # html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". # html_static_path = ['_static'] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. # html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. # html_use_smartypants = True # Custom sidebar templates, maps document names to template names. # html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. # html_additional_pages = {} # If false, no module index is generated. # html_domain_indices = True # If false, no index is generated. # html_use_index = True # If true, the index is split into individual pages for each letter. # html_split_index = False # If true, links to the reST sources are added to the pages. # html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. # html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. # html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. # html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). # html_file_suffix = None # Output file base name for HTML help builder. htmlhelp_basename = "django-recurrencedoc" # -- Options for LaTeX output -------------------------------------------------- latex_elements = { # The paper size ('letterpaper' or 'a4paper'). # 'papersize': 'letterpaper', # The font size ('10pt', '11pt' or '12pt'). # 'pointsize': '10pt', # Additional stuff for the LaTeX preamble. # 'preamble': '', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass [howto/manual]). latex_documents = [ ( "index", "django-recurrence.tex", u"django-recurrence Documentation", u"django-recurrence developers", "manual", ) ] # The name of an image file (relative to this directory) to place at the top of # the title page. # latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. # latex_use_parts = False # If true, show page references after internal links. # latex_show_pagerefs = False # If true, show URL addresses after external links. # latex_show_urls = False # Documents to append as an appendix to all manuals. # latex_appendices = [] # If false, no module index is generated. # latex_domain_indices = True # -- Options for manual page output -------------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ ( "index", "django-recurrence", u"django-recurrence Documentation", [u"django-recurrence developers"], 1, ) ] # If true, show URL addresses after external links. # man_show_urls = False # -- Options for Texinfo output ------------------------------------------------ # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ ( "index", "django-recurrence", u"django-recurrence Documentation", u"django-recurrence developers", "django-recurrence", "One line description of project.", "Miscellaneous", ) ] # Documents to append as an appendix to all manuals. # texinfo_appendices = [] # If false, no module index is generated. # texinfo_domain_indices = True # How to display URL addresses: 'footnote', 'no', or 'inline'. # texinfo_show_urls = 'footnote' github_project_url = "https://github.com/django-recurrence/django-recurrence/" ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/docs/contributing.rst0000644000076500000240000000336100000000000020520 0ustar00aleksistaffContributing ============ Contributions to django-recurrence are very welcome - whether in the form of bug reports, feature requests, or patches. Bug reports and feature requests are tracked on our `GitHub issues page `_. If you want to make changes to django-recurrence, you'll need to fork our GitHub repository, make any changes you want, and send us a pull request. Feel free to `file an issue `_ if you want help getting set up. Running the tests ----------------- The easiest way to run the tests is to run:: make testall from the root of your local copy of the django-recurrence repository. This will require that you have tox installed. If you don't have tox installed, you can install it with ``pip install tox``. Running all the tests also requires that you have Python 2.6, Python 2.7, Python 3.3 and Python 3.4 installed locally. This will run tests against all supported Python and Django versions, check the documentation can be built, and will also run ``flake8``, an automated code-linting tool. If that sounds like too much work, feel free to just run tests on whatever your local version of Python is. You can do this by running:: pip install -r requirements_test.txt ! You only need to run this once make test If you want to see what our code coverage is like, install everything in ``requirements_test.txt`` (as shown above), then run:: make coverage Working with the documentation ------------------------------ Our documentation is written with Sphinx, and can be built using:: tox -e docs Once this command is run, it'll print out the folder the generated HTML documentation is available in. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/docs/github.py0000644000076500000240000000462700000000000017121 0ustar00aleksistafffrom docutils import nodes, utils from docutils.parsers.rst.roles import set_classes # With thanks to Doug Hellman for writing # https://doughellmann.com/blog/2010/05/09/defining-custom-roles-in-sphinx/ # - this code is derived from an example BitBucket configuration. def make_issue_node(rawtext, app, slug, options): """Create a link to a GitHub issue. :param rawtext: Text being replaced with link node. :param app: Sphinx application context :param slug: ID of the thing to link to :param options: Options dictionary passed to role func. """ # try: base = app.config.github_project_url if not base: raise AttributeError except AttributeError as err: raise ValueError('github_project_url configuration value is not set (%s)' % str(err)) slash = '/' if base[-1] != '/' else '' ref = base + slash + 'issues/' + slug + '/' set_classes(options) node = nodes.reference(rawtext, '#' + utils.unescape(slug), refuri=ref, **options) return node def ghissue_role(name, rawtext, text, lineno, inliner, options={}, content=[]): """Link to a GitHub issue. Returns 2 part tuple containing list of nodes to insert into the document and a list of system messages. Both are allowed to be empty. :param name: The role name used in the document. :param rawtext: The entire markup snippet, with role. :param text: The text marked with the role. :param lineno: The line number where rawtext appears in the input. :param inliner: The inliner instance that called us. :param options: Directive options for customization. :param content: The directive content for customization. """ try: issue_num = int(text) if issue_num <= 0: raise ValueError except ValueError: msg = inliner.reporter.error( 'GitHub issue number must be a number greater than or equal to 1; ' '"%s" is invalid.' % text, line=lineno) prb = inliner.problematic(rawtext, rawtext, msg) return [prb], [msg] app = inliner.document.settings.env.app node = make_issue_node(rawtext, app, str(issue_num), options) return [node], [] def setup(app): """Install the plugin. :param app: Sphinx application context. """ app.add_role('issue', ghissue_role) app.add_config_value('github_project_url', None, 'env') return ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/docs/index.rst0000644000076500000240000000070300000000000017115 0ustar00aleksistaffdjango-recurrence ***************** django-recurrence is a utility for working with recurring dates in Django. It provides: - Recurrence/Rule objects using a subset of rfc2445 (wraps ``dateutil.rrule``) for specifying recurring date/times; - ``RecurrenceField`` for storing recurring datetimes in the database; - a JavaScript widget. Contents -------- .. toctree:: :maxdepth: 2 installation usage/index contributing changelog ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/docs/installation.rst0000644000076500000240000000406100000000000020510 0ustar00aleksistaff.. _install: Installation ============ .. contents:: :local: Download the library -------------------- Firstly, you'll need to install ``django-recurrence`` from PyPI. The easiest way to do this is with pip:: pip install django-recurrence Then, make sure ``recurrence`` is in your ``INSTALLED_APPS`` setting: .. code-block:: python INSTALLED_APPS = ( ... 'recurrence', ) Supported Django and Python versions ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Currently, django-recurrence supports Python 3.6 and Python 3.7. django-recurrence works with Django 1.11, 2.1 and 2.2. Set up internationalization --------------------------- .. note:: This step is currently mandatory, but may be bypassed with an extra bit of javascript. See :issue:`47` for details. Using a translation of django-recurrence other than ``en`` requires that django-recurrence's JavaScript can access the translation strings. This is handled with Django's built in ``javascript_catalog`` view, which you must install by adding the following to your project ``urls.py`` file: .. code-block:: python import django from django.conf.urls import url from django.views.i18n import JavaScriptCatalog # Your normal URLs here... # If you already have a js_info_dict dictionary, just add # 'recurrence' to the existing 'packages' tuple. js_info_dict = { 'packages': ('recurrence', ), } # jsi18n can be anything you like here urlpatterns += [ url(r'^jsi18n/$', JavaScriptCatalog.as_view(), js_info_dict), ] Configure static files ---------------------- django-recurrence includes some static files (all to do with rendering the JavaScript widget that makes handling recurring dates easier). To ensure these are served correctly, you'll probably want to ensure you also have ``django.contrib.staticfiles`` in your ``INSTALLED_APPS`` setting, and run:: python manage.py collectstatic .. note:: After collecting static files, you can use ``{{ form.media }}`` to include recurrence's static files within your templates. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/docs/make.bat0000644000076500000240000001177600000000000016675 0ustar00aleksistaff@ECHO OFF REM Command file for Sphinx documentation if "%SPHINXBUILD%" == "" ( set SPHINXBUILD=sphinx-build ) set BUILDDIR=_build set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . set I18NSPHINXOPTS=%SPHINXOPTS% . if NOT "%PAPER%" == "" ( set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% ) if "%1" == "" goto help if "%1" == "help" ( :help echo.Please use `make ^` where ^ is one of echo. html to make standalone HTML files echo. dirhtml to make HTML files named index.html in directories echo. singlehtml to make a single large HTML file echo. pickle to make pickle files echo. json to make JSON files echo. htmlhelp to make HTML files and a HTML help project echo. qthelp to make HTML files and a qthelp project echo. devhelp to make HTML files and a Devhelp project echo. epub to make an epub echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter echo. text to make text files echo. man to make manual pages echo. texinfo to make Texinfo files echo. gettext to make PO message catalogs echo. changes to make an overview over all changed/added/deprecated items echo. linkcheck to check all external links for integrity echo. doctest to run all doctests embedded in the documentation if enabled goto end ) if "%1" == "clean" ( for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i del /q /s %BUILDDIR%\* goto end ) if "%1" == "html" ( %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/html. goto end ) if "%1" == "dirhtml" ( %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. goto end ) if "%1" == "singlehtml" ( %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. goto end ) if "%1" == "pickle" ( %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can process the pickle files. goto end ) if "%1" == "json" ( %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can process the JSON files. goto end ) if "%1" == "htmlhelp" ( %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can run HTML Help Workshop with the ^ .hhp project file in %BUILDDIR%/htmlhelp. goto end ) if "%1" == "qthelp" ( %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can run "qcollectiongenerator" with the ^ .qhcp project file in %BUILDDIR%/qthelp, like this: echo.^> qcollectiongenerator %BUILDDIR%\qthelp\django-recurrence.qhcp echo.To view the help file: echo.^> assistant -collectionFile %BUILDDIR%\qthelp\django-recurrence.ghc goto end ) if "%1" == "devhelp" ( %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp if errorlevel 1 exit /b 1 echo. echo.Build finished. goto end ) if "%1" == "epub" ( %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub if errorlevel 1 exit /b 1 echo. echo.Build finished. The epub file is in %BUILDDIR%/epub. goto end ) if "%1" == "latex" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex if errorlevel 1 exit /b 1 echo. echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. goto end ) if "%1" == "text" ( %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text if errorlevel 1 exit /b 1 echo. echo.Build finished. The text files are in %BUILDDIR%/text. goto end ) if "%1" == "man" ( %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man if errorlevel 1 exit /b 1 echo. echo.Build finished. The manual pages are in %BUILDDIR%/man. goto end ) if "%1" == "texinfo" ( %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo if errorlevel 1 exit /b 1 echo. echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. goto end ) if "%1" == "gettext" ( %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale if errorlevel 1 exit /b 1 echo. echo.Build finished. The message catalogs are in %BUILDDIR%/locale. goto end ) if "%1" == "changes" ( %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes if errorlevel 1 exit /b 1 echo. echo.The overview file is in %BUILDDIR%/changes. goto end ) if "%1" == "linkcheck" ( %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck if errorlevel 1 exit /b 1 echo. echo.Link check complete; look for any errors in the above output ^ or in %BUILDDIR%/linkcheck/output.txt. goto end ) if "%1" == "doctest" ( %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest if errorlevel 1 exit /b 1 echo. echo.Testing of doctests in the sources finished, look at the ^ results in %BUILDDIR%/doctest/output.txt. goto end ) :end ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1643105481.2862434 django-recurrence-1.11.1/docs/usage/0000755000076500000240000000000000000000000016360 5ustar00aleksistaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/docs/usage/admin.png0000644000076500000240000003740200000000000020164 0ustar00aleksistaffPNG  IHDRy^q zTXtRaw profile type exifxڝk9s!0boǟ%x+RH̤?7+Cmc{UW]ys0LJ̟N?X}ߘ?i=/|˃~zw}hk9dkK*l>#Tǥt>3ys{EoυL>;?S W1?³aSaŸ*-ѵo3|_޽:gDݵF'LЈ;p^|R`^I3oWI=I|״CjvRy4r5drqξ֒ӎgbf4UVo+ ]׬+{YUKOXuo('nv$g'W $ 6Sisʱ:-a,Vz|#sՓ.#g,?O{1줐rc,<ً@Yvۮ#IF3qrKeSo7Ӧ J_4vw1G|5=;٪]]ZIulXdR71@˿I=& e+eji#}:m^~rPY,U[ښ^g5Pok[LK%KеZ"NeK.ENGML"xfq/Yl֓#spC왜pSJ+,ˢUϒr0tj^rQA}&DǩO6iF09pz]V{_#ݫnZ.Qe*V)<$,ڐi:(ƞ%vV?wf!q>nכ vYѩ 3sr"{0iYoJ+\Ѷ]A3;GK<㎸ոn- y-49JWlƮ[;L&"\_h,F@<½u^Yfz:=f;32efHKU Syu:C%J_Ym*=YunJHOmM_'"8:[٢Q,g:"rX&:+uLpk~`ըi֫:t Z,yc0 o-bx~Qmn['Ftnea: n6?jyυgbVICJů6ֲi- (X$#(⹒ss RA{PKJ\n Mlx`6\r4FS87{ ..$ AY>0w^D!:%ά+wkA˅*h#hře To;K0"Z5|=lxZa;Ky)Pj=MWV4vF6%kԄ*~)u B{Q3' ; (V\=X%o;h6owdKw:Y^+0>sBJi>&rqP.GꆾY3fvq!N[ #+4ʱ3\, YdՓ i"$OfwyLZ0+lhU jHRCօ~P1 {,T}_+X'57ܟ9ovU@LW6,$ROX\3Q &K3me G)=d~i^DPH:5qUҵgF&{ʑۗ! :e}}kRG@#[qo_oJ#3*+ SR^o ;z ,,schnX1AihsxQIWFpZBpLD ÃA$Ūu\3Y.zk_\ 7ej3|U4\ Ja| eGz FK0c=<@{gr`Ev\qrfEP6[%8 ЇoXp0jA-ٳF X\},`Zl6BGh1@8ځ(!ɜA=D|{|{{s"TUUBfLvB\?p:Y!`0B~@!Ft!DB0&!/aLB^!˜B1 y!c}]z. -OpBL1];?~O> US“[Kx'=򈌈 X3!bۢ"""H-w&ڍ1"8|W1m< ""E_CDDƚeBp0#- 9Z O[xd c2q3\kdEi磭tb_n3H5nlز@DL*y[6q'5"zWFW2%zd{e]e/Nfc=o<ϟdoK E"xh.o|-|sֳ,~|{F!$uC+͟+]u{պ?R{T3{T@՚~s*YUj]jiK5K֤zFU?kZ~uFU3=-6lJR|6j3{UЪc+0_-hl [$S<5bC~V#ck|޿W7c [HޜJ oقV#ubkkaZLlK6CH\C/kᣏQ2~r-ȲSz>'X.a^@pb!/o$}>#nzυ T+vnBsXqњ(o)梭yO`}^xb__ΊݮQʕm|8^֯`XwBLu#5﯏3P&uD=S5е2W} $Wd%s]RMU;Իk]|C5w<ۥB.QUUU۬&_R.!yt:?'Lc|݈t!y>>y}Sa6 x!Dx|$ȓ̅JL!˜B1 y!cB$"]tw͇~8YBq\zdC!q:CKwB1 y!cB$"I !DB0&!/aLB^!XHOrΝ;743godҥ̞=;BҐ?x so:&33siR?\EFf`&LYe)񖬛Z8 _0T[VѺlXYM93YvUIgɅ"{DDDꈿol*KW.OJd1͊.fBowq* IֺА]ݢGqSZ7:ADV[c\d-R@=R(lذVbI{:dSM>() /uT6KBd@i7^M ˶bk/66Wb3Xu#Z66h‹aX-S7rx[ۨE޼g 3QS28\QjLb;xcZIY2`[kĶSi;4 $+efmtz.^%fP:tH~_ǎS?+ ,_V5`P3ԬS)jγom}pc{TU=2[}o`խmSEu~aԭ9K=U1dƩ],+?Gxhp9m C,Ck`~f}]UUj=걁OQYGzL`ΰr^:rC썯M!ٜ,uAS3/|!wpQɧmQ RUz4[]甪>jԿ nAoS}gTw ^г9TߨH6^^!Wx'SV"=TŽ v\ h ;\( v+KB@D?0ʀ!ڎq. O$;֡݊kM,=}c-IeԻuڍK\r&&Knc-V1t^'ЎFAٸ)خГo Φx(wcV\2[} |q`+67PȞDt<Ƈ)*5`/N!l#BL;hѠϿ«++^e=&$b+ָDtQ:[ze%x6k4VoMAI:h!r5e>6NKJvVo*sū)+5RTAf"MY7>#Bv: 뺲^z{gL}>58B4rv>s6`I[C2\^T67^wS1}Wˆ01EkKs1(*,jBwc\rsMr (utLߍĂh"lĊRK7m,X;dg&k`xi,’k"d"b֭\XB fe-b &\Eո,T/lf\xZs*0@wwz}ia-eX.X,X"7Voc&K5nsڝzuPVDA7x]+XߜΊ"'bƭڊ؉(%(i bQ4q9u1o\+eƉ7 !FF#֡0cY݆ANS_CM8] ۑ S[]BFg1۸72)SOm}=VY\qY :JةdW}=TڲX奲=P~o,f=ॾQ?n;rk8E~hݟ%oB;Zgl6caM;Ç(|kjןc}h gvq֭[7aE_&P3M"Yz:4x,qaPJ  ;AQED:p)J݉۱ޟ__%y-ћwh)~UG(Quk.3 z݇5gTvl; Ǘ(}>[+x6{aʆY:?I|CxqS4+Aּ~z_5/uoT.ZOk4Fs9߮r{Gئ,T3ZϿsiF%~Ʃ @V|_$3sTDfk,nkY # UV8r]^RHC-IzJhy9.r|iV(u_ bl"TUU!Yˠg1fk" J,N)%sNs ]M9@6*?~[`wSTТUפ=9L/Eݪ6#}le/'] r99uuX\徹FgΜ^uru7%]ñ&z Y6n'[y>֒Ulh𲸨b\?vZҷAz'UutQk NS^{-wiNT:r&)ৗ [pMpɄJ ZI)8>`ךG+BLKS«Bk&!/aLk&Q?H'Oh !?Iխb-"TF!˜B1 y!cB$"I !DB0&!/aLB^!˜B1 y!cB$"I !DB0w:\BLI|D2t:!$-)wh+5B$"I !DB0&!/aLB^!˜B1 y!cBƦ~Ȼ+1/Y}`iø$"2I2Wшјɒ%KXb4b4-r(hfhO+N:.[_ZK,2a*s'Ni K2e]\\,X/9.&{ٌٜ)׊M#I:%s10qNŃrk 6*w].= Gh5--v-J6*'T-A~n3q-^Z\$Ž VZXq$kE iI.2JW%v4ԍ2[_`)&nlz89%7TXC]nb 5뤲=@]kb6c1[mԻS%`εR:5Z~%34bXZXiURMt(Ug9v.P\4tDaHo+E,V+B@LqQ]d&lp3} V^,b10YJh{YRBBa\,oAkBE@Y͘-̹f*](Ύ:q>  LF[u XME vx뭘(S8Kdz6vƕb0 lI~E5T]MiYV?u#W8\^sl>J;J;EZ;Cu 'bȈB7C,& ;mԥnijmlW6cNV3tNW<,hzxqk4(NVRfN bXL& 2C0^OI2++eų Hna PRj8;l6J0b.(^}T~Y2hZtVӱOu'Ihw)ǛpfaCK1IbL}@CSN'vY~( !)sBtvMƪO ʠ&D_Jz:q\bV5S=}.4)&aL# mqhHL(` T<@a(I>WKIm6NM8vPZMCB&vj_qיB;VgؖoF_TIYv٦Y 6!D;U^IZڈtkR.4$d8yR*Vo"Fg'lZ4dv'NIhQ(264sx)ڛ&c5)2$>y4ԫ^/NG\r&əZ4[[ULS]=Z\dPztͤXX^ڀ+;Ҕc0=kqd؁;MByn>}&S#Vgi<63S B{e !I$yjEM&Uݥ''IXlq9P~7%e8Z'm /teb\Ys0nx$cnG5}NƇױ\k鰻i(q DCxT`:޸gڴt3I~)z~UmLGKh^6)| &7i,((z3%P~ZHIIf@n1F]8U%yu 6,P٪QVm*zb]zF{XY]ZDvFO[YwM, YmVK-!~WF 3PQ܄GJ5bc[W@CBhiC[(q=HCKZR uN!&!/aLB^!˜B1 y!cB$"I !DB0&!/a,BUUtb0ʜNu]BLu ʮ !t!DB0&!/aLB^!˜B1 y!cB$"I !DB0&!/aLB^!˜B1 y!cB$"I !D 铡9x gΜܹs#N3sLnF.]ٳCY~UD}f;ZdSM>()yJ5zx^֭<n,cSi.?z6CBZJl&]l;NUXrlZ÷Vr6TPiNKS[FUCBmXO'odkq&ofgmڿ -Vv{MB'?ǒ:$䒨paPEvj :Pڱ=$~ެ]]p1u;fM-Ov_Q1pRjCF]&E&tZ76fRiacN5v%_Eѩ1SVNid*W&~]KUZGYHi3{(JB\Ґp} ?ytO>zNX&UBI"g<.~3U^yM: ;sE$iխݠբ;z Ŧ$tRbpx2F J%!MY} m7*69.5Q)UT`4~ 00Ʌ&JEK/ʊ-FPh-Y;* ZEqӡOI9-LXd#spz!1Vv[a݊k jrNҡK2䲳q𢯂n^?Qz} jd&Qʦ%6I+PE¼Ӣ(yr VGBӻ%?ڵzT㪴b-+\-5zk zYbf,.<(2IekM%chaG-^IiI2)$o(rDOFG>v՝hTU2['`jM$16ظ1uܼX2JvQ4ڤJv !. t:1 ue/sϘ=x = r" v̝;Ǐ_q:ELLLJ$-5w}7---`DGGs 7K__e]0<+|_?^W|Ax뭷PUKśo9<:ryEaΜ9kt 7/ߏk3:yAfϞMNNа4>qivMww f~{nj3gռK̛7o1SSSCdd$˖-W^v+]]]̘1oGÝ9CSAWT]]Mgg'[n%>>?jwwLMM 3gܹs,_;cҶyڅ|oo/;w^:::Ɲ>}$5k^w\!p뭷x̙3DFFry~_pQ^g?8f͢J Oos=7B\^'K_­zn? |_ ߾'SO=̙3_ɓ'y'h4>|g>lLMT kZD1ͼlذaiO~g͚5,_^{}aZﵵXVnTUEQQ .~E'O^6ɓDGG3{1W@DD;vN>͉'FT>|0'Od۶mCM!1>ɤ &{}d0W['O9~8=аÇ3s̋_ɝw9Aw7__TVVŋgϾ'z=g;K_xONN~y|͓Lގ;Ƽyh4444KQQ3g䷿-#wy.]>zhYYYWbΝ̜9^?4_jj*/xg[yyy˿ ΝCUU^.\ɓ''Bz<`R'g͚#Z8NjZ N7x<}Ioc}}NfZ#=EbʘvP !;iO!t1Iz$KLwR&B0&!/aLB^!˜B1 y!c]NV9B\HB18(5B$"I !DB0&!/aLB^!˜B1 $L&j"仰Gc /[S}]!DY߸g\OĦt=&ۇq2`>m1Z3P]ez7E9m"Rsܥ=qS~ו'nB]kf1|g~ێBp:RNچc|pu*B5-,ղ}艌gHG۾TuN]gy¾-wcj0n+ Xv]o60KO޲l[ń:C]ImlqL`fILL*(qq `mwG;/}w9[Db/Shzg!|6R颁}Ɓ_ml zvf,Z e|A$YŚX-o@Hw{Yk'ugcZe/fA yQc[U9mw'/ ﴿yIuc?ЧDs ]QgewaŎA]"{ed[n7H͢5lK-'יִT"3)YϱE,K>\'1ݶ(pғye԰;'ìxcXf3F|'vq!ͱ;0[q$+Ʈ.--\>zϬҿ@FOZZ ,H]ihil_^Oz=VGQs"D-cb8d%.j`ۉ@߻ Nt?'m? 968ZƖ]w$ꬕmEc\H96[m1 ̬`cGovY-1<c =mmi'C}Lۡ6KOqM7UÊgymhIeňisN~+4^϶P~+{Nv5+q :sH=z\ ͻ(fԞ-G׉}!=oK}|-崰>i |mc=0 .1{Cd̢@hmeDF黟BrUn2v/gY"7J̊)!2*́C?&ȸ+edQO=1zcb)RbԬZDO{E*!4=^]Լٌ~I9aC#אGNlcgONqq=$ո#ݾY-j'PƠOa߷~bPUUD dgZZBI7>> list(mypattern.occurrences()) [datetime.datetime(2014, 1, 2, 0, 0), datetime.datetime(2014, 1, 3, 0, 0)] Exclusion Rules ^^^^^^^^^^^^^^^ You can specify exclusion rules too, which are exactly the same as inclusion rules, but they represent rules which match dates which should *not* be included in the list of occurrences. Inclusion rules are provided to the ``Recurrence`` object using the kwarg ``rrules``, and exclusion rules are provided to the ``Recurrence`` object using the kwargs ``exrules``. Adding or Excluding Individual Dates ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Similarly, you can specify individual dates to include or exclude using ``rdates`` and ``exdates``, both of which should be a list of ``datetime.datetime`` objects. .. code-block:: python from datetime import datetime import recurrence pattern = recurrence.Recurrence( rdates=[ datetime(2014, 1, 1, 0, 0, 0), datetime(2014, 1, 2, 0, 0, 0), ] ) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/docs/usage/getting_started.rst0000644000076500000240000000265100000000000022305 0ustar00aleksistaffGetting started --------------- Once you've :ref:`installed django-recurrence `, you'll generally want to start by using it in one of your models, which can be done like this: .. code-block:: python :emphasize-lines: 5 from recurrence.fields import RecurrenceField class Course(models.Model): title = models.CharField(max_length=200) recurrences = RecurrenceField() If you use the ``Course`` model in Django's administrative interface, or in any forms, it should be rendered with a pretty form field, which makes selecting relatively complex recurrence patterns easy. .. figure:: admin.png :alt: The form field for recurrence fields Using this form it's possible to specify relatively complex recurrence rules - such as an event that happens every third Thursday of the month, unless that Thursday happens to be the 21st of the month, and so on. Form Usage ---------------------- .. code-block:: python from django import forms from .models import Course class CourseForm(forms.ModelForm): class Meta: model = Course fields = ('title', 'recurrences',) .. note:: Be sure to add ``{{ form.media }}`` to your template or statically link recurrence.css and recurrence.js. .. code-block:: html
{% csrf_token %} {{ form.media }} {{ form }}
././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/docs/usage/index.rst0000644000076500000240000000013100000000000020214 0ustar00aleksistaffUsage ===== .. toctree:: :maxdepth: 2 getting_started recurrence_field api ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/docs/usage/recurrence_field.rst0000644000076500000240000002050200000000000022411 0ustar00aleksistaffUsing ``RecurrenceField`` ------------------------- .. _between: Getting occurrences between two dates ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Once you've created a model with a ``RecurrenceField``, you'll probably want to use it to figure out what dates are involved in a particular recurrence pattern. .. note:: Whether you want to use ``between`` or :ref:`occurrences ` will depend on what sort of rules you're dealing with. In reality, a model like `Course` probably has rules like "every Thursday for 10 weeks", so ``occurrences`` will work fine, since the rules have natural limits. For other uses (e.g. find me every date this year for a club that runs every Wednesday), you'll want to use ``between``. ``between`` takes two dates (the start and end date), and returns a list of ``datetime`` objects matching the recurrence pattern between those dates. It is used like this (using the ``Course`` model from above): .. code-block:: python from datetime import datetime from myapp.models import Course course = Course.objects.get(pk=1) course.recurrences.between( datetime(2010, 1, 1, 0, 0, 0), datetime(2014, 12, 31, 0, 0, 0) ) This won't include occurrences if they occur on the start and end dates specified. If you want to include those, pass in ``inc`` like this: .. code-block:: python course.recurrences.between( datetime(2010, 1, 1, 0, 0, 0), datetime(2014, 12, 31, 0, 0, 0), inc=True ) .. warning:: Slightly confusingly, ``between`` will only return you dates after the current date, if used as above (provided those dates fall between the two first parameters to ``between``). Read on for how to get all the occurrences between two dates. To get all the occurrences between two dates (including dates that are *before* the current time, but *after* the provided start date), you'll also need to set ``dtstart``, like this: .. code-block:: python course.recurrences.between( datetime(2010, 1, 1, 0, 0, 0), datetime(2014, 12, 31, 0, 0, 0), dtstart=datetime(2010, 1, 1, 0, 0, 0), inc=True ) That will get you all occurrences between 1st January 2010, and 31st December 2014, including any occurrences on 1st January 2010 and 31st December 2014, if your recurrence pattern matches those dates. The effective starting date for any recurrence pattern is essentially the later of the first argument and ``dtstart``. To minimize confusion, you probably want to set them both to the same value. .. warning:: Note that per default ``dtstart`` will be the first occurence in your list if specified, according to RFC 2445. This practice deviates from how ``dateutil.rrule`` handles ``dtstart`` and can therefore lead to confusion. Read on for how you can control this behavior for your own recurrence patterns. To switch off the automatic inclusion of ``dtstart`` into the occurence list, set ``include_dtstart=False`` as an argument for the ``RecurrenceField`` whose behavior you want to change: .. code-block:: python :emphasize-lines: 3 class Course(models.Model): title = models.CharField(max_length=200) recurrences = RecurrenceField(include_dtstart=False) With this change any ``dtstart`` value will only be an occurence if it matches the pattern specified in ``recurrences``. This also works for instantiating ``Recurrence`` objects directly: .. code-block:: python :emphasize-lines: 3 pattern = recurrence.Recurrence( rrules=[recurrence.Rule(recurrence.WEEKLY, byday=recurrence.MONDAY)], include_dtstart=False).between( datetime(2010, 1, 1, 0, 0, 0), datetime(2014, 12, 31, 0, 0, 0), dtstart=datetime(2010, 1, 1, 0, 0, 0), inc=True ) ) .. _occurrences: Getting all occurrences ^^^^^^^^^^^^^^^^^^^^^^^ ``occurrences`` is particularly useful where your recurrence pattern is limited by the rules generating occurrences (e.g. "every Tuesday for 10 weeks", or "every Tuesday until 23rd April 2014"). You can get a generator which you can iterate over to get all occurrences using ``occurrences``: .. code-block:: python dates = course.recurrences.occurrences() You can optionally provide ``dtstart`` to specify the first occurrence, and ``dtend`` to specify the final occurrence. You can index into the returned object, to (for example) get the first session of our course model: .. code-block:: python dates = course.recurrences.occurrences() first_instance = dates[0] .. warning:: Looping over the entire generator returned by example above might be extremely slow and resource hungry if ``dtstart`` or ``dtend`` are not provided. Without ``dtstart``, we implicitly are looking for occurrences after the current date. Without ``dtend``, we'll look for all occurrences up to (and including) the year 9999, which is probably not what you want. The the code above counts all occurrences of our course from tomorrow until 31st December, 9999. .. _count: Counting occurrences ^^^^^^^^^^^^^^^^^^^^ The function ``count`` works fairly similarly: .. code-block:: python course.recurrences.count() It is roughly equivalent to: .. code-block:: python len(list(course.recurrences.occurrences())) Note the warning in :ref:`occurrences ` before using ``count`` (or converting the generator returned by ``occurrences()`` to a list), if you are not providing both ``dtstart`` and ``dtend``. .. _afterbefore: Getting the next or previous occurrences ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ If you want to get the next or previous occurrence in a given pattern, you can use ``after`` or ``before``, respectively. As with ``between``, you can choose whether you want to be inclusive of the ``datetime`` passed in by setting ``inc``. If no next or previous occurrence exists, ``None`` is returned. .. code-block:: python course = Course.objects.get(pk=1) # Get the first course on or after 1st January 2010 (this won't do # quite what you expect) course.recurrences.after( datetime(2010, 1, 1, 0, 0, 0), inc=True ) As with ``between``, if you don't specify a ``dtstart``, it will implicitly be the current time, so the above code will, to be more precise, give you the first course on or after 1st January 2010, or on or after the current date, whichever is later. Since you probably don't want that behaviour, you'll probably want to specify ``dtstart``, as follows: .. code-block:: python course = Course.objects.get(pk=1) # Get the first course on or after 1st January 2010 course.recurrences.after( datetime(2010, 1, 1, 0, 0, 0), inc=True, dtstart=datetime(2010, 1, 1, 0, 0, 0), ) For similar reasons, using ``before`` really requires that ``dtstart`` is provided, to give a start date to the recurrence pattern. This makes some sense if you consider a recurrence pattern like "every Monday, occurring 5 times". Without ``dtstart``, it's unclear what ``before`` should return - since it's impossible to know whether the pattern has started, and if so when. For example, if it started 5 years ago, ``before`` should return a date approximately 5 years ago, whereas if it started two weeks ago, ``before`` should return the last ``Monday`` (or the provided date, if ``inc`` is True, and the provided date is a Monday). .. _to-text: Getting textual descriptions of patterns ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Recurrence patterns can have multiple rules for inclusion (e.g. every week, on a Tuesday) and exclusion (e.g. except when it's the first Tuesday of the month), together with specific dates to include or exclude (regardless of whether they're part of the inclusion or exclusion rules). You'll often want to display a simple textual description of the rules involved. To take our ``Course`` example again, you can get access to the relevant inclusion rules by accessing the ``rrules`` member of the ``RecurrenceField`` attribute of your model (called ``recurrences`` in our example, though you can call it whatever you like), and to the exclusion rules by accessing the ``exrules`` member. From there you can get textual descriptions, like this: .. code-block:: python course = Course.objects.get(pk=1) text_rules_inclusion = [] for rule in course.recurrences.rrules: text_rules_inclusion.append(rule.to_text()) Similar code would work equally well for ``exrules``. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642493095.0 django-recurrence-1.11.1/pytest.ini0000644000076500000240000000024300000000000016354 0ustar00aleksistaff[pytest] DJANGO_SETTINGS_MODULE = tests.settings addopts = --cov recurrence --cov-append --cov-branch --cov-report term-missing --cov-report=xml testpaths = tests ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1643105481.2889872 django-recurrence-1.11.1/recurrence/0000755000076500000240000000000000000000000016461 5ustar00aleksistaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642758229.0 django-recurrence-1.11.1/recurrence/__init__.py0000644000076500000240000000110300000000000020565 0ustar00aleksistaff# flake8: noqa from recurrence.base import ( MO, TU, WE, TH, FR, SA, SU, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY, YEARLY, MONTHLY, WEEKLY, DAILY, HOURLY, MINUTELY, SECONDLY, JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER, validate, serialize, deserialize, to_utc, to_weekday, from_dateutil_rrule, from_dateutil_rruleset, Recurrence, Rule, Weekday, ) from recurrence.exceptions import ( RecurrenceError, SerializationError, DeserializationError, ValidationError ) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642759026.0 django-recurrence-1.11.1/recurrence/base.py0000644000076500000240000013772500000000000017764 0ustar00aleksistaff""" Wrapper around the ``dateutil.rrule`` module. Provides more consistent behavior with the rfc2445 specification, notably differing from `dateutil.rrule`` in the handling of the `dtstart` parameter and the additional handling of a `dtend` parameter. Also, the `byweekday` parameter in `dateutil.rrule` is `byday` in this package to reflect the specification. See the `Rule` and `Recurrence` class documentation for details on the differences. """ import re import datetime import calendar import dateutil.rrule from dateutil import tz from django.utils import dateformat from django.utils.timezone import get_current_timezone, is_aware, is_naive, make_aware from django.utils.translation import gettext as _, pgettext as _p from recurrence import exceptions from recurrence import settings YEARLY, MONTHLY, WEEKLY, DAILY, HOURLY, MINUTELY, SECONDLY = range(7) (JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER) = range(1, 13) class Rule: """ A recurrence rule. `Rule` is a representation of a rfc2445 `RECUR` type, used in the `RRULE` and `EXRULE` properties. More information about the `RECUR` type specification can be found in the rfc at http://www.ietf.org/rfc/rfc2445.txt. An `Rrule` wraps the `dateutil.rrule.rrule` class while adhering to the rfc2445 spec. Notably a `dtstart` parameter cannot be specified with a `Rule` unlike `dateutil.rrule.rrule` as only one `dtstart` can be used with a set of `RRULE` and `EXRULE` rfc2445 properties, therefore the `Recurrence` class (which is based on `dateutil.rrule.rruleset`) accepts a `dtstart` parameter instead. `Recurrence` also accepts a `dtend` parameter. Documentation is largely sourced from the `dateutil.rrule.rrule` documentation at http://labix.org/python-dateutil :Variables: `freq` : int One of the enumerated constants `YEARLY`, `MONTHLY`, `WEEKLY`, `DAILY`, `HOURLY`, `MINUTELY`, or `SECONDLY`, specifying the base recurring frequency. `interval` : int The interval between each freq iteration. For example, when using YEARLY, an interval of 2 means once every two years, but with HOURLY, it means once every two hours. The default interval is 1. `wkst` : int The week start day. Must be one of the `MO`, `TU`, `WE`, `TH`, `FR`, `SA`, `SU` constants, or an integer, specifying the first day of the week. This will affect recurrences based on weekly periods. The default week start is got from `calendar.firstweekday()`, and may be modified by `calendar.setfirstweekday()`. `count` : int How many occurrences will be generated by this rule. `until` : datetime.datetime If given, this must be a `datetime.datetime` instance, that will specify the limit of the recurrence. If a recurrence instance happens to be the same as the `datetime.datetime` instance given in the `until` keyword, this will be the last occurrence. `bysetpos` : int or sequence If given, it must be either an integer, or a sequence of integers, positive or negative. Each given integer will specify an occurrence number, corresponding to the nth occurrence of the rule inside the frequency period. For example, a `bysetpos` of `-1` if combined with a `MONTHLY` frequency, and a `byday` of `(MO, TU, WE, TH, FR)`, will result in the last work day of every month. `bymonth` : int or sequence If given, it must be either an integer, or a sequence of integers, meaning the months to apply the recurrence to. `bymonthday` : int or sequence If given, it must be either an integer, or a sequence of integers, meaning the month days to apply the recurrence to. `byyearday` : int or sequence If given, it must be either an integer, or a sequence of integers, meaning the year days to apply the recurrence to. `byweekno` : int or sequence If given, it must be either an integer, or a sequence of integers, meaning the week numbers to apply the recurrence to. Week numbers have the meaning described in ISO8601, that is, the first week of the year is that containing at least four days of the new year. `byday` : int or sequence If given, it must be either an integer `(0 == MO)`, a sequence of integers, one of the weekday constants `(MO, TU, ...)`, or a sequence of these constants. When given, these variables will define the weekdays where the recurrence will be applied. It's also possible to use an argument n for the weekday instances, which will mean the nth occurrence of this weekday in the period. For example, with `MONTHLY`, or with `YEARLY` and `BYMONTH`, using `FR(1)` in byweekday will specify the first friday of the month where the recurrence happens. `byhour` : int or sequence If given, it must be either an integer, or a sequence of integers, meaning the hours to apply the recurrence to. `byminute` : int or sequence If given, it must be either an integer, or a sequence of integers, meaning the minutes to apply the recurrence to. `bysecond` : int or sequence If given, it must be either an integer, or a sequence of integers, meaning the seconds to apply the recurrence to. """ byparams = ( 'bysetpos', 'bymonth', 'bymonthday', 'byyearday', 'byweekno', 'byday', 'byhour', 'byminute', 'bysecond' ) frequencies = ( 'YEARLY', 'MONTHLY', 'WEEKLY', 'DAILY', 'HOURLY', 'MINUTELY', 'SECONDLY' ) weekdays = ( 'MO', 'TU', 'WE', 'TH', 'FR', 'SA', 'SU' ) firstweekday = calendar.firstweekday() def __init__( self, freq, interval=1, wkst=None, count=None, until=None, **kwargs ): """ Create a new rule. See `Rule` class documentation for available `**kwargs` and parameter usage. """ self.freq = freq self.interval = interval self.wkst = wkst self.count = count self.until = until for param in self.byparams: if param in kwargs: value = kwargs[param] if hasattr(value, '__iter__'): value = list(value) if not value: value = [] elif value is not None: value = [value] else: value = [] setattr(self, param, value) else: setattr(self, param, []) def __hash__(self): byparam_values = [] for param in self.byparams: byparam_values.append(param) byparam_values.extend(getattr(self, param, []) or []) return hash(( self.freq, self.interval, self.wkst, self.count, self.until, tuple(byparam_values))) def __eq__(self, other): if not isinstance(other, Rule): raise TypeError('object to compare must be Rule object') return hash(self) == hash(other) def __ne__(self, other): return not self.__eq__(other) def to_text(self, short=False): return rule_to_text(self, short) def to_dateutil_rrule(self, dtstart=None, dtend=None, cache=False): """ Create a `dateutil.rrule.rrule` instance from this `Rule`. :Parameters: `dtstart` : datetime.datetime The date/time the recurrence rule starts. `dtend` : datetime.datetime The rule should not yield occurrences past this date. Replaces `until` if `until` is greater than `dtend`. Note: `dtend` in this case does not count for an occurrence itself. `cache` : bool If given, it must be a boolean value specifying to enable or disable caching of results. If you will use the same `dateutil.rrule.rrule` instance multiple times, enabling caching will improve the performance considerably. :Returns: A `dateutil.rrule.rrule` instance. """ kwargs = dict((p, getattr(self, p) or None) for p in self.byparams) # dateutil.rrule renames the parameter 'byweekday' by we're using # the parameter name originally specified by rfc2445. kwargs['byweekday'] = kwargs.pop('byday') until = self.until if until: until = normalize_offset_awareness(until, dtstart) if dtend: if until > dtend: until = dtend elif dtend: until = dtend return dateutil.rrule.rrule( self.freq, dtstart, self.interval, self.wkst, self.count, until, cache=cache, **kwargs) class Recurrence: """ A combination of `Rule` and `datetime.datetime` instances. A `Recurrence` instance provides the combined behavior of the rfc2445 `DTSTART`, `DTEND`, `RRULE`, `EXRULE`, `RDATE`, and `EXDATE` properties in generating recurring date/times. This is a wrapper around the `dateutil.rrule.rruleset` class while adhering to the rfc2445 spec. Notably a `dtstart` parameter can be given which cascades to all `dateutil.rrule.rrule` instances generated by included `Rule` instances. A `dtend` parameter has also been included to reflect the `DTEND` rfc2445 parameter. :Variables: `dtstart` : datetime.datetime Optionally specify the first occurrence. This defaults to `datetime.datetime.now()` when the occurrence set is generated. `dtend` : datetime.datetime Optionally specify the last occurrence. `rrules` : list A list of `Rule` instances to include in the recurrence set generation. `exrules` : list A list of `Rule` instances to include in the recurrence set exclusion list. Dates which are part of the given recurrence rules will not be generated, even if some inclusive `Rule` or `datetime.datetime` instances matches them. `rdates` : list A list of `datetime.datetime` instances to include in the occurrence set generation. `exdates` : list A list of `datetime.datetime` instances to exclude in the occurrence set generation. Dates included that way will not be generated, even if some inclusive `Rule` or `datetime.datetime` instances matches them. `include_dtstart` : bool Defines if `dtstart` is included in the recurrence set as the first occurrence. With `include_dtstart == True` it is both the starting point for recurrences and the first recurrence in the set (according to the rfc2445 spec). With `include_dtstart == False` `dtstart` is only the rule's starting point like in python's `dateutil.rrule`. """ def __init__( self, dtstart=None, dtend=None, rrules=(), exrules=(), rdates=(), exdates=(), include_dtstart=True ): """ Create a new recurrence. Parameters map directly to instance attributes, see `Recurrence` class documentation for usage. """ self._cache = {} self.dtstart = dtstart self.dtend = dtend self.rrules = list(rrules) self.exrules = list(exrules) self.rdates = list(rdates) self.exdates = list(exdates) self.include_dtstart = include_dtstart def __iter__(self): return self.occurrences() def __str__(self): return serialize(self) def __hash__(self): return hash(( self.dtstart, self.dtend, tuple(self.rrules), tuple(self.exrules), tuple(self.rdates), tuple(self.exdates))) def __bool__(self): if (self.dtstart or self.dtend or tuple(self.rrules) or tuple(self.exrules) or tuple(self.rdates) or tuple(self.exdates)): return True else: return False def __nonzero__(self): # Required for Python 2 compatibility return type(self).__bool__(self) def __eq__(self, other): if type(other) != type(self): return False if not isinstance(other, Recurrence): raise TypeError('object to compare must be Recurrence object') return hash(self) == hash(other) def __ne__(self, other): return not self.__eq__(other) def occurrences( self, dtstart=None, dtend=None, cache=False ): """ Get a generator yielding `datetime.datetime` instances in this occurrence set. :Parameters: `dtstart` : datetime.datetime Optionally specify the first occurrence of the occurrence set. Defaults to `self.dtstart` if specified or `datetime.datetime.now()` if not when the occurrence set is generated. `dtend` : datetime.datetime Optionally specify the last occurrence of the occurrence set. Defaults to `self.dtend` if specified. `cache` : bool Whether to cache the occurrence set generator. :Returns: A sequence of `datetime.datetime` instances. """ return self.to_dateutil_rruleset(dtstart, dtend, cache) def count(self, dtstart=None, dtend=None, cache=False): """ Returns the number of occurrences in this occurrence set. :Parameters: `dtstart` : datetime.datetime Optionally specify the first occurrence of the occurrence set. Defaults to `self.dtstart` if specified or `datetime.datetime.now()` if not when the occurrence set is generated. `dtend` : datetime.datetime Optionally specify the last occurrence of the occurrence set. Defaults to `self.dtend` if specified. `cache` : bool Whether to cache the occurrence set generator. :Returns: The number of occurrences in this occurrence set. """ return self.to_dateutil_rruleset(dtstart, dtend, cache).count() def before( self, dt, inc=False, dtstart=None, dtend=None, cache=False ): """ Returns the last recurrence before the given `datetime.datetime` instance. :Parameters: `dt` : datetime.datetime The date to use as the threshold. `inc` : bool Defines what happens if `dt` is an occurrence. With `inc == True`, if `dt` itself is an occurrence, it will be returned. `dtstart` : datetime.datetime Optionally specify the first occurrence of the occurrence set. Defaults to `self.dtstart` if specified or `datetime.datetime.now()` if not when the occurrence set is generated. `dtend` : datetime.datetime Optionally specify the last occurrence of the occurrence set. Defaults to `self.dtend` if specified. `cache` : bool Whether to cache the occurrence set generator. :Returns: A `datetime.datetime` instance. """ return self.to_dateutil_rruleset( dtstart, dtend, cache).before(dt, inc) def after( self, dt, inc=False, dtstart=None, dtend=None, cache=False ): """ Returns the first recurrence after the given `datetime.datetime` instance. :Parameters: `dt` : datetime.datetime The date to use as the threshold. `inc` : bool Defines what happens if `dt` is an occurrence. With `inc == True`, if `dt` itself is an occurrence, it will be returned. `dtstart` : datetime.datetime Optionally specify the first occurrence of the occurrence set. Defaults to `self.dtstart` if specified or `datetime.datetime.now()` if not when the occurrence set is generated. `dtend` : datetime.datetime Optionally specify the last occurrence of the occurrence set. Defaults to `self.dtend` if specified. `cache` : bool Whether to cache the occurrence set generator. :Returns: A `datetime.datetime` instance. """ return self.to_dateutil_rruleset(dtstart, dtend, cache).after(dt, inc) def between( self, after, before, inc=False, dtstart=None, dtend=None, cache=False ): """ Returns the first recurrence after the given `datetime.datetime` instance. :Parameters: `after` : datetime.datetime Return dates after this date. `before` : datetime.datetime Return dates before this date. `inc` : bool Defines what happens if `after` and/or `before` are themselves occurrences. With `inc == True`, they will be included in the list, if they are found in the occurrence set. `dtstart` : datetime.datetime Optionally specify the first occurrence of the occurrence set. Defaults to `self.dtstart` if specified or `datetime.datetime.now()` if not when the occurrence set is generated. `dtend` : datetime.datetime Optionally specify the last occurrence of the occurrence set. Defaults to `self.dtend` if specified. `cache` : bool Whether to cache the occurrence set generator. :Returns: A sequence of `datetime.datetime` instances. """ return self.to_dateutil_rruleset( dtstart, dtend, cache).between(after, before, inc) def to_dateutil_rruleset(self, dtstart=None, dtend=None, cache=False): """ Create a `dateutil.rrule.rruleset` instance from this `Recurrence`. :Parameters: `dtstart` : datetime.datetime The date/time the recurrence rule starts. This value overrides the `dtstart` property specified by the `Recurrence` instance if its set. `dtstart` : datetime.datetime Optionally specify the first occurrence of the occurrence set. Defaults to `self.dtstart` if specified or `datetime.datetime.now()` if not when the occurrence set is generated. `cache` : bool If given, it must be a boolean value specifying to enable or disable caching of results. If you will use the same `dateutil.rrule.rrule` instance multiple times, enabling caching will improve the performance considerably. :Returns: A `dateutil.rrule.rruleset` instance. """ # all datetimes used in dateutil.rrule objects will need to be # normalized to either offset-aware or offset-naive datetimes # to avoid exceptions. dateutil will use the tzinfo from the # given dtstart, which will cascade to other datetime objects. dtstart = dtstart or self.dtstart dtend = dtend or self.dtend include_dtstart = self.include_dtstart if dtend: dtend = normalize_offset_awareness(dtend or self.dtend, dtstart) if cache: # we need to cache an instance for each unique dtstart # value because the occurrence values will differ. cached = self._cache.get(dtstart) if cached: return cached rruleset = dateutil.rrule.rruleset(cache=cache) for rrule in self.rrules: rruleset.rrule(rrule.to_dateutil_rrule(dtstart, dtend, cache)) for exrule in self.exrules: rruleset.exrule(exrule.to_dateutil_rrule(dtstart, dtend, cache)) if include_dtstart and dtstart is not None: rruleset.rdate(dtstart) for rdate in self.rdates: rdate = normalize_offset_awareness(rdate, dtstart) if dtend is not None and rdate < dtend: rruleset.rdate(rdate) elif not dtend: rruleset.rdate(rdate) if dtend is not None: rruleset.rdate(dtend) for exdate in self.exdates: exdate = normalize_offset_awareness(exdate, dtstart) if dtend is not None and exdate < dtend: rruleset.exdate(exdate) elif not dtend: rruleset.exdate(exdate) if cache: self._cache[dtstart] = rruleset return rruleset class Weekday: """ Representation of a weekday. A `Weekday` is essentially an integer from 0 to 6, with an optional `index` which indicates its position in a month. For example, an `number` of 6 and an `index` of ``-1`` means the last sunday of the month. Weekday's with a specific index can be created by calling the existing `MO`, `TU`, `WE`, `TH`, `FR`, `SA`, `SU` constants:: >>> SU(-1) -1SU `Weekday` objects have a smart equality test that can compare integers, other `Weekday` objects, and string constants as defined by rfc2445, such as '-1SU'. """ def __init__(self, number, index=None): """ Create a new weekday constant. :Parameters: `number` : int A number in `range(7)`. `index` : int An integer specifying the weekday's position in the month. A value of ``None`` or ``0`` means the index is ambiguous and represents all weekdays of that number. """ int(number) if number > 6: raise ValueError('number must be in range(7)') self.number = number self.index = index def __call__(self, index): if index == self.index: return self else: return Weekday(self.number, index) def __hash__(self): if self.index: return hash((self.number, self.index)) else: return hash(self.number) def __eq__(self, other): other = to_weekday(other) return (self.number, self.index) == (other.number, other.index) def __repr__(self): if self.index: return '%s%s' % (self.index, Rule.weekdays[self.number]) else: return Rule.weekdays[self.number] weekday = property(lambda self: self.number) n = property(lambda self: self.index) MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY = ( MO, TU, WE, TH, FR, SA, SU) = WEEKDAYS = list(map(lambda n: Weekday(n), range(7))) def to_utc(dt): if not dt: return dt if is_naive(dt): dt = make_aware(dt) dt = dt.astimezone(tz.UTC) return dt def to_weekday(token): """ Attempt to convert an object to a `Weekday` constant. :Parameters: `token` : str, int, dateutil.rrule.weekday or `Weekday` Can be values such as `MO`, `SU(-2)`, `"-2SU"`, or an integer like `1` for Tuesday. dateutil.rrule.weekday` are returned unchanged. :Returns: A `dateutil.rrule.weekday` instance. """ if isinstance(token, Weekday): return token if isinstance(token, dateutil.rrule.weekday): return Weekday(token.weekday, token.n) if isinstance(token, int): if token > 6: raise ValueError return WEEKDAYS[token] elif not token: raise ValueError elif isinstance(token, str) and token.isdigit(): if int(token) > 6: raise ValueError return WEEKDAYS[int(token)] elif isinstance(token, str): const = token[-2:].upper() if const not in Rule.weekdays: raise ValueError nth = token[:-2] if not nth: return Weekday(list(Rule.weekdays).index(const)) else: return Weekday(list(Rule.weekdays).index(const), int(nth)) def validate(rule_or_recurrence): if isinstance(rule_or_recurrence, Rule): obj = Recurrence(rrules=[rule_or_recurrence]) else: obj = rule_or_recurrence try: if not isinstance(obj, Rule) and not isinstance(obj, Recurrence): raise exceptions.ValidationError('incompatible object') except TypeError: raise exceptions.ValidationError('incompatible object') def validate_dt(dt): if not isinstance(dt, datetime.datetime): raise exceptions.ValidationError('invalid datetime: %r' % dt) def validate_iterable(rule, param): try: [v for v in getattr(rule, param, []) if v] except TypeError: # TODO: I'm not sure it's possible to get here - all the # places we call validate_iterable convert single ints to # sequences, and other types raise TypeErrors earlier. raise exceptions.ValidationError( '%s parameter must be iterable' % param) def validate_iterable_ints(rule, param, min_value=None, max_value=None): for value in getattr(rule, param, []): try: value = int(value) if min_value is not None: if value < min_value: raise ValueError if max_value is not None: if value > max_value: raise ValueError except ValueError: raise exceptions.ValidationError( 'invalid %s parameter: %r' % (param, value)) def validate_rule(rule): # validate freq try: Rule.frequencies[int(rule.freq)] except IndexError: raise exceptions.ValidationError( 'invalid freq parameter: %r' % rule.freq) except ValueError: raise exceptions.ValidationError( 'invalid freq parameter: %r' % rule.freq) # validate interval try: interval = int(rule.interval) if interval < 1: raise ValueError except ValueError: raise exceptions.ValidationError( 'invalid interval parameter: %r' % rule.interval) # validate wkst if rule.wkst: try: to_weekday(rule.wkst) except ValueError: raise exceptions.ValidationError( 'invalide wkst parameter: %r' % rule.wkst) # validate until if rule.until: try: validate_dt(rule.until) except ValueError: # TODO: I'm not sure it's possible to get here # (validate_dt doesn't raise ValueError) raise exceptions.ValidationError( 'invalid until parameter: %r' % rule.until) # validate count if rule.count: try: int(rule.count) except ValueError: raise exceptions.ValidationError( 'invalid count parameter: %r' % rule.count) # TODO: Should we check that you haven't specified both # rule.count and rule.until? Note that we only serialize # rule.until if there's no rule.count. # validate byparams for param in Rule.byparams: validate_iterable(rule, param) if param == 'byday': for value in getattr(rule, 'byday', []): try: to_weekday(value) except ValueError: raise exceptions.ValidationError( 'invalid byday parameter: %r' % value) elif param == 'bymonth': validate_iterable_ints(rule, param, 1, 12) elif param == 'bymonthday': validate_iterable_ints(rule, param, -4, 31) elif param == 'byhour': validate_iterable_ints(rule, param, 0, 23) elif param == 'byminute': validate_iterable_ints(rule, param, 0, 59) elif param == 'bysecond': validate_iterable_ints(rule, param, 0, 59) else: validate_iterable_ints(rule, param) if obj.dtstart: validate_dt(obj.dtstart) if obj.dtend: validate_dt(obj.dtend) if obj.rrules: list(map(lambda rule: validate_rule(rule), obj.rrules)) if obj.exrules: list(map(lambda rule: validate_rule(rule), obj.exrules)) if obj.rdates: list(map(lambda dt: validate_dt(dt), obj.rdates)) if obj.exdates: list(map(lambda dt: validate_dt(dt), obj.exdates)) def serialize(rule_or_recurrence): """ Serialize a `Rule` or `Recurrence` instance. `Rule` instances are wrapped as an rrule in a `Recurrence` instance before serialization, and will serialize as the `RRULE` property. All `datetime.datetime` objects will be converted and serialized as UTC. :Returns: A rfc2445 formatted unicode string. """ def serialize_dt(dt): dt = to_utc(dt) return u'%s%s%sT%s%s%sZ' % ( str(dt.year).rjust(4, '0'), str(dt.month).rjust(2, '0'), str(dt.day).rjust(2, '0'), str(dt.hour).rjust(2, '0'), str(dt.minute).rjust(2, '0'), str(dt.second).rjust(2, '0'), ) def serialize_rule(rule): values = [] values.append((u'FREQ', [Rule.frequencies[rule.freq]])) if rule.interval != 1: values.append((u'INTERVAL', [str(int(rule.interval))])) if rule.wkst: values.append((u'WKST', [Rule.weekdays[getattr(rule.wkst, 'number', rule.wkst)]])) if rule.count is not None: values.append((u'COUNT', [str(rule.count)])) elif rule.until is not None: values.append((u'UNTIL', [serialize_dt(rule.until)])) if rule.byday: days = [] for d in rule.byday: d = to_weekday(d) # TODO - this if/else copies what Weekday's __repr__ # does - perhaps we should refactor it into a __str__ # method on Weekday? if d.index: days.append(u'%s%s' % (d.index, Rule.weekdays[d.number])) else: days.append(Rule.weekdays[d.number]) values.append((u'BYDAY', days)) remaining_params = list(Rule.byparams) remaining_params.remove('byday') for param in remaining_params: value_list = getattr(rule, param, None) if value_list: values.append((param.upper(), [str(n) for n in value_list])) return u';'.join(u'%s=%s' % (i[0], u','.join(i[1])) for i in values) if rule_or_recurrence is None: return None try: validate(rule_or_recurrence) except exceptions.ValidationError as error: raise exceptions.SerializationError(error.args[0]) obj = rule_or_recurrence if isinstance(obj, Rule): obj = Recurrence(rrules=[obj]) items = [] if obj.dtstart: items.append((u'DTSTART', serialize_dt(obj.dtstart))) if obj.dtend: items.append((u'DTEND', serialize_dt(obj.dtend))) for rrule in obj.rrules: items.append((u'RRULE', serialize_rule(rrule))) for exrule in obj.exrules: items.append((u'EXRULE', serialize_rule(exrule))) for rdate in obj.rdates: items.append((u'RDATE', serialize_dt(rdate))) for exdate in obj.exdates: items.append((u'EXDATE', serialize_dt(exdate))) return u'\n'.join(u'%s:%s' % i for i in items) def deserialize(text, include_dtstart=True): """ Deserialize a rfc2445 formatted string. This is a basic parser that is a partial implementation of rfc2445 which pertains to specifying recurring date/times. Limitations include: - Only collects `DTSTART`, `DTEND`, `RRULE`, `EXRULE`, `RDATE`, and `EXDATE` properties. - Does not capture parameter options (i.e. RDATE;VALUE=PERIOD). `dateutil.rrule` does not support anything other than `DATE-TIME` parameter types. - `VTIMEZONE` and `TZID` can't be specified, so dates without the 'Z' marker will be localized to `settings.TIME_ZONE`. `datetime.datetime` objects in `Recurrence`/`Rrule` objects will be serialized as UTC. - The `DTSTART`, `DTEND`, `RDATE` and `EXDATE` properties also only support the `DATE-TIME` type. :Returns: A `Recurrence` instance. """ def deserialize_dt(text): """ Deserialize a rfc2445 text to a datetime. The setting RECURRENCE_USE_TZ determines if a naive or timezone aware datetime is returned. If this setting is not present the setting USE_TZ is used as a default. This setting is accessed via the `.settings.deserialize_tz` function. """ try: year, month, day = int(text[:4]), int(text[4:6]), int(text[6:8]) except ValueError: raise exceptions.DeserializationError('malformed date-time: %r' % text) if u'T' in text: # time is also specified try: hour, minute, second = ( int(text[9:11]), int(text[11:13]), int(text[13:15])) except ValueError: raise exceptions.DeserializationError('malformed date-time: %r' % text) else: # only date is specified, use midnight hour, minute, second = (0, 0, 0) if u'Z' in text: # time is in utc tzinfo = tz.UTC else: # right now there is no support for VTIMEZONE/TZID since # this is a partial implementation of rfc2445 so we'll # just use the time zone specified in the Django settings. tzinfo = get_current_timezone() dt = datetime.datetime( year, month, day, hour, minute, second, tzinfo=tzinfo) if settings.deserialize_tz(): return dt dt = dt.astimezone(get_current_timezone()) # set tz to settings.TIME_ZONE and return offset-naive datetime return datetime.datetime( dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second) dtstart, dtend, rrules, exrules, rdates, exdates = None, None, [], [], [], [] tokens = re.compile( u'(DTSTART|DTEND|RRULE|EXRULE|RDATE|EXDATE)[^:]*:(.*)', re.MULTILINE).findall(text) if not tokens and text: raise exceptions.DeserializationError('malformed data') for label, param_text in tokens: if not param_text: raise exceptions.DeserializationError('empty property: %r' % label) if label in (u'RRULE', u'EXRULE'): params = {} param_tokens = filter(lambda p: p, param_text.split(u';')) for item in param_tokens: try: param_name, param_value = map( lambda i: i.strip(), item.split(u'=', 1)) except ValueError: raise exceptions.DeserializationError( 'missing parameter value: %r' % item) params[param_name] = list(map( lambda i: i.strip(), param_value.split(u','))) kwargs = {} for key, value in params.items(): if key == u'FREQ': try: kwargs[str(key.lower())] = list( Rule.frequencies).index(value[0]) except ValueError: raise exceptions.DeserializationError( 'bad frequency value: %r' % value[0]) elif key == u'INTERVAL': try: kwargs[str(key.lower())] = int(value[0]) except ValueError: raise exceptions.DeserializationError( 'bad interval value: %r' % value[0]) elif key == u'WKST': try: kwargs[str(key.lower())] = to_weekday(value[0]).number except ValueError: raise exceptions.DeserializationError( 'bad weekday value: %r' % value[0]) elif key == u'COUNT': try: kwargs[str(key.lower())] = int(value[0]) except ValueError: raise exceptions.DeserializationError( 'bad count value: %r' % value[0]) elif key == u'UNTIL': kwargs[str(key.lower())] = deserialize_dt(value[0]) elif key == u'BYDAY': bydays = [] for v in value: try: bydays.append(to_weekday(v)) except ValueError: raise exceptions.DeserializationError( 'bad weekday value: %r' % v) kwargs[str(key.lower())] = bydays elif key.lower() in Rule.byparams: numbers = [] for v in value: try: numbers.append(int(v)) except ValueError: raise exceptions.DeserializationError( 'bad value: %r' % value) kwargs[str(key.lower())] = numbers else: raise exceptions.DeserializationError('bad parameter: %s' % key) if 'freq' not in kwargs: raise exceptions.DeserializationError( 'frequency parameter missing from rule') if label == u'RRULE': rrules.append(Rule(**kwargs)) else: exrules.append(Rule(**kwargs)) elif label == u'DTSTART': dtstart = deserialize_dt(param_text) elif label == u'DTEND': dtend = deserialize_dt(param_text) elif label == u'RDATE': rdates.append(deserialize_dt(param_text)) elif label == u'EXDATE': exdates.append(deserialize_dt(param_text)) return Recurrence(dtstart, dtend, rrules, exrules, rdates, exdates, include_dtstart) def rule_to_text(rule, short=False): """ Render the given `Rule` as natural text. :Parameters: `short` : bool Use abbreviated labels, i.e. 'Fri' instead of 'Friday'. """ frequencies = ( _('annually'), _('monthly'), _('weekly'), _('daily'), _('hourly'), _('minutely'), _('secondly'), ) timeintervals = ( _('years'), _('months'), _('weeks'), _('days'), _('hours'), _('minutes'), _('seconds'), ) if short: positional_display = { 1: _('1st %(weekday)s'), 2: _('2nd %(weekday)s'), 3: _('3rd %(weekday)s'), -1: _('last %(weekday)s'), -2: _('2nd last %(weekday)s'), -3: _('3rd last %(weekday)s'), } last_of_month_display = { -1: _('last'), -2: _('2nd last'), -3: _('3rd last'), -4: _('4th last'), } weekdays_display = ( _('Mon'), _('Tue'), _('Wed'), _('Thu'), _('Fri'), _('Sat'), _('Sun'), ) months_display = ( _('Jan'), _('Feb'), _('Mar'), _('Apr'), _p('month name', 'May'), _('Jun'), _('Jul'), _('Aug'), _('Sep'), _('Oct'), _('Nov'), _('Dec'), ) else: positional_display = { 1: _('first %(weekday)s'), 2: _('second %(weekday)s'), 3: _('third %(weekday)s'), 4: _('fourth %(weekday)s'), -1: _('last %(weekday)s'), -2: _('second last %(weekday)s'), -3: _('third last %(weekday)s'), } last_of_month_display = { -1: _('last'), -2: _('second last'), -3: _('third last'), -4: _('fourth last'), } weekdays_display = ( _('Monday'), _('Tuesday'), _('Wednesday'), _('Thursday'), _('Friday'), _('Saturday'), _('Sunday'), ) months_display = ( _('January'), _('February'), _('March'), _('April'), _p('month name', 'May'), _('June'), _('July'), _('August'), _('September'), _('October'), _('November'), _('December'), ) def get_positional_weekdays(rule): items = [] if rule.bysetpos and rule.byday: for setpos in rule.bysetpos: for byday in rule.byday: byday = to_weekday(byday) items.append( positional_display.get(setpos) % { 'weekday': weekdays_display[byday.number]}) elif rule.byday: for byday in rule.byday: byday = to_weekday(byday) items.append( positional_display.get(byday.index, '%(weekday)s') % { 'weekday': weekdays_display[byday.number]}) return _(', ').join(items) parts = [] if rule.interval > 1: parts.append( _('every %(number)s %(freq)s') % { 'number': rule.interval, 'freq': timeintervals[rule.freq] }) else: parts.append(frequencies[rule.freq]) if rule.freq == YEARLY: if rule.bymonth: # bymonths are 1-indexed (January is 1), months_display # are 0-indexed (January is 0). items = _(', ').join( [months_display[month] for month in [month_index - 1 for month_index in rule.bymonth]]) parts.append(_('each %(items)s') % {'items': items}) if rule.byday or rule.bysetpos: parts.append( _('on the %(items)s') % { 'items': get_positional_weekdays(rule)}) if rule.freq == MONTHLY: if rule.bymonthday: items = _(', ').join([ dateformat.format(datetime.datetime(1, 1, day), 'jS') if day > 0 else last_of_month_display.get(day, day) for day in rule.bymonthday]) parts.append(_('on the %(items)s') % {'items': items}) elif rule.byday: if rule.byday or rule.bysetpos: parts.append( _('on the %(items)s') % { 'items': get_positional_weekdays(rule)}) if rule.freq == WEEKLY: if rule.byday: items = _(', ').join([ weekdays_display[to_weekday(day).number] for day in rule.byday]) parts.append(_('each %(items)s') % {'items': items}) # daily freqencies has no additional formatting, # hour/minute/second formatting not supported if rule.count: if rule.count == 1: parts.append(_('occuring once')) else: parts.append(_('occuring %(number)s times') % { 'number': rule.count}) elif rule.until: parts.append(_('until %(date)s') % { 'date': dateformat.format(rule.until, 'Y-m-d')}) return _(', ').join(parts) def normalize_offset_awareness(dt, from_dt=None): """ Given two `datetime.datetime` objects, return the second object as timezone offset-aware or offset-naive depending on the existence of the first object's tzinfo. If the second object is to be made offset-aware, it is assumed to be in the local timezone (with the timezone derived from the TIME_ZONE setting). If it is to be made offset-naive, It is first converted to the local timezone before being made naive. :Parameters: `dt` : `datetime.datetime` The datetime object to make offset-aware/offset-naive. `from_dt` : `datetime.datetime` The datetime object to test the existence of a tzinfo. If the value is nonzero, it will be understood as offset-naive """ if from_dt and is_aware(from_dt) and is_aware(dt): return dt elif from_dt and is_aware(from_dt) and is_naive(dt): dt = make_aware(dt) elif is_aware(dt): dt = dt.astimezone(get_current_timezone()) dt = datetime.datetime( dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second) return dt def from_dateutil_rrule(rrule): """ Convert a `dateutil.rrule.rrule` instance to a `Rule` instance. :Returns: A `Rrule` instance. """ kwargs = {} kwargs['freq'] = rrule._freq kwargs['interval'] = rrule._interval if rrule._wkst != 0: kwargs['wkst'] = rrule._wkst kwargs['bysetpos'] = rrule._bysetpos if rrule._count is not None: kwargs['count'] = rrule._count elif rrule._until is not None: kwargs['until'] = rrule._until days = [] if (rrule._byweekday is not None and ( WEEKLY != rrule._freq or len(rrule._byweekday) != 1 or rrule._dtstart.weekday() != rrule._byweekday[0])): # ignore byweekday if freq is WEEKLY and day correlates # with dtstart because it was automatically set by # dateutil days.extend(Weekday(n) for n in rrule._byweekday) if rrule._bynweekday is not None: days.extend(Weekday(*n) for n in rrule._bynweekday) if len(days) > 0: kwargs['byday'] = days if rrule._bymonthday is not None and len(rrule._bymonthday) > 0: if not (rrule._freq <= MONTHLY and len(rrule._bymonthday) == 1 and rrule._bymonthday[0] == rrule._dtstart.day): # ignore bymonthday if it's generated by dateutil kwargs['bymonthday'] = list(rrule._bymonthday) if rrule._bynmonthday is not None and len(rrule._bynmonthday) > 0: kwargs.setdefault('bymonthday', []).extend(rrule._bynmonthday) if rrule._bymonth is not None and len(rrule._bymonth) > 0: if (rrule._byweekday is not None or len(rrule._bynweekday or ()) > 0 or not ( rrule._freq == YEARLY and len(rrule._bymonth) == 1 and rrule._bymonth[0] == rrule._dtstart.month)): # ignore bymonth if it's generated by dateutil kwargs['bymonth'] = list(rrule._bymonth) if rrule._byyearday is not None: kwargs['byyearday'] = list(rrule._byyearday) if rrule._byweekno is not None: kwargs['byweekno'] = list(rrule._byweekno) kwargs['byhour'] = list(rrule._byhour) kwargs['byminute'] = list(rrule._byminute) kwargs['bysecond'] = list(rrule._bysecond) if (rrule._dtstart.hour in rrule._byhour and rrule._dtstart.minute in rrule._byminute and rrule._dtstart.second in rrule._bysecond): # ignore byhour/byminute/bysecond automatically set by # dateutil from dtstart kwargs['byhour'].remove(rrule._dtstart.hour) kwargs['byminute'].remove(rrule._dtstart.minute) kwargs['bysecond'].remove(rrule._dtstart.second) return Rule(**kwargs) def from_dateutil_rruleset(rruleset): """ Convert a `dateutil.rrule.rruleset` instance to a `Recurrence` instance. :Returns: A `Recurrence` instance. """ rrules = [from_dateutil_rrule(rrule) for rrule in rruleset._rrule] exrules = [from_dateutil_rrule(exrule) for exrule in rruleset._exrule] rdates = rruleset._rdate exdates = rruleset._exdate dts = [r._dtstart for r in rruleset._rrule] + rruleset._rdate if len(dts) > 0: dts.sort() dtstart = dts[0] else: dtstart = None return Recurrence(dtstart, rrules, exrules, rdates, exdates) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642758229.0 django-recurrence-1.11.1/recurrence/choices.py0000644000076500000240000000240100000000000020445 0ustar00aleksistafffrom django.utils.translation import gettext_lazy as _ import recurrence FREQUENCY_CHOICES = ( (recurrence.SECONDLY, _('Secondly')), (recurrence.MINUTELY, _('Minutely')), (recurrence.HOURLY, _('Hourly')), (recurrence.DAILY, _('Daily')), (recurrence.WEEKLY, _('Weekly')), (recurrence.MONTHLY, _('Monthly')), (recurrence.YEARLY, _('Yearly')), ) WEEKDAY_CHOICES = ( (recurrence.MONDAY, _('Monday')), (recurrence.TUESDAY, _('Tuesday')), (recurrence.WEDNESDAY, _('Wednesday')), (recurrence.THURSDAY, _('Thursday')), (recurrence.FRIDAY, _('Friday')), (recurrence.SATURDAY, _('Saturday')), (recurrence.SUNDAY, _('Sunday')), ) MONTH_CHOICES = ( (recurrence.JANUARY, _('January')), (recurrence.FEBRUARY, _('February')), (recurrence.MARCH, _('March')), (recurrence.APRIL, _('April')), (recurrence.MAY, _('May')), (recurrence.JUNE, _('June')), (recurrence.JULY, _('July')), (recurrence.AUGUST, _('August')), (recurrence.SEPTEMBER, _('September')), (recurrence.OCTOBER, _('October')), (recurrence.NOVEMBER, _('November')), (recurrence.DECEMBER, _('December')), ) EXCLUSION = False INCLUSION = True MODE_CHOICES = ( (INCLUSION, _('Inclusion')), (EXCLUSION, _('Exclusion')), ) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/compat.py0000644000076500000240000000120000000000000020307 0ustar00aleksistafftry: from django.db.models.fields.subclassing import Creator except ImportError: # This class was removed in Django 1.10, so I've pulled it into # django-recurrence. class Creator: """ A placeholder class that provides a way to set the attribute on the model. """ def __init__(self, field): self.field = field def __get__(self, obj, type=None): if obj is None: return self return obj.__dict__[self.field.name] def __set__(self, obj, value): obj.__dict__[self.field.name] = self.field.to_python(value) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/exceptions.py0000644000076500000240000000032400000000000021213 0ustar00aleksistafffrom django.core.exceptions import ValidationError class RecurrenceError(ValidationError): pass class SerializationError(RecurrenceError): pass class DeserializationError(RecurrenceError): pass ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642412762.0 django-recurrence-1.11.1/recurrence/fields.py0000644000076500000240000000302200000000000020276 0ustar00aleksistafffrom django.db.models import fields import recurrence from recurrence import forms from recurrence.compat import Creator # Do not use SubfieldBase meta class because is removed in Django 1.10 class RecurrenceField(fields.Field): """Field that stores a `recurrence.base.Recurrence` to the database.""" def __init__(self, include_dtstart=True, **kwargs): self.include_dtstart = include_dtstart super(RecurrenceField, self).__init__(**kwargs) def get_internal_type(self): return 'TextField' def to_python(self, value): if value is None or isinstance(value, recurrence.Recurrence): return value value = super(RecurrenceField, self).to_python(value) or u'' return recurrence.deserialize(value, self.include_dtstart) def from_db_value(self, value, *args, **kwargs): return self.to_python(value) def get_prep_value(self, value): if not isinstance(value, str): value = recurrence.serialize(value) return value def contribute_to_class(self, cls, *args, **kwargs): super(RecurrenceField, self).contribute_to_class(cls, *args, **kwargs) setattr(cls, self.name, Creator(self)) def value_to_string(self, obj): return self.get_prep_value(self.value_from_object(obj)) def formfield(self, **kwargs): defaults = { 'form_class': forms.RecurrenceField, 'widget': forms.RecurrenceWidget, } defaults.update(kwargs) return super().formfield(**defaults) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642758229.0 django-recurrence-1.11.1/recurrence/forms.py0000644000076500000240000002023100000000000020157 0ustar00aleksistafffrom django import forms, urls from django.conf import settings from django.views import i18n from django.utils.translation import gettext_lazy as _ from django.contrib.staticfiles.storage import staticfiles_storage import recurrence from recurrence import exceptions class RecurrenceWidget(forms.Textarea): def __init__(self, attrs=None, **kwargs): self.js_widget_options = kwargs defaults = {'class': 'recurrence-widget'} if attrs is not None: defaults.update(attrs) super().__init__(defaults) def get_media(self): extra = '' if settings.DEBUG else '.min' js = [ 'admin/js/vendor/jquery/jquery%s.js' % extra, 'admin/js/jquery.init.js', staticfiles_storage.url('recurrence/js/recurrence.js'), staticfiles_storage.url('recurrence/js/recurrence-widget.js'), staticfiles_storage.url('recurrence/js/recurrence-widget.init.js'), ] i18n_media = find_recurrence_i18n_js_catalog() if i18n_media: js.insert(0, i18n_media) return forms.Media( js=js, css={ 'all': ( staticfiles_storage.url('recurrence/css/recurrence.css'), ), }, ) media = property(get_media) class RecurrenceField(forms.CharField): """ A Field that accepts the recurrence related parameters of rfc2445. Values are deserialized into `recurrence.base.Recurrence` objects. """ widget = RecurrenceWidget default_error_messages = { 'invalid_frequency': _( u'Invalid frequency.'), 'max_rrules_exceeded': _( u'Max rules exceeded. The limit is %(limit)s'), 'max_exrules_exceeded': _( u'Max exclusion rules exceeded. The limit is %(limit)s'), 'max_rdates_exceeded': _( u'Max dates exceeded. The limit is %(limit)s'), 'max_exdates_exceeded': _( u'Max exclusion dates exceeded. The limit is %(limit)s'), 'recurrence_required': _( u'This field is required. Set either a recurrence rule or date.'), } def __init__( self, frequencies=None, accept_dtstart=True, accept_dtend=True, max_rrules=None, max_exrules=None, max_rdates=None, max_exdates=None, *args, **kwargs ): """ Create a recurrence field. A `RecurrenceField` takes the same parameters as a `CharField` field with some additional paramaters. :Parameters: `frequencies` : sequence A sequence of the frequency constants specifying which frequencies are valid for input. By default all frequencies are valid. `accept_dtstart` : bool Whether to accept a dtstart value passed in the input. `accept_dtend` : bool Whether to accept a dtend value passed in the input. `max_rrules` : int The max number of rrules to accept in the input. A value of ``0`` means input of rrules is disabled. `max_exrules` : int The max number of exrules to accept in the input. A value of ``0`` means input of exrules is disabled. `max_rdates` : int The max number of rdates to accept in the input. A value of ``0`` means input of rdates is disabled. `max_exdates` : int The max number of exdates to accept in the input. A value of ``0`` means input of exdates is disabled. """ self.accept_dtstart = accept_dtstart self.accept_dtend = accept_dtend self.max_rrules = max_rrules self.max_exrules = max_exrules self.max_rdates = max_rdates self.max_exdates = max_exdates if frequencies is not None: self.frequencies = frequencies else: self.frequencies = ( recurrence.YEARLY, recurrence.MONTHLY, recurrence.WEEKLY, recurrence.DAILY, recurrence.HOURLY, recurrence.MINUTELY, recurrence.SECONDLY, ) super().__init__(*args, **kwargs) def clean(self, value): """ Validates that ``value`` deserialized into a `recurrence.base.Recurrence` object falls within the parameters specified to the `RecurrenceField` constructor. """ try: recurrence_obj = recurrence.deserialize(value) except exceptions.DeserializationError as error: raise forms.ValidationError(error.args[0]) except TypeError: return None if not self.accept_dtstart: recurrence_obj.dtstart = None if not self.accept_dtend: recurrence_obj.dtend = None if self.max_rrules is not None: if len(recurrence_obj.rrules) > self.max_rrules: raise forms.ValidationError( self.error_messages['max_rrules_exceeded'] % { 'limit': self.max_rrules } ) if self.max_exrules is not None: if len(recurrence_obj.exrules) > self.max_exrules: raise forms.ValidationError( self.error_messages['max_exrules_exceeded'] % { 'limit': self.max_exrules } ) if self.max_rdates is not None: if len(recurrence_obj.rdates) > self.max_rdates: raise forms.ValidationError( self.error_messages['max_rdates_exceeded'] % { 'limit': self.max_rdates } ) if self.max_exdates is not None: if len(recurrence_obj.exdates) > self.max_exdates: raise forms.ValidationError( self.error_messages['max_exdates_exceeded'] % { 'limit': self.max_exdates } ) for rrule in recurrence_obj.rrules: if rrule.freq not in self.frequencies: raise forms.ValidationError( self.error_messages['invalid_frequency']) for exrule in recurrence_obj.exrules: if exrule.freq not in self.frequencies: raise forms.ValidationError( self.error_messages['invalid_frequency']) if self.required: if not recurrence_obj.rrules and not recurrence_obj.rdates and not recurrence_obj.exdates and not recurrence_obj.exrules: raise forms.ValidationError( self.error_messages['recurrence_required'] ) return recurrence_obj _recurrence_javascript_catalog_url = None def find_recurrence_i18n_js_catalog(): # used cached version global _recurrence_javascript_catalog_url if _recurrence_javascript_catalog_url: return _recurrence_javascript_catalog_url # first try to use the dynamic form of the javascript_catalog view if hasattr(i18n, 'javascript_catalog'): try: return urls.reverse( i18n.javascript_catalog, kwargs={'packages': 'recurrence'}) except urls.NoReverseMatch: pass # then scan the entire urlconf for a javascript_catalague pattern # that manually selects recurrence as one of the packages to include def check_urlpatterns(urlpatterns): for pattern in urlpatterns: if hasattr(pattern, 'url_patterns'): match = check_urlpatterns(pattern.url_patterns) if match: return match elif (hasattr(i18n, 'javascript_catalog') and pattern.callback == i18n.javascript_catalog and 'recurrence' in pattern.default_args.get('packages', [])): if pattern.name: return urls.reverse(pattern.name) else: return urls.reverse(pattern.callback) root_urlconf = __import__(settings.ROOT_URLCONF, {}, {}, ['']) url = check_urlpatterns(root_urlconf.urlpatterns) # cache it for subsequent use _recurrence_javascript_catalog_url = url return url ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1643105481.2659838 django-recurrence-1.11.1/recurrence/locale/0000755000076500000240000000000000000000000017720 5ustar00aleksistaff././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1643105481.263906 django-recurrence-1.11.1/recurrence/locale/de/0000755000076500000240000000000000000000000020310 5ustar00aleksistaff././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1643105481.289994 django-recurrence-1.11.1/recurrence/locale/de/LC_MESSAGES/0000755000076500000240000000000000000000000022075 5ustar00aleksistaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/locale/de/LC_MESSAGES/django.mo0000644000076500000240000001053200000000000023675 0ustar00aleksistaff[ 5>BHLSY] fpt} *444 *i                      # * 1 : @ E T n             . : R [ c u      2    , ; F ] h l r v }                 >OEA7 ! (26?CKN Vb fps{ ~      -8@H \g oy     3 @MTS) R'C@P[ =MAN!"8I5JX%G24.LQ#-0D: ?&B, U;FKY1 E3(Z>W<V76/9T+*$ HO1st %(weekday)s2nd %(weekday)s2nd last2nd last %(weekday)s3rd %(weekday)s3rd last3rd last %(weekday)s4th lastAprAprilAugAugustDailyDecDecemberExclusionFebFebruaryFriFridayHourlyInclusionInvalid frequency.JanJanuaryJulJulyJunJuneMarMarchMax dates exceeded. The limit is %(limit)sMax exclusion dates exceeded. The limit is %(limit)sMax exclusion rules exceeded. The limit is %(limit)sMax rules exceeded. The limit is %(limit)sMayMinutelyMonMondayMonthlyNovNovemberOctOctoberSatSaturdaySecondlySepSeptemberSunSundayThuThursdayTueTuesdayWedWednesdayWeeklyYearlyannuallydailydayseach %(items)severy %(number)s %(freq)sfirst %(weekday)sfourth %(weekday)sfourth lasthourlyhourslastlast %(weekday)sminutelyminutesmonthlymonthsoccuring %(number)s timesoccuring onceon the %(items)ssecond %(weekday)ssecond lastsecond last %(weekday)ssecondlysecondsthird %(weekday)sthird lastthird last %(weekday)suntil %(date)sweeklyweeksyearsProject-Id-Version: Django Recurrence 1.4.1 Report-Msgid-Bugs-To: POT-Creation-Date: 2017-02-24 23:21+0100 PO-Revision-Date: 2017-02-24 23:22+0100 Last-Translator: Denis Anuschewski Language-Team: Language: German MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. %(weekday)s2. %(weekday)s2. letzten2. letzten %(weekday)s3. %(weekday)s3. letzten3. letzten %(weekday)s4. letztenAprAprilAugAugustTäglichDezDezemberOhneFebFebruarFrFreitagStündlichEinschließlichUngültige Frequenz.JanJanuarJulJuliJunJuniMrzMärzMaximale Anzahl an %(limit)s Datumsangaben ist überschritten.Maximale Anzahl an %(limit)s ausschließenden Datumsangaben ist überschritten.Maximale Anzahl an %(limit)s Ausschlussregeln ist überschritten.Maximale Anzahl an %(limit)s Regeln ist überschritten.MaiMinütlichMoMontagMonatlichNovNovemberOktOktoberSaSamstagSekündlichSepSeptemberSoSonntagDoDonnerstagDiDienstagMiMittwochWöchentlichJährlichjährlichtäglichTagejeden %(items)salle %(number)s %(freq)sersten %(weekday)svierten %(weekday)sviertletztenstündlichStundenletztenletzten %(weekday)sminütlichMinutenmonatlichMonatebis zum %(number)s. Maleinmaligam %(items)szweiten %(weekday)svorletztenvorletzten %(weekday)ssekündlichSekundendritten %(weekday)sdrittletztendrittletzten %(weekday)sbis %(date)swöchentlichWochenJahre././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/locale/de/LC_MESSAGES/django.po0000644000076500000240000001517200000000000023705 0ustar00aleksistaff# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: Django Recurrence 1.4.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-24 23:21+0100\n" "PO-Revision-Date: 2017-02-24 23:22+0100\n" "Last-Translator: Denis Anuschewski\n" "Language-Team: \n" "Language: German\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: base.py:1087 msgid "annually" msgstr "jährlich" #: base.py:1087 msgid "monthly" msgstr "monatlich" #: base.py:1087 msgid "weekly" msgstr "wöchentlich" #: base.py:1087 msgid "daily" msgstr "täglich" #: base.py:1088 msgid "hourly" msgstr "stündlich" #: base.py:1088 msgid "minutely" msgstr "minütlich" #: base.py:1088 msgid "secondly" msgstr "sekündlich" #: base.py:1091 msgid "years" msgstr "Jahre" #: base.py:1091 msgid "months" msgstr "Monate" #: base.py:1091 msgid "weeks" msgstr "Wochen" #: base.py:1091 msgid "days" msgstr "Tage" #: base.py:1092 msgid "hours" msgstr "Stunden" #: base.py:1092 msgid "minutes" msgstr "Minuten" #: base.py:1092 msgid "seconds" msgstr "Sekunden" #: base.py:1097 #, python-format msgid "1st %(weekday)s" msgstr "1. %(weekday)s" #: base.py:1098 #, python-format msgid "2nd %(weekday)s" msgstr "2. %(weekday)s" #: base.py:1099 #, python-format msgid "3rd %(weekday)s" msgstr "3. %(weekday)s" #: base.py:1100 base.py:1126 #, python-format msgid "last %(weekday)s" msgstr "letzten %(weekday)s" #: base.py:1101 #, python-format msgid "2nd last %(weekday)s" msgstr "2. letzten %(weekday)s" #: base.py:1102 #, python-format msgid "3rd last %(weekday)s" msgstr "3. letzten %(weekday)s" #: base.py:1105 base.py:1131 msgid "last" msgstr "letzten" #: base.py:1106 msgid "2nd last" msgstr "2. letzten" #: base.py:1107 msgid "3rd last" msgstr "3. letzten" #: base.py:1108 msgid "4th last" msgstr "4. letzten" #: base.py:1111 msgid "Mon" msgstr "Mo" #: base.py:1111 msgid "Tue" msgstr "Di" #: base.py:1111 msgid "Wed" msgstr "Mi" #: base.py:1112 msgid "Thu" msgstr "Do" #: base.py:1112 msgid "Fri" msgstr "Fr" #: base.py:1112 msgid "Sat" msgstr "Sa" #: base.py:1112 msgid "Sun" msgstr "So" #: base.py:1115 msgid "Jan" msgstr "Jan" #: base.py:1115 msgid "Feb" msgstr "Feb" #: base.py:1115 msgid "Mar" msgstr "Mrz" #: base.py:1115 msgid "Apr" msgstr "Apr" #: base.py:1116 msgid "Jun" msgstr "Jun" #: base.py:1116 msgid "Jul" msgstr "Jul" #: base.py:1116 msgid "Aug" msgstr "Aug" #: base.py:1117 msgid "Sep" msgstr "Sep" #: base.py:1117 msgid "Oct" msgstr "Okt" #: base.py:1117 msgid "Nov" msgstr "Nov" #: base.py:1117 msgid "Dec" msgstr "Dez" #: base.py:1122 #, python-format msgid "first %(weekday)s" msgstr "ersten %(weekday)s" #: base.py:1123 #, python-format msgid "second %(weekday)s" msgstr "zweiten %(weekday)s" #: base.py:1124 #, python-format msgid "third %(weekday)s" msgstr "dritten %(weekday)s" #: base.py:1125 #, python-format msgid "fourth %(weekday)s" msgstr "vierten %(weekday)s" #: base.py:1127 #, python-format msgid "second last %(weekday)s" msgstr "vorletzten %(weekday)s" #: base.py:1128 #, python-format msgid "third last %(weekday)s" msgstr "drittletzten %(weekday)s" #: base.py:1132 msgid "second last" msgstr "vorletzten" #: base.py:1133 msgid "third last" msgstr "drittletzten" #: base.py:1134 msgid "fourth last" msgstr "viertletzten" #: base.py:1137 choices.py:17 msgid "Monday" msgstr "Montag" #: base.py:1137 choices.py:18 msgid "Tuesday" msgstr "Dienstag" #: base.py:1137 choices.py:19 msgid "Wednesday" msgstr "Mittwoch" #: base.py:1138 choices.py:20 msgid "Thursday" msgstr "Donnerstag" #: base.py:1138 choices.py:21 msgid "Friday" msgstr "Freitag" #: base.py:1138 choices.py:22 msgid "Saturday" msgstr "Samstag" #: base.py:1138 choices.py:23 msgid "Sunday" msgstr "Sonntag" #: base.py:1141 choices.py:27 msgid "January" msgstr "Januar" #: base.py:1141 choices.py:28 msgid "February" msgstr "Februar" #: base.py:1141 choices.py:29 msgid "March" msgstr "März" #: base.py:1141 choices.py:30 msgid "April" msgstr "April" #: base.py:1142 choices.py:32 msgid "June" msgstr "Juni" #: base.py:1142 choices.py:33 msgid "July" msgstr "Juli" #: base.py:1142 choices.py:34 msgid "August" msgstr "August" #: base.py:1143 choices.py:35 msgid "September" msgstr "September" #: base.py:1143 choices.py:36 msgid "October" msgstr "Oktober" #: base.py:1143 choices.py:37 msgid "November" msgstr "November" #: base.py:1143 choices.py:38 msgid "December" msgstr "Dezember" #: base.py:1161 base.py:1178 base.py:1189 base.py:1202 base.py:1220 msgid ", " msgstr "" #: base.py:1167 #, python-format msgid "every %(number)s %(freq)s" msgstr "alle %(number)s %(freq)s" #: base.py:1181 base.py:1205 #, python-format msgid "each %(items)s" msgstr "jeden %(items)s" #: base.py:1184 base.py:1193 base.py:1197 #, python-format msgid "on the %(items)s" msgstr "am %(items)s" #: base.py:1212 msgid "occuring once" msgstr "einmalig" #: base.py:1214 #, python-format msgid "occuring %(number)s times" msgstr "bis zum %(number)s. Mal" #: base.py:1217 #, python-format msgid "until %(date)s" msgstr "bis %(date)s" #: choices.py:7 msgid "Secondly" msgstr "Sekündlich" #: choices.py:8 msgid "Minutely" msgstr "Minütlich" #: choices.py:9 msgid "Hourly" msgstr "Stündlich" #: choices.py:10 msgid "Daily" msgstr "Täglich" #: choices.py:11 msgid "Weekly" msgstr "Wöchentlich" #: choices.py:12 msgid "Monthly" msgstr "Monatlich" #: choices.py:13 msgid "Yearly" msgstr "Jährlich" #: choices.py:31 msgid "May" msgstr "Mai" #: choices.py:44 msgid "Inclusion" msgstr "Einschließlich" #: choices.py:45 msgid "Exclusion" msgstr "Ohne" #: forms.py:72 msgid "Invalid frequency." msgstr "Ungültige Frequenz." #: forms.py:74 #, python-format msgid "Max rules exceeded. The limit is %(limit)s" msgstr "Maximale Anzahl an %(limit)s Regeln ist überschritten." #: forms.py:76 #, python-format msgid "Max exclusion rules exceeded. The limit is %(limit)s" msgstr "Maximale Anzahl an %(limit)s Ausschlussregeln ist überschritten." #: forms.py:78 #, python-format msgid "Max dates exceeded. The limit is %(limit)s" msgstr "Maximale Anzahl an %(limit)s Datumsangaben ist überschritten." #: forms.py:80 #, python-format msgid "Max exclusion dates exceeded. The limit is %(limit)s" msgstr "" "Maximale Anzahl an %(limit)s ausschließenden Datumsangaben ist überschritten." #~ msgid "year" #~ msgstr "Jahr" #~ msgid "month" #~ msgstr "Monat" #~ msgid "week" #~ msgstr "Woche" #~ msgid "day" #~ msgstr "Tag" #~ msgid "hour" #~ msgstr "Stunde" #~ msgid "minute" #~ msgstr "Minute" #~ msgid "second" #~ msgstr "Sekunde" ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/locale/de/LC_MESSAGES/djangojs.mo0000644000076500000240000001237700000000000024243 0ustar00aleksistaffzH I Y i r                  # , 1 7 P b f k t ~                    . 2 7 ? F M Z ^ g               " & 0 I R X k o t          #+1@HOTm  */6<A2Gz   )-37<CLRX\ajpu  7OSX` cm}     #<AT hu |    3@H \g ~   eG$ EbQ/LAx*r\ jom2hT0p^8_nvMf5zt3[& (YN#qa1"`gcH,F@9J!kliZ+V%Bw=O.4P)IXDy7 u'K>C]s-?UdR;:W6 <S1st %(weekday)s2nd %(weekday)s2nd last2nd last %(weekday)s3rd %(weekday)s3rd last3rd last %(weekday)s4th %(weekday)s4th lastAdd dateAdd ruleAprAprilAugAug.AugustCalendarDateDay of month%j%SDecDec.DecemberEachEveryExclude these occurencesExclude this dateFebFeb.FebruaryFrequencyFriFridayFriday first letterFJanJan.JanuaryJulJulyJunJuneMarMarchMonMondayMonday first letterMNovNov.NovemberOccurs %(number)s timeOccurs %(number)s timesOctOct.OctoberOn theRemoveRepeat untilSatSaturdaySaturday first letterSSepSept.SeptemberSunSundaySunday first letterSThuThursdayThursday first letterTTimeTueTuesdayTuesday first letterTUntilUntil date format%Y-%m-%dWedWednesdayWednesday first letterWannuallydailydate%l, %F %j, %Ydaydayseach %(items)severy %(number)s %(freq)sexcludingfirst %(weekday)sfourth %(weekday)sfourth lasthourhourlyhoursincludinglastlast %(weekday)smidnightminuteminutelyminutesmonthmonth nameMaymonthlymonthsnoonoccuring %(number)s timeoccuring %(number)s timeson the %(items)ssecondsecond %(weekday)ssecond lastsecond last %(weekday)ssecondlysecondsthird %(weekday)sthird lastthird last %(weekday)suntil %(date)sweekweeklyweeksyearyearsProject-Id-Version: Django Recurrence 1.4.1 Report-Msgid-Bugs-To: POT-Creation-Date: 2017-02-24 23:11+0100 PO-Revision-Date: 2017-02-24 23:10+0100 Last-Translator: Denis Anuschewski Language-Team: Language: German MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. %(weekday)s2. %(weekday)s2. letzten2. letzten %(weekday)s3. %(weekday)s3. letzten3. letzten %(weekday)s4. %(weekday)s4. letztenDatum hinzufügenRegel hinzufügenAprAprilAugAug.AugustKalenderDatum%j%S.DezDez.DezemberJedenAlleDiese Vorkommen ausschließenDieses Datum ausschließenFebFeb.FebruarFrequenzFrFreitagFJanJan.JanuarJulJuliJunJuniMrzMärzMoMontagMNovNov.NovemberBis zum %(number)s. MalBis zum %(number)s. MalOktOkt.OktoberAmEntfernenWiederholen bisSaSamstagSSepSept.SeptemberSoSonntagSDoDonnerstagDZeitDiDienstagDBis%d.%m.%YMiMittwochMjährlichtäglich%l, %j. %F %YTagTagejeden %(items)salle %(number)s %(freq)sohneersten %(weekday)svierten %(weekday)sviertletztenStundestündlichStundeneinschließendletztenletzten %(weekday)sMitternachtMinuteminütlichMinutenMonatMaimonatlichMonateMittagsbis zum %(number)s. Malbis zum %(number)s. Malam %(items)sSekundezweiten %(weekday)svorletztenvorletzten %(weekday)ssekündlichSekundendritten %(weekday)sdrittletztendrittletzten %(weekday)sbis %(date)sWochewöchentlichWochenJahrJahre././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/locale/de/LC_MESSAGES/djangojs.po0000644000076500000240000002600400000000000024236 0ustar00aleksistaff# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: Django Recurrence 1.4.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-24 23:11+0100\n" "PO-Revision-Date: 2017-02-24 23:10+0100\n" "Last-Translator: Denis Anuschewski\n" "Language-Team: \n" "Language: German\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: static/recurrence/js/recurrence-widget.js:1609 msgctxt "date" msgid "%l, %F %j, %Y" msgstr "%l, %j. %F %Y" #: static/recurrence/js/recurrence-widget.js:1774 msgid "including" msgstr "einschließend" #: static/recurrence/js/recurrence-widget.js:1774 msgid "excluding" msgstr "ohne" #: static/recurrence/js/recurrence-widget.js:1778 msgid "Frequency" msgstr "Frequenz" #: static/recurrence/js/recurrence-widget.js:1779 msgid "On the" msgstr "Am" #: static/recurrence/js/recurrence-widget.js:1780 msgid "Each" msgstr "Jeden" #: static/recurrence/js/recurrence-widget.js:1781 msgid "Every" msgstr "Alle" #: static/recurrence/js/recurrence-widget.js:1782 msgid "Until" msgstr "Bis" #: static/recurrence/js/recurrence-widget.js:1783 msgid "Occurs %(number)s time" msgstr "Bis zum %(number)s. Mal" #: static/recurrence/js/recurrence-widget.js:1784 msgid "Occurs %(number)s times" msgstr "Bis zum %(number)s. Mal" #: static/recurrence/js/recurrence-widget.js:1785 msgid "Date" msgstr "Datum" #: static/recurrence/js/recurrence-widget.js:1786 msgid "Time" msgstr "Zeit" #: static/recurrence/js/recurrence-widget.js:1787 msgid "Repeat until" msgstr "Wiederholen bis" #: static/recurrence/js/recurrence-widget.js:1788 msgid "Exclude these occurences" msgstr "Diese Vorkommen ausschließen" #: static/recurrence/js/recurrence-widget.js:1789 msgid "Exclude this date" msgstr "Dieses Datum ausschließen" #: static/recurrence/js/recurrence-widget.js:1790 msgid "Add rule" msgstr "Regel hinzufügen" #: static/recurrence/js/recurrence-widget.js:1791 msgid "Add date" msgstr "Datum hinzufügen" #: static/recurrence/js/recurrence-widget.js:1792 msgid "Remove" msgstr "Entfernen" #: static/recurrence/js/recurrence-widget.js:1793 msgid "Calendar" msgstr "Kalender" #: static/recurrence/js/recurrence.js:218 msgctxt "Until date format" msgid "%Y-%m-%d" msgstr "%d.%m.%Y" #: static/recurrence/js/recurrence.js:1017 msgid "midnight" msgstr "Mitternacht" #: static/recurrence/js/recurrence.js:1018 msgid "noon" msgstr "Mittags" #: static/recurrence/js/recurrence.js:1019 msgid "on the %(items)s" msgstr "am %(items)s" #: static/recurrence/js/recurrence.js:1020 msgid "every %(number)s %(freq)s" msgstr "alle %(number)s %(freq)s" #: static/recurrence/js/recurrence.js:1021 msgid "each %(items)s" msgstr "jeden %(items)s" #: static/recurrence/js/recurrence.js:1022 msgid "occuring %(number)s time" msgstr "bis zum %(number)s. Mal" #: static/recurrence/js/recurrence.js:1023 msgid "occuring %(number)s times" msgstr "bis zum %(number)s. Mal" #: static/recurrence/js/recurrence.js:1024 msgid "until %(date)s" msgstr "bis %(date)s" #: static/recurrence/js/recurrence.js:1028 msgid "year" msgstr "Jahr" #: static/recurrence/js/recurrence.js:1028 msgid "month" msgstr "Monat" #: static/recurrence/js/recurrence.js:1028 msgid "week" msgstr "Woche" #: static/recurrence/js/recurrence.js:1028 msgid "day" msgstr "Tag" #: static/recurrence/js/recurrence.js:1029 msgid "hour" msgstr "Stunde" #: static/recurrence/js/recurrence.js:1029 msgid "minute" msgstr "Minute" #: static/recurrence/js/recurrence.js:1029 msgid "second" msgstr "Sekunde" #: static/recurrence/js/recurrence.js:1032 msgid "years" msgstr "Jahre" #: static/recurrence/js/recurrence.js:1032 msgid "months" msgstr "Monate" #: static/recurrence/js/recurrence.js:1032 msgid "weeks" msgstr "Wochen" #: static/recurrence/js/recurrence.js:1032 msgid "days" msgstr "Tage" #: static/recurrence/js/recurrence.js:1033 msgid "hours" msgstr "Stunden" #: static/recurrence/js/recurrence.js:1033 msgid "minutes" msgstr "Minuten" #: static/recurrence/js/recurrence.js:1033 msgid "seconds" msgstr "Sekunden" #: static/recurrence/js/recurrence.js:1036 msgid "annually" msgstr "jährlich" #: static/recurrence/js/recurrence.js:1036 msgid "monthly" msgstr "monatlich" #: static/recurrence/js/recurrence.js:1036 msgid "weekly" msgstr "wöchentlich" #: static/recurrence/js/recurrence.js:1036 msgid "daily" msgstr "täglich" #: static/recurrence/js/recurrence.js:1037 msgid "hourly" msgstr "stündlich" #: static/recurrence/js/recurrence.js:1037 msgid "minutely" msgstr "minütlich" #: static/recurrence/js/recurrence.js:1037 msgid "secondly" msgstr "sekündlich" #: static/recurrence/js/recurrence.js:1040 msgid "Monday" msgstr "Montag" #: static/recurrence/js/recurrence.js:1040 msgid "Tuesday" msgstr "Dienstag" #: static/recurrence/js/recurrence.js:1040 msgid "Wednesday" msgstr "Mittwoch" #: static/recurrence/js/recurrence.js:1040 msgid "Thursday" msgstr "Donnerstag" #: static/recurrence/js/recurrence.js:1041 msgid "Friday" msgstr "Freitag" #: static/recurrence/js/recurrence.js:1041 msgid "Saturday" msgstr "Samstag" #: static/recurrence/js/recurrence.js:1041 msgid "Sunday" msgstr "Sonntag" #: static/recurrence/js/recurrence.js:1044 msgid "Mon" msgstr "Mo" #: static/recurrence/js/recurrence.js:1044 msgid "Tue" msgstr "Di" #: static/recurrence/js/recurrence.js:1044 msgid "Wed" msgstr "Mi" #: static/recurrence/js/recurrence.js:1044 msgid "Thu" msgstr "Do" #: static/recurrence/js/recurrence.js:1045 msgid "Fri" msgstr "Fr" #: static/recurrence/js/recurrence.js:1045 msgid "Sat" msgstr "Sa" #: static/recurrence/js/recurrence.js:1045 msgid "Sun" msgstr "So" #: static/recurrence/js/recurrence.js:1048 msgctxt "Monday first letter" msgid "M" msgstr "M" #: static/recurrence/js/recurrence.js:1049 msgctxt "Tuesday first letter" msgid "T" msgstr "D" #: static/recurrence/js/recurrence.js:1050 msgctxt "Wednesday first letter" msgid "W" msgstr "M" #: static/recurrence/js/recurrence.js:1051 msgctxt "Thursday first letter" msgid "T" msgstr "D" #: static/recurrence/js/recurrence.js:1052 msgctxt "Friday first letter" msgid "F" msgstr "F" #: static/recurrence/js/recurrence.js:1053 msgctxt "Saturday first letter" msgid "S" msgstr "S" #: static/recurrence/js/recurrence.js:1054 msgctxt "Sunday first letter" msgid "S" msgstr "S" #: static/recurrence/js/recurrence.js:1057 msgid "first %(weekday)s" msgstr "ersten %(weekday)s" #: static/recurrence/js/recurrence.js:1058 msgid "second %(weekday)s" msgstr "zweiten %(weekday)s" #: static/recurrence/js/recurrence.js:1059 msgid "third %(weekday)s" msgstr "dritten %(weekday)s" #: static/recurrence/js/recurrence.js:1060 msgid "fourth %(weekday)s" msgstr "vierten %(weekday)s" #: static/recurrence/js/recurrence.js:1061 #: static/recurrence/js/recurrence.js:1070 msgid "last %(weekday)s" msgstr "letzten %(weekday)s" #: static/recurrence/js/recurrence.js:1062 msgid "second last %(weekday)s" msgstr "vorletzten %(weekday)s" #: static/recurrence/js/recurrence.js:1063 msgid "third last %(weekday)s" msgstr "drittletzten %(weekday)s" #: static/recurrence/js/recurrence.js:1066 msgid "1st %(weekday)s" msgstr "1. %(weekday)s" #: static/recurrence/js/recurrence.js:1067 msgid "2nd %(weekday)s" msgstr "2. %(weekday)s" #: static/recurrence/js/recurrence.js:1068 msgid "3rd %(weekday)s" msgstr "3. %(weekday)s" #: static/recurrence/js/recurrence.js:1069 msgid "4th %(weekday)s" msgstr "4. %(weekday)s" #: static/recurrence/js/recurrence.js:1071 msgid "2nd last %(weekday)s" msgstr "2. letzten %(weekday)s" #: static/recurrence/js/recurrence.js:1072 msgid "3rd last %(weekday)s" msgstr "3. letzten %(weekday)s" #: static/recurrence/js/recurrence.js:1075 #: static/recurrence/js/recurrence.js:1081 msgid "last" msgstr "letzten" #: static/recurrence/js/recurrence.js:1076 msgid "second last" msgstr "vorletzten" #: static/recurrence/js/recurrence.js:1077 msgid "third last" msgstr "drittletzten" #: static/recurrence/js/recurrence.js:1078 msgid "fourth last" msgstr "viertletzten" #: static/recurrence/js/recurrence.js:1082 msgid "2nd last" msgstr "2. letzten" #: static/recurrence/js/recurrence.js:1083 msgid "3rd last" msgstr "3. letzten" #: static/recurrence/js/recurrence.js:1084 msgid "4th last" msgstr "4. letzten" #: static/recurrence/js/recurrence.js:1087 msgid "January" msgstr "Januar" #: static/recurrence/js/recurrence.js:1087 msgid "February" msgstr "Februar" #: static/recurrence/js/recurrence.js:1087 #: static/recurrence/js/recurrence.js:1099 msgid "March" msgstr "März" #: static/recurrence/js/recurrence.js:1088 #: static/recurrence/js/recurrence.js:1100 msgid "April" msgstr "April" #: static/recurrence/js/recurrence.js:1088 #: static/recurrence/js/recurrence.js:1094 #: static/recurrence/js/recurrence.js:1100 msgctxt "month name" msgid "May" msgstr "Mai" #: static/recurrence/js/recurrence.js:1088 #: static/recurrence/js/recurrence.js:1100 msgid "June" msgstr "Juni" #: static/recurrence/js/recurrence.js:1089 #: static/recurrence/js/recurrence.js:1101 msgid "July" msgstr "Juli" #: static/recurrence/js/recurrence.js:1089 msgid "August" msgstr "August" #: static/recurrence/js/recurrence.js:1089 msgid "September" msgstr "September" #: static/recurrence/js/recurrence.js:1090 msgid "October" msgstr "Oktober" #: static/recurrence/js/recurrence.js:1090 msgid "November" msgstr "November" #: static/recurrence/js/recurrence.js:1090 msgid "December" msgstr "Dezember" #: static/recurrence/js/recurrence.js:1093 msgid "Jan" msgstr "Jan" #: static/recurrence/js/recurrence.js:1093 msgid "Feb" msgstr "Feb" #: static/recurrence/js/recurrence.js:1093 msgid "Mar" msgstr "Mrz" #: static/recurrence/js/recurrence.js:1094 msgid "Apr" msgstr "Apr" #: static/recurrence/js/recurrence.js:1094 msgid "Jun" msgstr "Jun" #: static/recurrence/js/recurrence.js:1095 msgid "Jul" msgstr "Jul" #: static/recurrence/js/recurrence.js:1095 msgid "Aug" msgstr "Aug" #: static/recurrence/js/recurrence.js:1095 msgid "Sep" msgstr "Sep" #: static/recurrence/js/recurrence.js:1096 msgid "Oct" msgstr "Okt" #: static/recurrence/js/recurrence.js:1096 msgid "Nov" msgstr "Nov" #: static/recurrence/js/recurrence.js:1096 msgid "Dec" msgstr "Dez" #: static/recurrence/js/recurrence.js:1099 msgid "Jan." msgstr "Jan." #: static/recurrence/js/recurrence.js:1099 msgid "Feb." msgstr "Feb." #: static/recurrence/js/recurrence.js:1101 msgid "Aug." msgstr "Aug." #: static/recurrence/js/recurrence.js:1101 msgid "Sept." msgstr "Sept." #: static/recurrence/js/recurrence.js:1102 msgid "Oct." msgstr "Okt." #: static/recurrence/js/recurrence.js:1102 msgid "Nov." msgstr "Nov." #: static/recurrence/js/recurrence.js:1102 msgid "Dec." msgstr "Dez." #: static/recurrence/js/recurrence.js:1105 msgid "a.m." msgstr "" #: static/recurrence/js/recurrence.js:1105 msgid "p.m." msgstr "" #: static/recurrence/js/recurrence.js:1106 msgid "AM" msgstr "" #: static/recurrence/js/recurrence.js:1106 msgid "PM" msgstr "" #: static/recurrence/js/recurrence.js:1108 msgctxt "Day of month" msgid "%j%S" msgstr "%j%S." #~ msgid "last day" #~ msgstr "letzten Tag" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1643105481.2641544 django-recurrence-1.11.1/recurrence/locale/en/0000755000076500000240000000000000000000000020322 5ustar00aleksistaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1643105481.2909918 django-recurrence-1.11.1/recurrence/locale/en/LC_MESSAGES/0000755000076500000240000000000000000000000022107 5ustar00aleksistaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/locale/en/LC_MESSAGES/django.mo0000644000076500000240000000057200000000000023712 0ustar00aleksistaff$,8@9Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-02-24 23:21+0100 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: FULL NAME Language-Team: LANGUAGE Language: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/locale/en/LC_MESSAGES/django.po0000644000076500000240000001260000000000000023710 0ustar00aleksistaff# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-24 23:21+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: base.py:1087 msgid "annually" msgstr "" #: base.py:1087 msgid "monthly" msgstr "" #: base.py:1087 msgid "weekly" msgstr "" #: base.py:1087 msgid "daily" msgstr "" #: base.py:1088 msgid "hourly" msgstr "" #: base.py:1088 msgid "minutely" msgstr "" #: base.py:1088 msgid "secondly" msgstr "" #: base.py:1091 msgid "years" msgstr "" #: base.py:1091 msgid "months" msgstr "" #: base.py:1091 msgid "weeks" msgstr "" #: base.py:1091 msgid "days" msgstr "" #: base.py:1092 msgid "hours" msgstr "" #: base.py:1092 msgid "minutes" msgstr "" #: base.py:1092 msgid "seconds" msgstr "" #: base.py:1097 #, python-format msgid "1st %(weekday)s" msgstr "" #: base.py:1098 #, python-format msgid "2nd %(weekday)s" msgstr "" #: base.py:1099 #, python-format msgid "3rd %(weekday)s" msgstr "" #: base.py:1100 base.py:1126 #, python-format msgid "last %(weekday)s" msgstr "" #: base.py:1101 #, python-format msgid "2nd last %(weekday)s" msgstr "" #: base.py:1102 #, python-format msgid "3rd last %(weekday)s" msgstr "" #: base.py:1105 base.py:1131 msgid "last" msgstr "" #: base.py:1106 msgid "2nd last" msgstr "" #: base.py:1107 msgid "3rd last" msgstr "" #: base.py:1108 msgid "4th last" msgstr "" #: base.py:1111 msgid "Mon" msgstr "" #: base.py:1111 msgid "Tue" msgstr "" #: base.py:1111 msgid "Wed" msgstr "" #: base.py:1112 msgid "Thu" msgstr "" #: base.py:1112 msgid "Fri" msgstr "" #: base.py:1112 msgid "Sat" msgstr "" #: base.py:1112 msgid "Sun" msgstr "" #: base.py:1115 msgid "Jan" msgstr "" #: base.py:1115 msgid "Feb" msgstr "" #: base.py:1115 msgid "Mar" msgstr "" #: base.py:1115 msgid "Apr" msgstr "" #: base.py:1116 msgid "Jun" msgstr "" #: base.py:1116 msgid "Jul" msgstr "" #: base.py:1116 msgid "Aug" msgstr "" #: base.py:1117 msgid "Sep" msgstr "" #: base.py:1117 msgid "Oct" msgstr "" #: base.py:1117 msgid "Nov" msgstr "" #: base.py:1117 msgid "Dec" msgstr "" #: base.py:1122 #, python-format msgid "first %(weekday)s" msgstr "" #: base.py:1123 #, python-format msgid "second %(weekday)s" msgstr "" #: base.py:1124 #, python-format msgid "third %(weekday)s" msgstr "" #: base.py:1125 #, python-format msgid "fourth %(weekday)s" msgstr "" #: base.py:1127 #, python-format msgid "second last %(weekday)s" msgstr "" #: base.py:1128 #, python-format msgid "third last %(weekday)s" msgstr "" #: base.py:1132 msgid "second last" msgstr "" #: base.py:1133 msgid "third last" msgstr "" #: base.py:1134 msgid "fourth last" msgstr "" #: base.py:1137 choices.py:17 msgid "Monday" msgstr "" #: base.py:1137 choices.py:18 msgid "Tuesday" msgstr "" #: base.py:1137 choices.py:19 msgid "Wednesday" msgstr "" #: base.py:1138 choices.py:20 msgid "Thursday" msgstr "" #: base.py:1138 choices.py:21 msgid "Friday" msgstr "" #: base.py:1138 choices.py:22 msgid "Saturday" msgstr "" #: base.py:1138 choices.py:23 msgid "Sunday" msgstr "" #: base.py:1141 choices.py:27 msgid "January" msgstr "" #: base.py:1141 choices.py:28 msgid "February" msgstr "" #: base.py:1141 choices.py:29 msgid "March" msgstr "" #: base.py:1141 choices.py:30 msgid "April" msgstr "" #: base.py:1142 choices.py:32 msgid "June" msgstr "" #: base.py:1142 choices.py:33 msgid "July" msgstr "" #: base.py:1142 choices.py:34 msgid "August" msgstr "" #: base.py:1143 choices.py:35 msgid "September" msgstr "" #: base.py:1143 choices.py:36 msgid "October" msgstr "" #: base.py:1143 choices.py:37 msgid "November" msgstr "" #: base.py:1143 choices.py:38 msgid "December" msgstr "" #: base.py:1161 base.py:1178 base.py:1189 base.py:1202 base.py:1220 msgid ", " msgstr "" #: base.py:1167 #, python-format msgid "every %(number)s %(freq)s" msgstr "" #: base.py:1181 base.py:1205 #, python-format msgid "each %(items)s" msgstr "" #: base.py:1184 base.py:1193 base.py:1197 #, python-format msgid "on the %(items)s" msgstr "" #: base.py:1212 msgid "occuring once" msgstr "" #: base.py:1214 #, python-format msgid "occuring %(number)s times" msgstr "" #: base.py:1217 #, python-format msgid "until %(date)s" msgstr "" #: choices.py:7 msgid "Secondly" msgstr "" #: choices.py:8 msgid "Minutely" msgstr "" #: choices.py:9 msgid "Hourly" msgstr "" #: choices.py:10 msgid "Daily" msgstr "" #: choices.py:11 msgid "Weekly" msgstr "" #: choices.py:12 msgid "Monthly" msgstr "" #: choices.py:13 msgid "Yearly" msgstr "" #: choices.py:31 msgid "May" msgstr "" #: choices.py:44 msgid "Inclusion" msgstr "" #: choices.py:45 msgid "Exclusion" msgstr "" #: forms.py:72 msgid "Invalid frequency." msgstr "" #: forms.py:74 #, python-format msgid "Max rules exceeded. The limit is %(limit)s" msgstr "" #: forms.py:76 #, python-format msgid "Max exclusion rules exceeded. The limit is %(limit)s" msgstr "" #: forms.py:78 #, python-format msgid "Max dates exceeded. The limit is %(limit)s" msgstr "" #: forms.py:80 #, python-format msgid "Max exclusion dates exceeded. The limit is %(limit)s" msgstr "" ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/locale/en/LC_MESSAGES/djangojs.mo0000644000076500000240000000057200000000000024247 0ustar00aleksistaff$,8@9Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-02-24 23:11+0100 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: FULL NAME Language-Team: LANGUAGE Language: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/locale/en/LC_MESSAGES/djangojs.po0000644000076500000240000002374200000000000024256 0ustar00aleksistaff# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-24 23:11+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: static/recurrence/js/recurrence-widget.js:1609 msgctxt "date" msgid "%l, %F %j, %Y" msgstr "" #: static/recurrence/js/recurrence-widget.js:1774 msgid "including" msgstr "" #: static/recurrence/js/recurrence-widget.js:1774 msgid "excluding" msgstr "" #: static/recurrence/js/recurrence-widget.js:1778 msgid "Frequency" msgstr "" #: static/recurrence/js/recurrence-widget.js:1779 msgid "On the" msgstr "" #: static/recurrence/js/recurrence-widget.js:1780 msgid "Each" msgstr "" #: static/recurrence/js/recurrence-widget.js:1781 msgid "Every" msgstr "" #: static/recurrence/js/recurrence-widget.js:1782 msgid "Until" msgstr "" #: static/recurrence/js/recurrence-widget.js:1783 msgid "Occurs %(number)s time" msgstr "" #: static/recurrence/js/recurrence-widget.js:1784 msgid "Occurs %(number)s times" msgstr "" #: static/recurrence/js/recurrence-widget.js:1785 msgid "Date" msgstr "" #: static/recurrence/js/recurrence-widget.js:1786 msgid "Time" msgstr "" #: static/recurrence/js/recurrence-widget.js:1787 msgid "Repeat until" msgstr "" #: static/recurrence/js/recurrence-widget.js:1788 msgid "Exclude these occurences" msgstr "" #: static/recurrence/js/recurrence-widget.js:1789 msgid "Exclude this date" msgstr "" #: static/recurrence/js/recurrence-widget.js:1790 msgid "Add rule" msgstr "" #: static/recurrence/js/recurrence-widget.js:1791 msgid "Add date" msgstr "" #: static/recurrence/js/recurrence-widget.js:1792 msgid "Remove" msgstr "" #: static/recurrence/js/recurrence-widget.js:1793 msgid "Calendar" msgstr "" #: static/recurrence/js/recurrence.js:218 msgctxt "Until date format" msgid "%Y-%m-%d" msgstr "" #: static/recurrence/js/recurrence.js:1017 msgid "midnight" msgstr "" #: static/recurrence/js/recurrence.js:1018 msgid "noon" msgstr "" #: static/recurrence/js/recurrence.js:1019 msgid "on the %(items)s" msgstr "" #: static/recurrence/js/recurrence.js:1020 msgid "every %(number)s %(freq)s" msgstr "" #: static/recurrence/js/recurrence.js:1021 msgid "each %(items)s" msgstr "" #: static/recurrence/js/recurrence.js:1022 msgid "occuring %(number)s time" msgstr "" #: static/recurrence/js/recurrence.js:1023 msgid "occuring %(number)s times" msgstr "" #: static/recurrence/js/recurrence.js:1024 msgid "until %(date)s" msgstr "" #: static/recurrence/js/recurrence.js:1028 msgid "year" msgstr "" #: static/recurrence/js/recurrence.js:1028 msgid "month" msgstr "" #: static/recurrence/js/recurrence.js:1028 msgid "week" msgstr "" #: static/recurrence/js/recurrence.js:1028 msgid "day" msgstr "" #: static/recurrence/js/recurrence.js:1029 msgid "hour" msgstr "" #: static/recurrence/js/recurrence.js:1029 msgid "minute" msgstr "" #: static/recurrence/js/recurrence.js:1029 msgid "second" msgstr "" #: static/recurrence/js/recurrence.js:1032 msgid "years" msgstr "" #: static/recurrence/js/recurrence.js:1032 msgid "months" msgstr "" #: static/recurrence/js/recurrence.js:1032 msgid "weeks" msgstr "" #: static/recurrence/js/recurrence.js:1032 msgid "days" msgstr "" #: static/recurrence/js/recurrence.js:1033 msgid "hours" msgstr "" #: static/recurrence/js/recurrence.js:1033 msgid "minutes" msgstr "" #: static/recurrence/js/recurrence.js:1033 msgid "seconds" msgstr "" #: static/recurrence/js/recurrence.js:1036 msgid "annually" msgstr "" #: static/recurrence/js/recurrence.js:1036 msgid "monthly" msgstr "" #: static/recurrence/js/recurrence.js:1036 msgid "weekly" msgstr "" #: static/recurrence/js/recurrence.js:1036 msgid "daily" msgstr "" #: static/recurrence/js/recurrence.js:1037 msgid "hourly" msgstr "" #: static/recurrence/js/recurrence.js:1037 msgid "minutely" msgstr "" #: static/recurrence/js/recurrence.js:1037 msgid "secondly" msgstr "" #: static/recurrence/js/recurrence.js:1040 msgid "Monday" msgstr "" #: static/recurrence/js/recurrence.js:1040 msgid "Tuesday" msgstr "" #: static/recurrence/js/recurrence.js:1040 msgid "Wednesday" msgstr "" #: static/recurrence/js/recurrence.js:1040 msgid "Thursday" msgstr "" #: static/recurrence/js/recurrence.js:1041 msgid "Friday" msgstr "" #: static/recurrence/js/recurrence.js:1041 msgid "Saturday" msgstr "" #: static/recurrence/js/recurrence.js:1041 msgid "Sunday" msgstr "" #: static/recurrence/js/recurrence.js:1044 msgid "Mon" msgstr "" #: static/recurrence/js/recurrence.js:1044 msgid "Tue" msgstr "" #: static/recurrence/js/recurrence.js:1044 msgid "Wed" msgstr "" #: static/recurrence/js/recurrence.js:1044 msgid "Thu" msgstr "" #: static/recurrence/js/recurrence.js:1045 msgid "Fri" msgstr "" #: static/recurrence/js/recurrence.js:1045 msgid "Sat" msgstr "" #: static/recurrence/js/recurrence.js:1045 msgid "Sun" msgstr "" #: static/recurrence/js/recurrence.js:1048 msgctxt "Monday first letter" msgid "M" msgstr "" #: static/recurrence/js/recurrence.js:1049 msgctxt "Tuesday first letter" msgid "T" msgstr "" #: static/recurrence/js/recurrence.js:1050 msgctxt "Wednesday first letter" msgid "W" msgstr "" #: static/recurrence/js/recurrence.js:1051 msgctxt "Thursday first letter" msgid "T" msgstr "" #: static/recurrence/js/recurrence.js:1052 msgctxt "Friday first letter" msgid "F" msgstr "" #: static/recurrence/js/recurrence.js:1053 msgctxt "Saturday first letter" msgid "S" msgstr "" #: static/recurrence/js/recurrence.js:1054 msgctxt "Sunday first letter" msgid "S" msgstr "" #: static/recurrence/js/recurrence.js:1057 msgid "first %(weekday)s" msgstr "" #: static/recurrence/js/recurrence.js:1058 msgid "second %(weekday)s" msgstr "" #: static/recurrence/js/recurrence.js:1059 msgid "third %(weekday)s" msgstr "" #: static/recurrence/js/recurrence.js:1060 msgid "fourth %(weekday)s" msgstr "" #: static/recurrence/js/recurrence.js:1061 #: static/recurrence/js/recurrence.js:1070 msgid "last %(weekday)s" msgstr "" #: static/recurrence/js/recurrence.js:1062 msgid "second last %(weekday)s" msgstr "" #: static/recurrence/js/recurrence.js:1063 msgid "third last %(weekday)s" msgstr "" #: static/recurrence/js/recurrence.js:1066 msgid "1st %(weekday)s" msgstr "" #: static/recurrence/js/recurrence.js:1067 msgid "2nd %(weekday)s" msgstr "" #: static/recurrence/js/recurrence.js:1068 msgid "3rd %(weekday)s" msgstr "" #: static/recurrence/js/recurrence.js:1069 msgid "4th %(weekday)s" msgstr "" #: static/recurrence/js/recurrence.js:1071 msgid "2nd last %(weekday)s" msgstr "" #: static/recurrence/js/recurrence.js:1072 msgid "3rd last %(weekday)s" msgstr "" #: static/recurrence/js/recurrence.js:1075 #: static/recurrence/js/recurrence.js:1081 msgid "last" msgstr "" #: static/recurrence/js/recurrence.js:1076 msgid "second last" msgstr "" #: static/recurrence/js/recurrence.js:1077 msgid "third last" msgstr "" #: static/recurrence/js/recurrence.js:1078 msgid "fourth last" msgstr "" #: static/recurrence/js/recurrence.js:1082 msgid "2nd last" msgstr "" #: static/recurrence/js/recurrence.js:1083 msgid "3rd last" msgstr "" #: static/recurrence/js/recurrence.js:1084 msgid "4th last" msgstr "" #: static/recurrence/js/recurrence.js:1087 msgid "January" msgstr "" #: static/recurrence/js/recurrence.js:1087 msgid "February" msgstr "" #: static/recurrence/js/recurrence.js:1087 #: static/recurrence/js/recurrence.js:1099 msgid "March" msgstr "" #: static/recurrence/js/recurrence.js:1088 #: static/recurrence/js/recurrence.js:1100 msgid "April" msgstr "" #: static/recurrence/js/recurrence.js:1088 #: static/recurrence/js/recurrence.js:1094 #: static/recurrence/js/recurrence.js:1100 msgctxt "month name" msgid "May" msgstr "" #: static/recurrence/js/recurrence.js:1088 #: static/recurrence/js/recurrence.js:1100 msgid "June" msgstr "" #: static/recurrence/js/recurrence.js:1089 #: static/recurrence/js/recurrence.js:1101 msgid "July" msgstr "" #: static/recurrence/js/recurrence.js:1089 msgid "August" msgstr "" #: static/recurrence/js/recurrence.js:1089 msgid "September" msgstr "" #: static/recurrence/js/recurrence.js:1090 msgid "October" msgstr "" #: static/recurrence/js/recurrence.js:1090 msgid "November" msgstr "" #: static/recurrence/js/recurrence.js:1090 msgid "December" msgstr "" #: static/recurrence/js/recurrence.js:1093 msgid "Jan" msgstr "" #: static/recurrence/js/recurrence.js:1093 msgid "Feb" msgstr "" #: static/recurrence/js/recurrence.js:1093 msgid "Mar" msgstr "" #: static/recurrence/js/recurrence.js:1094 msgid "Apr" msgstr "" #: static/recurrence/js/recurrence.js:1094 msgid "Jun" msgstr "" #: static/recurrence/js/recurrence.js:1095 msgid "Jul" msgstr "" #: static/recurrence/js/recurrence.js:1095 msgid "Aug" msgstr "" #: static/recurrence/js/recurrence.js:1095 msgid "Sep" msgstr "" #: static/recurrence/js/recurrence.js:1096 msgid "Oct" msgstr "" #: static/recurrence/js/recurrence.js:1096 msgid "Nov" msgstr "" #: static/recurrence/js/recurrence.js:1096 msgid "Dec" msgstr "" #: static/recurrence/js/recurrence.js:1099 msgid "Jan." msgstr "" #: static/recurrence/js/recurrence.js:1099 msgid "Feb." msgstr "" #: static/recurrence/js/recurrence.js:1101 msgid "Aug." msgstr "" #: static/recurrence/js/recurrence.js:1101 msgid "Sept." msgstr "" #: static/recurrence/js/recurrence.js:1102 msgid "Oct." msgstr "" #: static/recurrence/js/recurrence.js:1102 msgid "Nov." msgstr "" #: static/recurrence/js/recurrence.js:1102 msgid "Dec." msgstr "" #: static/recurrence/js/recurrence.js:1105 msgid "a.m." msgstr "" #: static/recurrence/js/recurrence.js:1105 msgid "p.m." msgstr "" #: static/recurrence/js/recurrence.js:1106 msgid "AM" msgstr "" #: static/recurrence/js/recurrence.js:1106 msgid "PM" msgstr "" #: static/recurrence/js/recurrence.js:1108 msgctxt "Day of month" msgid "%j%S" msgstr "" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1643105481.2643867 django-recurrence-1.11.1/recurrence/locale/es/0000755000076500000240000000000000000000000020327 5ustar00aleksistaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1643105481.2919824 django-recurrence-1.11.1/recurrence/locale/es/LC_MESSAGES/0000755000076500000240000000000000000000000022114 5ustar00aleksistaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/locale/es/LC_MESSAGES/django.mo0000644000076500000240000001067100000000000023720 0ustar00aleksistaff\*3HQU[_flp y *4 4G *|                    ( , 6 = D M S X g              . A M e n v      ` - 0 @ P \ t             .28<BFLP;VBB<U Yei o|       +DWj y     ;HQet T* S(DA Q\ >NBO"#9 J6KY&H35/MR$.1EZ; @'C-V<GL2 F4)[?X=W870:U,+%!IP, 1st %(weekday)s2nd %(weekday)s2nd last2nd last %(weekday)s3rd %(weekday)s3rd last3rd last %(weekday)s4th lastAprAprilAugAugustDailyDecDecemberExclusionFebFebruaryFriFridayHourlyInclusionInvalid frequency.JanJanuaryJulJulyJunJuneMarMarchMax dates exceeded. The limit is %(limit)sMax exclusion dates exceeded. The limit is %(limit)sMax exclusion rules exceeded. The limit is %(limit)sMax rules exceeded. The limit is %(limit)sMayMinutelyMonMondayMonthlyNovNovemberOctOctoberSatSaturdaySecondlySepSeptemberSunSundayThuThursdayTueTuesdayWedWednesdayWeeklyYearlyannuallydailydayseach %(items)severy %(number)s %(freq)sfirst %(weekday)sfourth %(weekday)sfourth lasthourlyhourslastlast %(weekday)sminutelyminutesmonthlymonthsoccuring %(number)s timesoccuring onceon the %(items)ssecond %(weekday)ssecond lastsecond last %(weekday)ssecondlysecondsthird %(weekday)sthird lastthird last %(weekday)suntil %(date)sweeklyweeksyearsProject-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-02-24 23:21+0100 PO-Revision-Date: 2017-02-24 23:22+0100 Last-Translator: FULL NAME Language-Team: LANGUAGE Language: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Gtranslator 2.91.7 , 1º %(weekday)s2º %(weekday)s2º último2º último %(weekday)s3º %(weekday)s3º último3º último %(weekday)s4º últimoAbrAbrilAgoAgostoA diarioDicDiciembreExclusiónFebFebreroVieViernesCada horaInclusiónFrecuencia incorrectaEneEneroJulJulioJunJunioMarMarzoNúmero máximo de fecha excedidas. El límite es %(limit)sMáximo de fechas de exclusión excedidas. El límite es %(limit)sMáximo de reglas de exclusión excedidas. El límite es %(limit)sNúmero máximo de reglas excedidas. El límite es %(limit)sMayCada minutoLunLunesMensualmenteNovNoviembre OctOctubreSabSábadoCada segundoSepSeptiembreDomDomingoJueJuevesMarMartesMierMiércolesSemanalmenteAnualmenteanualmenteddíascada %(items)scada %(number)s %(freq)sprimer %(weekday)scuarto %(weekday)scuarto últimocada horahorasúltimoúltimo %(weekday)scada minutominutosmensualmentemesesocurre %(number)s vecesocurre una vezel %(items)ssegundo %(weekday)spenúltimosegundo último %(weekday)scada segundosegundostercero %(weekday)santepenúltimotercer último %(weekday)shasta %(date)ssemanalmentesemanasaños././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/locale/es/LC_MESSAGES/django.po0000644000076500000240000001534700000000000023730 0ustar00aleksistaff# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # FULL NAME , 2015. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-24 23:21+0100\n" "PO-Revision-Date: 2017-02-24 23:22+0100\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Gtranslator 2.91.7\n" #: base.py:1087 msgid "annually" msgstr "anualmente" #: base.py:1087 msgid "monthly" msgstr "mensualmente" #: base.py:1087 msgid "weekly" msgstr "semanalmente" #: base.py:1087 msgid "daily" msgstr "d" #: base.py:1088 msgid "hourly" msgstr "cada hora" #: base.py:1088 msgid "minutely" msgstr "cada minuto" #: base.py:1088 msgid "secondly" msgstr "cada segundo" #: base.py:1091 msgid "years" msgstr "años" #: base.py:1091 msgid "months" msgstr "meses" #: base.py:1091 msgid "weeks" msgstr "semanas" #: base.py:1091 msgid "days" msgstr "días" #: base.py:1092 msgid "hours" msgstr "horas" #: base.py:1092 msgid "minutes" msgstr "minutos" #: base.py:1092 msgid "seconds" msgstr "segundos" #: base.py:1097 #, python-format msgid "1st %(weekday)s" msgstr "1º %(weekday)s" #: base.py:1098 #, python-format msgid "2nd %(weekday)s" msgstr "2º %(weekday)s" #: base.py:1099 #, python-format msgid "3rd %(weekday)s" msgstr "3º %(weekday)s" #: base.py:1100 base.py:1126 #, python-format msgid "last %(weekday)s" msgstr "último %(weekday)s" #: base.py:1101 #, python-format msgid "2nd last %(weekday)s" msgstr "2º último %(weekday)s" #: base.py:1102 #, python-format msgid "3rd last %(weekday)s" msgstr "3º último %(weekday)s" #: base.py:1105 base.py:1131 msgid "last" msgstr "último" #: base.py:1106 msgid "2nd last" msgstr "2º último" #: base.py:1107 msgid "3rd last" msgstr "3º último" #: base.py:1108 msgid "4th last" msgstr "4º último" #: base.py:1111 msgid "Mon" msgstr "Lun" #: base.py:1111 msgid "Tue" msgstr "Mar" #: base.py:1111 msgid "Wed" msgstr "Mier" #: base.py:1112 msgid "Thu" msgstr "Jue" #: base.py:1112 msgid "Fri" msgstr "Vie" #: base.py:1112 msgid "Sat" msgstr "Sab" #: base.py:1112 msgid "Sun" msgstr "Dom" #: base.py:1115 msgid "Jan" msgstr "Ene" #: base.py:1115 msgid "Feb" msgstr "Feb" #: base.py:1115 msgid "Mar" msgstr "Mar" #: base.py:1115 msgid "Apr" msgstr "Abr" #: base.py:1116 msgid "Jun" msgstr "Jun" #: base.py:1116 msgid "Jul" msgstr "Jul" #: base.py:1116 msgid "Aug" msgstr "Ago" #: base.py:1117 msgid "Sep" msgstr "Sep" #: base.py:1117 msgid "Oct" msgstr "Oct" #: base.py:1117 msgid "Nov" msgstr "Nov" #: base.py:1117 msgid "Dec" msgstr "Dic" #: base.py:1122 #, python-format msgid "first %(weekday)s" msgstr "primer %(weekday)s" #: base.py:1123 #, python-format msgid "second %(weekday)s" msgstr "segundo %(weekday)s" #: base.py:1124 #, python-format msgid "third %(weekday)s" msgstr "tercero %(weekday)s" #: base.py:1125 #, python-format msgid "fourth %(weekday)s" msgstr "cuarto %(weekday)s" #: base.py:1127 #, python-format msgid "second last %(weekday)s" msgstr "segundo último %(weekday)s" #: base.py:1128 #, python-format msgid "third last %(weekday)s" msgstr "tercer último %(weekday)s" #: base.py:1132 msgid "second last" msgstr "penúltimo" #: base.py:1133 msgid "third last" msgstr "antepenúltimo" #: base.py:1134 msgid "fourth last" msgstr "cuarto último" #: base.py:1137 choices.py:17 msgid "Monday" msgstr "Lunes" #: base.py:1137 choices.py:18 msgid "Tuesday" msgstr "Martes" #: base.py:1137 choices.py:19 msgid "Wednesday" msgstr "Miércoles" #: base.py:1138 choices.py:20 msgid "Thursday" msgstr "Jueves" #: base.py:1138 choices.py:21 msgid "Friday" msgstr "Viernes" #: base.py:1138 choices.py:22 msgid "Saturday" msgstr "Sábado" #: base.py:1138 choices.py:23 msgid "Sunday" msgstr "Domingo" #: base.py:1141 choices.py:27 msgid "January" msgstr "Enero" #: base.py:1141 choices.py:28 msgid "February" msgstr "Febrero" #: base.py:1141 choices.py:29 msgid "March" msgstr "Marzo" #: base.py:1141 choices.py:30 msgid "April" msgstr "Abril" #: base.py:1142 choices.py:32 msgid "June" msgstr "Junio" #: base.py:1142 choices.py:33 msgid "July" msgstr "Julio" #: base.py:1142 choices.py:34 msgid "August" msgstr "Agosto" #: base.py:1143 choices.py:35 msgid "September" msgstr "Septiembre" #: base.py:1143 choices.py:36 msgid "October" msgstr "Octubre" #: base.py:1143 choices.py:37 msgid "November" msgstr "Noviembre " #: base.py:1143 choices.py:38 msgid "December" msgstr "Diciembre" #: base.py:1161 base.py:1178 base.py:1189 base.py:1202 base.py:1220 msgid ", " msgstr ", " #: base.py:1167 #, python-format msgid "every %(number)s %(freq)s" msgstr "cada %(number)s %(freq)s" #: base.py:1181 base.py:1205 #, python-format msgid "each %(items)s" msgstr "cada %(items)s" #: base.py:1184 base.py:1193 base.py:1197 #, python-format msgid "on the %(items)s" msgstr "el %(items)s" #: base.py:1212 msgid "occuring once" msgstr "ocurre una vez" #: base.py:1214 #, python-format msgid "occuring %(number)s times" msgstr "ocurre %(number)s veces" #: base.py:1217 #, python-format msgid "until %(date)s" msgstr "hasta %(date)s" #: choices.py:7 msgid "Secondly" msgstr "Cada segundo" #: choices.py:8 msgid "Minutely" msgstr "Cada minuto" #: choices.py:9 msgid "Hourly" msgstr "Cada hora" #: choices.py:10 msgid "Daily" msgstr "A diario" #: choices.py:11 msgid "Weekly" msgstr "Semanalmente" #: choices.py:12 msgid "Monthly" msgstr "Mensualmente" #: choices.py:13 msgid "Yearly" msgstr "Anualmente" #: choices.py:31 msgid "May" msgstr "May" #: choices.py:44 msgid "Inclusion" msgstr "Inclusión" #: choices.py:45 msgid "Exclusion" msgstr "Exclusión" #: forms.py:72 msgid "Invalid frequency." msgstr "Frecuencia incorrecta" #: forms.py:74 #, python-format msgid "Max rules exceeded. The limit is %(limit)s" msgstr "Número máximo de reglas excedidas. El límite es %(limit)s" #: forms.py:76 #, python-format msgid "Max exclusion rules exceeded. The limit is %(limit)s" msgstr "Máximo de reglas de exclusión excedidas. El límite es %(limit)s" #: forms.py:78 #, python-format msgid "Max dates exceeded. The limit is %(limit)s" msgstr "Número máximo de fecha excedidas. El límite es %(limit)s" #: forms.py:80 #, python-format msgid "Max exclusion dates exceeded. The limit is %(limit)s" msgstr "Máximo de fechas de exclusión excedidas. El límite es %(limit)s" #~ msgid "year" #~ msgstr "año" #~ msgid "month" #~ msgstr "mes" #~ msgid "week" #~ msgstr "semana" #~ msgid "day" #~ msgstr "día" #~ msgid "hour" #~ msgstr "hora" #~ msgid "minute" #~ msgstr "minuto" #~ msgid "second" #~ msgstr "segundo" ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/locale/es/LC_MESSAGES/djangojs.mo0000644000076500000240000001154700000000000024260 0ustar00aleksistaffl|0 1 A Q Z o                    & 8 A K O V l p u }               . 8 < C Y ] f ~               0 C O T [ a k p               ) 5 M V ^ p {       h '7 GSk {     9L T_ckmqv|    &(-18:@ DO Q \hms   &2;? DQ Wbu   1@ GT\aHDc9"`XGQ+25 !Mga\SC^Z7 fP%/RT=e(Y1*,$ dVF>-) U8;0_['ljLNA#EO6kW Kihb .I<3@4B:&J]?1st %(weekday)s2nd %(weekday)s2nd last2nd last %(weekday)s3rd %(weekday)s3rd last3rd last %(weekday)s4th %(weekday)s4th lastAdd dateAdd ruleAprAprilAugAug.AugustCalendarDateDecDec.DecemberEachEveryExclude these occurencesExclude this dateFebruaryFrequencyFriFridayFriday first letterFJanJan.JanuaryJulyJuneMarchMonMondayMonday first letterMNovemberOccurs %(number)s timeOccurs %(number)s timesOctoberOn theRemoveRepeat untilSatSaturdaySaturday first letterSSeptemberSunSundaySunday first letterSThuThursdayThursday first letterTTimeTueTuesdayTuesday first letterTUntilWedWednesdayWednesday first letterWannuallydailydaydayseach %(items)severy %(number)s %(freq)sexcludingfirst %(weekday)sfourth %(weekday)sfourth lasthourhourlyhoursincludinglastlast %(weekday)smidnightminuteminutelyminutesmonthmonth nameMaymonthlymonthsnoonoccuring %(number)s timeoccuring %(number)s timeson the %(items)ssecondsecond %(weekday)ssecond lastsecond last %(weekday)ssecondlysecondsthird %(weekday)sthird lastthird last %(weekday)suntil %(date)sweekweeklyweeksyearyearsProject-Id-Version: Django Recurrence 1.4.1 Report-Msgid-Bugs-To: POT-Creation-Date: 2017-02-24 23:11+0100 PO-Revision-Date: 2017-02-24 23:15+0100 Last-Translator: FULL NAME Language-Team: LANGUAGE Language: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Gtranslator 2.91.7 1º %(weekday)s2º %(weekday)s2º último2º último %(weekday)s3º %(weekday)s3º último3º último %(weekday)s4º %(weekday)s4º últimoAñadir fechaAñadir reglaAbrAbrilAgoAgo.AgostoCalendarioFechaDicDic.DiciembreCadaCadaExcluir estas ocurrenciasExcluir esta fechaFebreroFrecuenciaVieViernesVEneEne.EneroJulioJunioMarzoLunLunesLNoviembreOcurre %(number)s vezOcurre %(number)s vecesOctubreElEliminarRepetir hastaSabSábadoSSeptiembreDomDomingoDJueJuevesJHoraMarMartesMHastaMieMiércolesManualmentediariamentedíadíascada %(items)scada %(number)s %(freq)sExcluidoprimer %(weekday)scuarto %(weekday)scuarto últimohoracada horahorasIncluidoúltimoúltimo %(weekday)sMedia nocheminutocada minutominutos mesMayomensualmentemesesMedio díaocurre %(number)s ocurre %(number)s vecesen %(items)ssegundosegundo %(weekday)spenúltimosegundo último %(weekday)scada segundosegundostercero %(weekday)santepenúltimotercer último %(weekday)shasta %(date)ssemanasemanalmentesemanasañoaños././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/locale/es/LC_MESSAGES/djangojs.po0000644000076500000240000002605400000000000024262 0ustar00aleksistaff# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # FULL NAME , 2015. # msgid "" msgstr "" "Project-Id-Version: Django Recurrence 1.4.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-24 23:11+0100\n" "PO-Revision-Date: 2017-02-24 23:15+0100\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Gtranslator 2.91.7\n" #: static/recurrence/js/recurrence-widget.js:1609 msgctxt "date" msgid "%l, %F %j, %Y" msgstr "" #: static/recurrence/js/recurrence-widget.js:1774 msgid "including" msgstr "Incluido" #: static/recurrence/js/recurrence-widget.js:1774 msgid "excluding" msgstr "Excluido" #: static/recurrence/js/recurrence-widget.js:1778 msgid "Frequency" msgstr "Frecuencia" #: static/recurrence/js/recurrence-widget.js:1779 msgid "On the" msgstr "El" #: static/recurrence/js/recurrence-widget.js:1780 msgid "Each" msgstr "Cada" #: static/recurrence/js/recurrence-widget.js:1781 msgid "Every" msgstr "Cada" #: static/recurrence/js/recurrence-widget.js:1782 msgid "Until" msgstr "Hasta" #: static/recurrence/js/recurrence-widget.js:1783 msgid "Occurs %(number)s time" msgstr "Ocurre %(number)s vez" #: static/recurrence/js/recurrence-widget.js:1784 msgid "Occurs %(number)s times" msgstr "Ocurre %(number)s veces" #: static/recurrence/js/recurrence-widget.js:1785 msgid "Date" msgstr "Fecha" #: static/recurrence/js/recurrence-widget.js:1786 msgid "Time" msgstr "Hora" #: static/recurrence/js/recurrence-widget.js:1787 msgid "Repeat until" msgstr "Repetir hasta" #: static/recurrence/js/recurrence-widget.js:1788 msgid "Exclude these occurences" msgstr "Excluir estas ocurrencias" #: static/recurrence/js/recurrence-widget.js:1789 msgid "Exclude this date" msgstr "Excluir esta fecha" #: static/recurrence/js/recurrence-widget.js:1790 msgid "Add rule" msgstr "Añadir regla" #: static/recurrence/js/recurrence-widget.js:1791 msgid "Add date" msgstr "Añadir fecha" #: static/recurrence/js/recurrence-widget.js:1792 msgid "Remove" msgstr "Eliminar" #: static/recurrence/js/recurrence-widget.js:1793 msgid "Calendar" msgstr "Calendario" #: static/recurrence/js/recurrence.js:218 msgctxt "Until date format" msgid "%Y-%m-%d" msgstr "" #: static/recurrence/js/recurrence.js:1017 msgid "midnight" msgstr "Media noche" #: static/recurrence/js/recurrence.js:1018 msgid "noon" msgstr "Medio día" #: static/recurrence/js/recurrence.js:1019 msgid "on the %(items)s" msgstr "en %(items)s" #: static/recurrence/js/recurrence.js:1020 msgid "every %(number)s %(freq)s" msgstr "cada %(number)s %(freq)s" #: static/recurrence/js/recurrence.js:1021 msgid "each %(items)s" msgstr "cada %(items)s" #: static/recurrence/js/recurrence.js:1022 msgid "occuring %(number)s time" msgstr "ocurre %(number)s " #: static/recurrence/js/recurrence.js:1023 msgid "occuring %(number)s times" msgstr "ocurre %(number)s veces" #: static/recurrence/js/recurrence.js:1024 msgid "until %(date)s" msgstr "hasta %(date)s" #: static/recurrence/js/recurrence.js:1028 msgid "year" msgstr "año" #: static/recurrence/js/recurrence.js:1028 msgid "month" msgstr "mes" #: static/recurrence/js/recurrence.js:1028 msgid "week" msgstr "semana" #: static/recurrence/js/recurrence.js:1028 msgid "day" msgstr "día" #: static/recurrence/js/recurrence.js:1029 msgid "hour" msgstr "hora" #: static/recurrence/js/recurrence.js:1029 msgid "minute" msgstr "minuto" #: static/recurrence/js/recurrence.js:1029 msgid "second" msgstr "segundo" #: static/recurrence/js/recurrence.js:1032 msgid "years" msgstr "años" #: static/recurrence/js/recurrence.js:1032 msgid "months" msgstr "meses" #: static/recurrence/js/recurrence.js:1032 msgid "weeks" msgstr "semanas" #: static/recurrence/js/recurrence.js:1032 msgid "days" msgstr "días" #: static/recurrence/js/recurrence.js:1033 msgid "hours" msgstr "horas" #: static/recurrence/js/recurrence.js:1033 msgid "minutes" msgstr "minutos\t" #: static/recurrence/js/recurrence.js:1033 msgid "seconds" msgstr "segundos" #: static/recurrence/js/recurrence.js:1036 msgid "annually" msgstr "anualmente" #: static/recurrence/js/recurrence.js:1036 msgid "monthly" msgstr "mensualmente" #: static/recurrence/js/recurrence.js:1036 msgid "weekly" msgstr "semanalmente" #: static/recurrence/js/recurrence.js:1036 msgid "daily" msgstr "diariamente" #: static/recurrence/js/recurrence.js:1037 msgid "hourly" msgstr "cada hora" #: static/recurrence/js/recurrence.js:1037 msgid "minutely" msgstr "cada minuto" #: static/recurrence/js/recurrence.js:1037 msgid "secondly" msgstr "cada segundo" #: static/recurrence/js/recurrence.js:1040 msgid "Monday" msgstr "Lunes" #: static/recurrence/js/recurrence.js:1040 msgid "Tuesday" msgstr "Martes" #: static/recurrence/js/recurrence.js:1040 msgid "Wednesday" msgstr "Miércoles" #: static/recurrence/js/recurrence.js:1040 msgid "Thursday" msgstr "Jueves" #: static/recurrence/js/recurrence.js:1041 msgid "Friday" msgstr "Viernes" #: static/recurrence/js/recurrence.js:1041 msgid "Saturday" msgstr "Sábado" #: static/recurrence/js/recurrence.js:1041 msgid "Sunday" msgstr "Domingo" #: static/recurrence/js/recurrence.js:1044 msgid "Mon" msgstr "Lun" #: static/recurrence/js/recurrence.js:1044 msgid "Tue" msgstr "Mar" #: static/recurrence/js/recurrence.js:1044 msgid "Wed" msgstr "Mie" #: static/recurrence/js/recurrence.js:1044 msgid "Thu" msgstr "Jue" #: static/recurrence/js/recurrence.js:1045 msgid "Fri" msgstr "Vie" #: static/recurrence/js/recurrence.js:1045 msgid "Sat" msgstr "Sab" #: static/recurrence/js/recurrence.js:1045 msgid "Sun" msgstr "Dom" #: static/recurrence/js/recurrence.js:1048 msgctxt "Monday first letter" msgid "M" msgstr "L" #: static/recurrence/js/recurrence.js:1049 msgctxt "Tuesday first letter" msgid "T" msgstr "M" #: static/recurrence/js/recurrence.js:1050 msgctxt "Wednesday first letter" msgid "W" msgstr "M" #: static/recurrence/js/recurrence.js:1051 msgctxt "Thursday first letter" msgid "T" msgstr "J" #: static/recurrence/js/recurrence.js:1052 msgctxt "Friday first letter" msgid "F" msgstr "V" #: static/recurrence/js/recurrence.js:1053 msgctxt "Saturday first letter" msgid "S" msgstr "S" #: static/recurrence/js/recurrence.js:1054 msgctxt "Sunday first letter" msgid "S" msgstr "D" #: static/recurrence/js/recurrence.js:1057 msgid "first %(weekday)s" msgstr "primer %(weekday)s" #: static/recurrence/js/recurrence.js:1058 msgid "second %(weekday)s" msgstr "segundo %(weekday)s" #: static/recurrence/js/recurrence.js:1059 msgid "third %(weekday)s" msgstr "tercero %(weekday)s" #: static/recurrence/js/recurrence.js:1060 msgid "fourth %(weekday)s" msgstr "cuarto %(weekday)s" #: static/recurrence/js/recurrence.js:1061 #: static/recurrence/js/recurrence.js:1070 msgid "last %(weekday)s" msgstr "último %(weekday)s" #: static/recurrence/js/recurrence.js:1062 msgid "second last %(weekday)s" msgstr "segundo último %(weekday)s" #: static/recurrence/js/recurrence.js:1063 msgid "third last %(weekday)s" msgstr "tercer último %(weekday)s" #: static/recurrence/js/recurrence.js:1066 msgid "1st %(weekday)s" msgstr "1º %(weekday)s" #: static/recurrence/js/recurrence.js:1067 msgid "2nd %(weekday)s" msgstr "2º %(weekday)s" #: static/recurrence/js/recurrence.js:1068 msgid "3rd %(weekday)s" msgstr "3º %(weekday)s" #: static/recurrence/js/recurrence.js:1069 msgid "4th %(weekday)s" msgstr "4º %(weekday)s" #: static/recurrence/js/recurrence.js:1071 msgid "2nd last %(weekday)s" msgstr "2º último %(weekday)s" #: static/recurrence/js/recurrence.js:1072 msgid "3rd last %(weekday)s" msgstr "3º último %(weekday)s" #: static/recurrence/js/recurrence.js:1075 #: static/recurrence/js/recurrence.js:1081 msgid "last" msgstr "último" #: static/recurrence/js/recurrence.js:1076 msgid "second last" msgstr "penúltimo" #: static/recurrence/js/recurrence.js:1077 msgid "third last" msgstr "antepenúltimo" #: static/recurrence/js/recurrence.js:1078 msgid "fourth last" msgstr "cuarto último" #: static/recurrence/js/recurrence.js:1082 msgid "2nd last" msgstr "2º último" #: static/recurrence/js/recurrence.js:1083 msgid "3rd last" msgstr "3º último" #: static/recurrence/js/recurrence.js:1084 msgid "4th last" msgstr "4º último" #: static/recurrence/js/recurrence.js:1087 msgid "January" msgstr "Enero" #: static/recurrence/js/recurrence.js:1087 msgid "February" msgstr "Febrero" #: static/recurrence/js/recurrence.js:1087 #: static/recurrence/js/recurrence.js:1099 msgid "March" msgstr "Marzo" #: static/recurrence/js/recurrence.js:1088 #: static/recurrence/js/recurrence.js:1100 msgid "April" msgstr "Abril" #: static/recurrence/js/recurrence.js:1088 #: static/recurrence/js/recurrence.js:1094 #: static/recurrence/js/recurrence.js:1100 msgctxt "month name" msgid "May" msgstr "Mayo" #: static/recurrence/js/recurrence.js:1088 #: static/recurrence/js/recurrence.js:1100 msgid "June" msgstr "Junio" #: static/recurrence/js/recurrence.js:1089 #: static/recurrence/js/recurrence.js:1101 msgid "July" msgstr "Julio" #: static/recurrence/js/recurrence.js:1089 msgid "August" msgstr "Agosto" #: static/recurrence/js/recurrence.js:1089 msgid "September" msgstr "Septiembre" #: static/recurrence/js/recurrence.js:1090 msgid "October" msgstr "Octubre" #: static/recurrence/js/recurrence.js:1090 msgid "November" msgstr "Noviembre" #: static/recurrence/js/recurrence.js:1090 msgid "December" msgstr "Diciembre" #: static/recurrence/js/recurrence.js:1093 msgid "Jan" msgstr "Ene" #: static/recurrence/js/recurrence.js:1093 msgid "Feb" msgstr "" #: static/recurrence/js/recurrence.js:1093 msgid "Mar" msgstr "" #: static/recurrence/js/recurrence.js:1094 msgid "Apr" msgstr "Abr" #: static/recurrence/js/recurrence.js:1094 msgid "Jun" msgstr "" #: static/recurrence/js/recurrence.js:1095 msgid "Jul" msgstr "" #: static/recurrence/js/recurrence.js:1095 msgid "Aug" msgstr "Ago" #: static/recurrence/js/recurrence.js:1095 msgid "Sep" msgstr "" #: static/recurrence/js/recurrence.js:1096 msgid "Oct" msgstr "" #: static/recurrence/js/recurrence.js:1096 msgid "Nov" msgstr "" #: static/recurrence/js/recurrence.js:1096 msgid "Dec" msgstr "Dic" #: static/recurrence/js/recurrence.js:1099 msgid "Jan." msgstr "Ene." #: static/recurrence/js/recurrence.js:1099 msgid "Feb." msgstr "" #: static/recurrence/js/recurrence.js:1101 msgid "Aug." msgstr "Ago." #: static/recurrence/js/recurrence.js:1101 msgid "Sept." msgstr "" #: static/recurrence/js/recurrence.js:1102 msgid "Oct." msgstr "" #: static/recurrence/js/recurrence.js:1102 msgid "Nov." msgstr "" #: static/recurrence/js/recurrence.js:1102 msgid "Dec." msgstr "Dic." #: static/recurrence/js/recurrence.js:1105 msgid "a.m." msgstr "" #: static/recurrence/js/recurrence.js:1105 msgid "p.m." msgstr "" #: static/recurrence/js/recurrence.js:1106 msgid "AM" msgstr "" #: static/recurrence/js/recurrence.js:1106 msgid "PM" msgstr "" #: static/recurrence/js/recurrence.js:1108 msgctxt "Day of month" msgid "%j%S" msgstr "" #~ msgid "last day" #~ msgstr "último día" ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1643105481.264622 django-recurrence-1.11.1/recurrence/locale/eu/0000755000076500000240000000000000000000000020331 5ustar00aleksistaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1643105481.2929785 django-recurrence-1.11.1/recurrence/locale/eu/LC_MESSAGES/0000755000076500000240000000000000000000000022116 5ustar00aleksistaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/locale/eu/LC_MESSAGES/django.mo0000644000076500000240000001010000000000000023705 0ustar00aleksistaffUql014DTiy   *$4O4*     ! * 3 7 A E L P Y ] e i s z               ! ; I Z m         L . 1 @ O h w                   # ' . 2 1: :l > 5 $- 2 =HLSW] a kuy   )07IR [ fq    +29*-CB3&LQ%. G# 5$7+D/<JP;AR@2(N>T64 O'1:I?!"FK ,M=S 0)H 9E8U, 1st %(weekday)s2nd %(weekday)s2nd last %(weekday)s3rd %(weekday)s3rd last %(weekday)sAprAprilAugAugustDailyDecDecemberExclusionFebFebruaryFriFridayHourlyInclusionInvalid frequency.JanJanuaryJulJulyJunJuneMarMarchMax dates exceeded. The limit is %(limit)sMax exclusion dates exceeded. The limit is %(limit)sMax exclusion rules exceeded. The limit is %(limit)sMax rules exceeded. The limit is %(limit)sMayMinutelyMonMondayMonthlyNovNovemberOctOctoberSatSaturdaySecondlySepSeptemberSunSundayThuThursdayTueTuesdayWedWednesdayWeeklyYearlyannuallydailydayseach %(items)severy %(number)s %(freq)sfirst %(weekday)sfourth %(weekday)shourlyhourslast %(weekday)sminutelyminutesmonthlymonthsoccuring %(number)s timesoccuring onceon the %(items)ssecond %(weekday)ssecond last %(weekday)ssecondlysecondsthird %(weekday)sthird last %(weekday)suntil %(date)sweeklyweeksyearsProject-Id-Version: 1.3.0 Report-Msgid-Bugs-To: POT-Creation-Date: 2017-02-24 23:21+0100 PO-Revision-Date: 2016-05-14 19:21+0100 Last-Translator: Unai Zalakain Language: eu MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); , 1. %(weekday)s2. %(weekday)sazkenaurreko %(weekday)s3. %(weekday)sazken-hirugarren %(weekday)sApiApirilaAbuAbuztuaEguneroAbeAbenduaExklusioOtsOtsailaOstiOstiralaOrduroInklusioMaiztasun baliogabea.UrtUrtarrilaUztUztailaEkaEkainaMarMartxoaDaten kopuru maximoa gainditua. Muga %(limit)s daExklusio daten kopuru maximoa gainditua. Muga %(limit)s daExklusio erregelen kopuru maximoa gainditua. Muga %(limit)s daErregelen kopuru maximoa gainditua. Muga %(limit)s daMaiatzaMinuturoAstlAstelehenaHilabeteroAzaAzaroaUrrUrriaLarLarunbataSegunduroIraIrailaIgaIgandeaOstgOstegunaAstrAstearteaAstzAsteazkenaAsteroUrterourteroeguneroegunak%(items)sero%(number)s %(freq)serolehen %(weekday)slaugarren %(weekday)sorduroorduakazken %(weekday)sminuturominutuakhilabeterohilabeteak%(number)stan gertatzenbehin gertatzen%(items)setanbigarren %(weekday)sazkenaurreko %(weekday)ssegundurosegunduakhirugarren %(weekday)sazken-hirugarren %(weekday)s%(date)s arteasteroasteakurteak././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/locale/eu/LC_MESSAGES/django.po0000644000076500000240000001547000000000000023727 0ustar00aleksistaff# Basque translations for django-recurrence # Copyright (C) Tamas Kemenczy and individual contributors # This file is distributed under the same license as the django-recurrence package. # Unai Zalakain , 2016. # msgid "" msgstr "" "Project-Id-Version: 1.3.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-24 23:21+0100\n" "PO-Revision-Date: 2016-05-14 19:21+0100\n" "Last-Translator: Unai Zalakain \n" "Language: eu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: base.py:1087 msgid "annually" msgstr "urtero" #: base.py:1087 msgid "monthly" msgstr "hilabetero" #: base.py:1087 msgid "weekly" msgstr "astero" #: base.py:1087 msgid "daily" msgstr "egunero" #: base.py:1088 msgid "hourly" msgstr "orduro" #: base.py:1088 msgid "minutely" msgstr "minuturo" #: base.py:1088 msgid "secondly" msgstr "segunduro" #: base.py:1091 msgid "years" msgstr "urteak" #: base.py:1091 msgid "months" msgstr "hilabeteak" #: base.py:1091 msgid "weeks" msgstr "asteak" #: base.py:1091 msgid "days" msgstr "egunak" #: base.py:1092 msgid "hours" msgstr "orduak" #: base.py:1092 msgid "minutes" msgstr "minutuak" #: base.py:1092 msgid "seconds" msgstr "segunduak" #: base.py:1097 #, python-format msgid "1st %(weekday)s" msgstr "1. %(weekday)s" #: base.py:1098 #, python-format msgid "2nd %(weekday)s" msgstr "2. %(weekday)s" #: base.py:1099 #, python-format msgid "3rd %(weekday)s" msgstr "3. %(weekday)s" #: base.py:1100 base.py:1126 #, python-format msgid "last %(weekday)s" msgstr "azken %(weekday)s" #: base.py:1101 #, python-format msgid "2nd last %(weekday)s" msgstr "azkenaurreko %(weekday)s" #: base.py:1102 #, python-format msgid "3rd last %(weekday)s" msgstr "azken-hirugarren %(weekday)s" #: base.py:1105 base.py:1131 #, fuzzy #| msgid "last %(weekday)s" msgid "last" msgstr "azken %(weekday)s" #: base.py:1106 #, fuzzy #| msgid "2nd last %(weekday)s" msgid "2nd last" msgstr "azkenaurreko %(weekday)s" #: base.py:1107 #, fuzzy #| msgid "3rd last %(weekday)s" msgid "3rd last" msgstr "azken-hirugarren %(weekday)s" #: base.py:1108 #, fuzzy #| msgid "third last %(weekday)s" msgid "4th last" msgstr "azken-hirugarren %(weekday)s" #: base.py:1111 msgid "Mon" msgstr "Astl" #: base.py:1111 msgid "Tue" msgstr "Astr" #: base.py:1111 msgid "Wed" msgstr "Astz" #: base.py:1112 msgid "Thu" msgstr "Ostg" #: base.py:1112 msgid "Fri" msgstr "Osti" #: base.py:1112 msgid "Sat" msgstr "Lar" #: base.py:1112 msgid "Sun" msgstr "Iga" #: base.py:1115 msgid "Jan" msgstr "Urt" #: base.py:1115 msgid "Feb" msgstr "Ots" #: base.py:1115 msgid "Mar" msgstr "Mar" #: base.py:1115 msgid "Apr" msgstr "Api" #: base.py:1116 msgid "Jun" msgstr "Eka" #: base.py:1116 msgid "Jul" msgstr "Uzt" #: base.py:1116 msgid "Aug" msgstr "Abu" #: base.py:1117 msgid "Sep" msgstr "Ira" #: base.py:1117 msgid "Oct" msgstr "Urr" #: base.py:1117 msgid "Nov" msgstr "Aza" #: base.py:1117 msgid "Dec" msgstr "Abe" #: base.py:1122 #, python-format msgid "first %(weekday)s" msgstr "lehen %(weekday)s" #: base.py:1123 #, python-format msgid "second %(weekday)s" msgstr "bigarren %(weekday)s" #: base.py:1124 #, python-format msgid "third %(weekday)s" msgstr "hirugarren %(weekday)s" #: base.py:1125 #, python-format msgid "fourth %(weekday)s" msgstr "laugarren %(weekday)s" #: base.py:1127 #, python-format msgid "second last %(weekday)s" msgstr "azkenaurreko %(weekday)s" #: base.py:1128 #, python-format msgid "third last %(weekday)s" msgstr "azken-hirugarren %(weekday)s" #: base.py:1132 #, fuzzy #| msgid "second last %(weekday)s" msgid "second last" msgstr "azkenaurreko %(weekday)s" #: base.py:1133 #, fuzzy #| msgid "third last %(weekday)s" msgid "third last" msgstr "azken-hirugarren %(weekday)s" #: base.py:1134 #, fuzzy #| msgid "fourth %(weekday)s" msgid "fourth last" msgstr "laugarren %(weekday)s" #: base.py:1137 choices.py:17 msgid "Monday" msgstr "Astelehena" #: base.py:1137 choices.py:18 msgid "Tuesday" msgstr "Asteartea" #: base.py:1137 choices.py:19 msgid "Wednesday" msgstr "Asteazkena" #: base.py:1138 choices.py:20 msgid "Thursday" msgstr "Osteguna" #: base.py:1138 choices.py:21 msgid "Friday" msgstr "Ostirala" #: base.py:1138 choices.py:22 msgid "Saturday" msgstr "Larunbata" #: base.py:1138 choices.py:23 msgid "Sunday" msgstr "Igandea" #: base.py:1141 choices.py:27 msgid "January" msgstr "Urtarrila" #: base.py:1141 choices.py:28 msgid "February" msgstr "Otsaila" #: base.py:1141 choices.py:29 msgid "March" msgstr "Martxoa" #: base.py:1141 choices.py:30 msgid "April" msgstr "Apirila" #: base.py:1142 choices.py:32 msgid "June" msgstr "Ekaina" #: base.py:1142 choices.py:33 msgid "July" msgstr "Uztaila" #: base.py:1142 choices.py:34 msgid "August" msgstr "Abuztua" #: base.py:1143 choices.py:35 msgid "September" msgstr "Iraila" #: base.py:1143 choices.py:36 msgid "October" msgstr "Urria" #: base.py:1143 choices.py:37 msgid "November" msgstr "Azaroa" #: base.py:1143 choices.py:38 msgid "December" msgstr "Abendua" #: base.py:1161 base.py:1178 base.py:1189 base.py:1202 base.py:1220 msgid ", " msgstr ", " #: base.py:1167 #, python-format msgid "every %(number)s %(freq)s" msgstr "%(number)s %(freq)sero" #: base.py:1181 base.py:1205 #, python-format msgid "each %(items)s" msgstr "%(items)sero" #: base.py:1184 base.py:1193 base.py:1197 #, python-format msgid "on the %(items)s" msgstr "%(items)setan" #: base.py:1212 msgid "occuring once" msgstr "behin gertatzen" #: base.py:1214 #, python-format msgid "occuring %(number)s times" msgstr "%(number)stan gertatzen" #: base.py:1217 #, python-format msgid "until %(date)s" msgstr "%(date)s arte" #: choices.py:7 msgid "Secondly" msgstr "Segunduro" #: choices.py:8 msgid "Minutely" msgstr "Minuturo" #: choices.py:9 msgid "Hourly" msgstr "Orduro" #: choices.py:10 msgid "Daily" msgstr "Egunero" #: choices.py:11 msgid "Weekly" msgstr "Astero" #: choices.py:12 msgid "Monthly" msgstr "Hilabetero" #: choices.py:13 msgid "Yearly" msgstr "Urtero" #: choices.py:31 msgid "May" msgstr "Maiatza" #: choices.py:44 msgid "Inclusion" msgstr "Inklusio" #: choices.py:45 msgid "Exclusion" msgstr "Exklusio" #: forms.py:72 msgid "Invalid frequency." msgstr "Maiztasun baliogabea." #: forms.py:74 #, python-format msgid "Max rules exceeded. The limit is %(limit)s" msgstr "Erregelen kopuru maximoa gainditua. Muga %(limit)s da" #: forms.py:76 #, python-format msgid "Max exclusion rules exceeded. The limit is %(limit)s" msgstr "Exklusio erregelen kopuru maximoa gainditua. Muga %(limit)s da" #: forms.py:78 #, python-format msgid "Max dates exceeded. The limit is %(limit)s" msgstr "Daten kopuru maximoa gainditua. Muga %(limit)s da" #: forms.py:80 #, python-format msgid "Max exclusion dates exceeded. The limit is %(limit)s" msgstr "Exklusio daten kopuru maximoa gainditua. Muga %(limit)s da" ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/locale/eu/LC_MESSAGES/djangojs.mo0000644000076500000240000001210300000000000024247 0ustar00aleksistafful     & ; K N W ` d j n s z                   " ' + 0 4 : > E [ _ d m                % ) 2 J O S [ r x |            ' , 3 9 C T ] d m u {          "*<Sbgntyk ,@O R^nrz~   ",08<CGO T_bfkr   *-6 ;FINU]msx !* 1; CNW`o   &,38>JB='t@TpM ($F?NQ&O [`!#%,-fu0 "65Yc^\DmUqrsXKEA9> ;2e4nhH]31*VaPojSGWIkdl Rg: L<7)C/b._Z8+i1st %(weekday)s2nd %(weekday)s2nd last %(weekday)s3rd %(weekday)s3rd last %(weekday)s4th %(weekday)sAMAdd dateAdd ruleAprAprilAugAug.AugustCalendarDateDecDec.DecemberEachEveryExclude these occurencesExclude this dateFebFeb.FebruaryFrequencyFriFridayFriday first letterFJanJan.JanuaryJulJulyJunJuneMarMarchMonMondayMonday first letterMNovNov.NovemberOccurs %(number)s timeOccurs %(number)s timesOctOct.OctoberOn thePMRemoveRepeat untilSatSaturdaySaturday first letterSSepSept.SeptemberSunSundaySunday first letterSThuThursdayThursday first letterTTimeTueTuesdayTuesday first letterTUntilWedWednesdayWednesday first letterWa.m.annuallydailydate%l, %F %j, %Ydaydayseach %(items)severy %(number)s %(freq)sexcludingfirst %(weekday)sfourth %(weekday)shourhourlyhoursincludinglast %(weekday)smidnightminuteminutelyminutesmonthmonth nameMaymonthlymonthsnoonoccuring %(number)s timeoccuring %(number)s timeson the %(items)sp.m.secondsecond %(weekday)ssecond last %(weekday)ssecondlysecondsthird %(weekday)sthird last %(weekday)suntil %(date)sweekweeklyweeksyearyearsProject-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-02-24 23:11+0100 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: FULL NAME Language-Team: LANGUAGE Language: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); 1. %(weekday)s2. %(weekday)s2. azken %(weekday)3. %(weekday)s3. azken %(weekday)4. %(weekday)sAMData gehituErregela gehituApiApirilaAbuEka.AbuztuaEgutegiaDataAbeAbe.AbenduaEdozeinEdozeinGertaera hauek kanpoan utziData hau kanpoan utziOtsOts.OtsailaMaiztasunaOstiOstiralaOrUrtUrt.UrtarrilaUztUztailaEkaEkainaMarMartxoaAstlAstelehenaAlAzaAza.AzaroaBehin gertatzen da%(number)s aldiz gertatzen daUrrUrr.UrriaHemenPMKenduErrepikatu honerarteLarLarunbataLIraIra.IrailaIgaIgandeaIOstgOstegunaOgOrduaAstrAstearteaArBukatzenAstzAsteazkenaAza.m.urteroegunero%Yko %Fk %j, %legunaegun%(items)s bakoitzero%(number)s %(freq)s(e)rokanpoan utzizlehen %(weekday)shirugarren %(weekday)sorduaorduroordubarnean hartuzazken %(weekday)sgauerdiaminutuaminuturominutuhilabeteaMaiatzahilabeterohilabeteeguerdiabehin gertatuz%(number)s aldiz gertatuz%(items)setanp.m.segunduabigarren %(weekday)sazkenaurreko %(weekday)ssegundurosegunduhirugarren %(weekday)sazken-hirugarren %(weekday)%(date)s arteasteaasteroasteurteaurte././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/locale/eu/LC_MESSAGES/djangojs.po0000644000076500000240000002701100000000000024256 0ustar00aleksistaff# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-24 23:11+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: static/recurrence/js/recurrence-widget.js:1609 msgctxt "date" msgid "%l, %F %j, %Y" msgstr "%Yko %Fk %j, %l" #: static/recurrence/js/recurrence-widget.js:1774 msgid "including" msgstr "barnean hartuz" #: static/recurrence/js/recurrence-widget.js:1774 msgid "excluding" msgstr "kanpoan utziz" #: static/recurrence/js/recurrence-widget.js:1778 msgid "Frequency" msgstr "Maiztasuna" #: static/recurrence/js/recurrence-widget.js:1779 msgid "On the" msgstr "Hemen" #: static/recurrence/js/recurrence-widget.js:1780 msgid "Each" msgstr "Edozein" #: static/recurrence/js/recurrence-widget.js:1781 msgid "Every" msgstr "Edozein" #: static/recurrence/js/recurrence-widget.js:1782 msgid "Until" msgstr "Bukatzen" #: static/recurrence/js/recurrence-widget.js:1783 msgid "Occurs %(number)s time" msgstr "Behin gertatzen da" #: static/recurrence/js/recurrence-widget.js:1784 msgid "Occurs %(number)s times" msgstr "%(number)s aldiz gertatzen da" #: static/recurrence/js/recurrence-widget.js:1785 msgid "Date" msgstr "Data" #: static/recurrence/js/recurrence-widget.js:1786 msgid "Time" msgstr "Ordua" #: static/recurrence/js/recurrence-widget.js:1787 msgid "Repeat until" msgstr "Errepikatu honerarte" #: static/recurrence/js/recurrence-widget.js:1788 msgid "Exclude these occurences" msgstr "Gertaera hauek kanpoan utzi" #: static/recurrence/js/recurrence-widget.js:1789 msgid "Exclude this date" msgstr "Data hau kanpoan utzi" #: static/recurrence/js/recurrence-widget.js:1790 msgid "Add rule" msgstr "Erregela gehitu" #: static/recurrence/js/recurrence-widget.js:1791 msgid "Add date" msgstr "Data gehitu" #: static/recurrence/js/recurrence-widget.js:1792 msgid "Remove" msgstr "Kendu" #: static/recurrence/js/recurrence-widget.js:1793 msgid "Calendar" msgstr "Egutegia" #: static/recurrence/js/recurrence.js:218 msgctxt "Until date format" msgid "%Y-%m-%d" msgstr "" #: static/recurrence/js/recurrence.js:1017 msgid "midnight" msgstr "gauerdia" #: static/recurrence/js/recurrence.js:1018 msgid "noon" msgstr "eguerdia" #: static/recurrence/js/recurrence.js:1019 msgid "on the %(items)s" msgstr "%(items)setan" #: static/recurrence/js/recurrence.js:1020 msgid "every %(number)s %(freq)s" msgstr "%(number)s %(freq)s(e)ro" #: static/recurrence/js/recurrence.js:1021 msgid "each %(items)s" msgstr "%(items)s bakoitzero" #: static/recurrence/js/recurrence.js:1022 msgid "occuring %(number)s time" msgstr "behin gertatuz" #: static/recurrence/js/recurrence.js:1023 msgid "occuring %(number)s times" msgstr "%(number)s aldiz gertatuz" #: static/recurrence/js/recurrence.js:1024 msgid "until %(date)s" msgstr "%(date)s arte" #: static/recurrence/js/recurrence.js:1028 msgid "year" msgstr "urtea" #: static/recurrence/js/recurrence.js:1028 msgid "month" msgstr "hilabetea" #: static/recurrence/js/recurrence.js:1028 msgid "week" msgstr "astea" #: static/recurrence/js/recurrence.js:1028 msgid "day" msgstr "eguna" #: static/recurrence/js/recurrence.js:1029 msgid "hour" msgstr "ordua" #: static/recurrence/js/recurrence.js:1029 msgid "minute" msgstr "minutua" #: static/recurrence/js/recurrence.js:1029 msgid "second" msgstr "segundua" #: static/recurrence/js/recurrence.js:1032 msgid "years" msgstr "urte" #: static/recurrence/js/recurrence.js:1032 msgid "months" msgstr "hilabete" #: static/recurrence/js/recurrence.js:1032 msgid "weeks" msgstr "aste" #: static/recurrence/js/recurrence.js:1032 msgid "days" msgstr "egun" #: static/recurrence/js/recurrence.js:1033 msgid "hours" msgstr "ordu" #: static/recurrence/js/recurrence.js:1033 msgid "minutes" msgstr "minutu" #: static/recurrence/js/recurrence.js:1033 msgid "seconds" msgstr "segundu" #: static/recurrence/js/recurrence.js:1036 msgid "annually" msgstr "urtero" #: static/recurrence/js/recurrence.js:1036 msgid "monthly" msgstr "hilabetero" #: static/recurrence/js/recurrence.js:1036 msgid "weekly" msgstr "astero" #: static/recurrence/js/recurrence.js:1036 msgid "daily" msgstr "egunero" #: static/recurrence/js/recurrence.js:1037 msgid "hourly" msgstr "orduro" #: static/recurrence/js/recurrence.js:1037 msgid "minutely" msgstr "minuturo" #: static/recurrence/js/recurrence.js:1037 msgid "secondly" msgstr "segunduro" #: static/recurrence/js/recurrence.js:1040 msgid "Monday" msgstr "Astelehena" #: static/recurrence/js/recurrence.js:1040 msgid "Tuesday" msgstr "Asteartea" #: static/recurrence/js/recurrence.js:1040 msgid "Wednesday" msgstr "Asteazkena" #: static/recurrence/js/recurrence.js:1040 msgid "Thursday" msgstr "Osteguna" #: static/recurrence/js/recurrence.js:1041 msgid "Friday" msgstr "Ostirala" #: static/recurrence/js/recurrence.js:1041 msgid "Saturday" msgstr "Larunbata" #: static/recurrence/js/recurrence.js:1041 msgid "Sunday" msgstr "Igandea" #: static/recurrence/js/recurrence.js:1044 msgid "Mon" msgstr "Astl" #: static/recurrence/js/recurrence.js:1044 msgid "Tue" msgstr "Astr" #: static/recurrence/js/recurrence.js:1044 msgid "Wed" msgstr "Astz" #: static/recurrence/js/recurrence.js:1044 msgid "Thu" msgstr "Ostg" #: static/recurrence/js/recurrence.js:1045 msgid "Fri" msgstr "Osti" #: static/recurrence/js/recurrence.js:1045 msgid "Sat" msgstr "Lar" #: static/recurrence/js/recurrence.js:1045 msgid "Sun" msgstr "Iga" #: static/recurrence/js/recurrence.js:1048 msgctxt "Monday first letter" msgid "M" msgstr "Al" #: static/recurrence/js/recurrence.js:1049 msgctxt "Tuesday first letter" msgid "T" msgstr "Ar" #: static/recurrence/js/recurrence.js:1050 msgctxt "Wednesday first letter" msgid "W" msgstr "Az" #: static/recurrence/js/recurrence.js:1051 msgctxt "Thursday first letter" msgid "T" msgstr "Og" #: static/recurrence/js/recurrence.js:1052 msgctxt "Friday first letter" msgid "F" msgstr "Or" #: static/recurrence/js/recurrence.js:1053 msgctxt "Saturday first letter" msgid "S" msgstr "L" #: static/recurrence/js/recurrence.js:1054 msgctxt "Sunday first letter" msgid "S" msgstr "I" #: static/recurrence/js/recurrence.js:1057 msgid "first %(weekday)s" msgstr "lehen %(weekday)s" #: static/recurrence/js/recurrence.js:1058 msgid "second %(weekday)s" msgstr "bigarren %(weekday)s" #: static/recurrence/js/recurrence.js:1059 msgid "third %(weekday)s" msgstr "hirugarren %(weekday)s" #: static/recurrence/js/recurrence.js:1060 msgid "fourth %(weekday)s" msgstr "hirugarren %(weekday)s" #: static/recurrence/js/recurrence.js:1061 #: static/recurrence/js/recurrence.js:1070 msgid "last %(weekday)s" msgstr "azken %(weekday)s" #: static/recurrence/js/recurrence.js:1062 msgid "second last %(weekday)s" msgstr "azkenaurreko %(weekday)s" #: static/recurrence/js/recurrence.js:1063 msgid "third last %(weekday)s" msgstr "azken-hirugarren %(weekday)" #: static/recurrence/js/recurrence.js:1066 msgid "1st %(weekday)s" msgstr "1. %(weekday)s" #: static/recurrence/js/recurrence.js:1067 msgid "2nd %(weekday)s" msgstr "2. %(weekday)s" #: static/recurrence/js/recurrence.js:1068 msgid "3rd %(weekday)s" msgstr "3. %(weekday)s" #: static/recurrence/js/recurrence.js:1069 msgid "4th %(weekday)s" msgstr "4. %(weekday)s" #: static/recurrence/js/recurrence.js:1071 msgid "2nd last %(weekday)s" msgstr "2. azken %(weekday)" #: static/recurrence/js/recurrence.js:1072 msgid "3rd last %(weekday)s" msgstr "3. azken %(weekday)" #: static/recurrence/js/recurrence.js:1075 #: static/recurrence/js/recurrence.js:1081 #, fuzzy #| msgid "last %(weekday)s" msgid "last" msgstr "azken %(weekday)s" #: static/recurrence/js/recurrence.js:1076 #, fuzzy #| msgid "second last %(weekday)s" msgid "second last" msgstr "azkenaurreko %(weekday)s" #: static/recurrence/js/recurrence.js:1077 #, fuzzy #| msgid "third last %(weekday)s" msgid "third last" msgstr "azken-hirugarren %(weekday)" #: static/recurrence/js/recurrence.js:1078 #, fuzzy #| msgid "fourth %(weekday)s" msgid "fourth last" msgstr "hirugarren %(weekday)s" #: static/recurrence/js/recurrence.js:1082 #, fuzzy #| msgid "2nd last %(weekday)s" msgid "2nd last" msgstr "2. azken %(weekday)" #: static/recurrence/js/recurrence.js:1083 #, fuzzy #| msgid "3rd last %(weekday)s" msgid "3rd last" msgstr "3. azken %(weekday)" #: static/recurrence/js/recurrence.js:1084 #, fuzzy #| msgid "third last %(weekday)s" msgid "4th last" msgstr "azken-hirugarren %(weekday)" #: static/recurrence/js/recurrence.js:1087 msgid "January" msgstr "Urtarrila" #: static/recurrence/js/recurrence.js:1087 msgid "February" msgstr "Otsaila" #: static/recurrence/js/recurrence.js:1087 #: static/recurrence/js/recurrence.js:1099 msgid "March" msgstr "Martxoa" #: static/recurrence/js/recurrence.js:1088 #: static/recurrence/js/recurrence.js:1100 msgid "April" msgstr "Apirila" #: static/recurrence/js/recurrence.js:1088 #: static/recurrence/js/recurrence.js:1094 #: static/recurrence/js/recurrence.js:1100 msgctxt "month name" msgid "May" msgstr "Maiatza" #: static/recurrence/js/recurrence.js:1088 #: static/recurrence/js/recurrence.js:1100 msgid "June" msgstr "Ekaina" #: static/recurrence/js/recurrence.js:1089 #: static/recurrence/js/recurrence.js:1101 msgid "July" msgstr "Uztaila" #: static/recurrence/js/recurrence.js:1089 msgid "August" msgstr "Abuztua" #: static/recurrence/js/recurrence.js:1089 msgid "September" msgstr "Iraila" #: static/recurrence/js/recurrence.js:1090 msgid "October" msgstr "Urria" #: static/recurrence/js/recurrence.js:1090 msgid "November" msgstr "Azaroa" #: static/recurrence/js/recurrence.js:1090 msgid "December" msgstr "Abendua" #: static/recurrence/js/recurrence.js:1093 msgid "Jan" msgstr "Urt" #: static/recurrence/js/recurrence.js:1093 msgid "Feb" msgstr "Ots" #: static/recurrence/js/recurrence.js:1093 msgid "Mar" msgstr "Mar" #: static/recurrence/js/recurrence.js:1094 msgid "Apr" msgstr "Api" #: static/recurrence/js/recurrence.js:1094 msgid "Jun" msgstr "Eka" #: static/recurrence/js/recurrence.js:1095 msgid "Jul" msgstr "Uzt" #: static/recurrence/js/recurrence.js:1095 msgid "Aug" msgstr "Abu" #: static/recurrence/js/recurrence.js:1095 msgid "Sep" msgstr "Ira" #: static/recurrence/js/recurrence.js:1096 msgid "Oct" msgstr "Urr" #: static/recurrence/js/recurrence.js:1096 msgid "Nov" msgstr "Aza" #: static/recurrence/js/recurrence.js:1096 msgid "Dec" msgstr "Abe" #: static/recurrence/js/recurrence.js:1099 msgid "Jan." msgstr "Urt." #: static/recurrence/js/recurrence.js:1099 msgid "Feb." msgstr "Ots." #: static/recurrence/js/recurrence.js:1101 msgid "Aug." msgstr "Eka." #: static/recurrence/js/recurrence.js:1101 msgid "Sept." msgstr "Ira." #: static/recurrence/js/recurrence.js:1102 msgid "Oct." msgstr "Urr." #: static/recurrence/js/recurrence.js:1102 msgid "Nov." msgstr "Aza." #: static/recurrence/js/recurrence.js:1102 msgid "Dec." msgstr "Abe." #: static/recurrence/js/recurrence.js:1105 msgid "a.m." msgstr "a.m." #: static/recurrence/js/recurrence.js:1105 msgid "p.m." msgstr "p.m." #: static/recurrence/js/recurrence.js:1106 msgid "AM" msgstr "AM" #: static/recurrence/js/recurrence.js:1106 msgid "PM" msgstr "PM" #: static/recurrence/js/recurrence.js:1108 msgctxt "Day of month" msgid "%j%S" msgstr "" #, fuzzy #~| msgid "last %(weekday)s" #~ msgid "last day" #~ msgstr "azken %(weekday)s" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1643105481.2648742 django-recurrence-1.11.1/recurrence/locale/fr/0000755000076500000240000000000000000000000020327 5ustar00aleksistaff././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1643105481.293985 django-recurrence-1.11.1/recurrence/locale/fr/LC_MESSAGES/0000755000076500000240000000000000000000000022114 5ustar00aleksistaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/locale/fr/LC_MESSAGES/django.mo0000644000076500000240000001114100000000000023711 0ustar00aleksistaff\*3HQU[_flp y *4 4G *|                    ( , 6 = D M S X g              . A M e n v       k n ~       $ .8=FJS eo:CI.<x $(15;?EI R_f mw} 1 9GLh} 1 CPYT* S(DA Q\ >NBO"#9 J6KY&H35/MR$.1EZ; @'C-V<GL2 F4)[?X=W870:U,+%!IP, 1st %(weekday)s2nd %(weekday)s2nd last2nd last %(weekday)s3rd %(weekday)s3rd last3rd last %(weekday)s4th lastAprAprilAugAugustDailyDecDecemberExclusionFebFebruaryFriFridayHourlyInclusionInvalid frequency.JanJanuaryJulJulyJunJuneMarMarchMax dates exceeded. The limit is %(limit)sMax exclusion dates exceeded. The limit is %(limit)sMax exclusion rules exceeded. The limit is %(limit)sMax rules exceeded. The limit is %(limit)sMayMinutelyMonMondayMonthlyNovNovemberOctOctoberSatSaturdaySecondlySepSeptemberSunSundayThuThursdayTueTuesdayWedWednesdayWeeklyYearlyannuallydailydayseach %(items)severy %(number)s %(freq)sfirst %(weekday)sfourth %(weekday)sfourth lasthourlyhourslastlast %(weekday)sminutelyminutesmonthlymonthsoccuring %(number)s timesoccuring onceon the %(items)ssecond %(weekday)ssecond lastsecond last %(weekday)ssecondlysecondsthird %(weekday)sthird lastthird last %(weekday)suntil %(date)sweeklyweeksyearsProject-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-02-24 23:21+0100 PO-Revision-Date: 2017-02-24 23:23+0100 Last-Translator: Olivier Le Brouster Language-Team: LANGUAGE Language: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n > 1); X-Generator: Poedit 1.5.4 , 1er %(weekday)s2ème %(weekday)s2ème dernieravant dernier %(weekday)s3ème %(weekday)s3ème dernier3ème dernier %(weekday)s4ème dernierAvravrilAoûaoûtQuotidienDécdécembreExclusionFévfévrierVenvendrediToutes les heuresInclusionFréquence invalideJanjanvierJuiljuilletJuinjuinMarmarsNombre maximum de dates dépassé. La limite est %(limit)sNombre maximum de dates éxclues dépassé. La limite est %(limit)sNombre maximum de règles d'exclusion déppassé. La limite est %(limit)sNombre maximum de règles dépassé. La limite est %(limit)smaiToutes les minutesLunlundiMensuelNovnovembreOctoctobreSamsamediToutes les secondesSepseptembreDimdimancheJeujeudiMarmardiMermercrediHebdomadaireAnnuelannuelquotidienjourschaque %(items)stous les %(number)s %(freq)spremier %(weekday)squatrième %(weekday)squatrième derniertoutes les heuresheuresdernierdernier %(weekday)stoutes les minutesminutesmensuellementmoisse répète %(number)s foisse répète une foispour le %(items)sdeuxième %(weekday)spénultièmeavant dernier %(weekday)stoutes les secondessecondestroisième %(weekday)santépénultièmetroisième dernier %(weekday)sjusqu'à %(date)shebdomadairesemainesannées././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/locale/fr/LC_MESSAGES/django.po0000644000076500000240000001556500000000000023732 0ustar00aleksistaff# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-24 23:21+0100\n" "PO-Revision-Date: 2017-02-24 23:23+0100\n" "Last-Translator: Olivier Le Brouster \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Poedit 1.5.4\n" #: base.py:1087 msgid "annually" msgstr "annuel" #: base.py:1087 msgid "monthly" msgstr "mensuellement" #: base.py:1087 msgid "weekly" msgstr "hebdomadaire" #: base.py:1087 msgid "daily" msgstr "quotidien" #: base.py:1088 msgid "hourly" msgstr "toutes les heures" #: base.py:1088 msgid "minutely" msgstr "toutes les minutes" #: base.py:1088 msgid "secondly" msgstr "toutes les secondes" #: base.py:1091 msgid "years" msgstr "années" #: base.py:1091 msgid "months" msgstr "mois" #: base.py:1091 msgid "weeks" msgstr "semaines" #: base.py:1091 msgid "days" msgstr "jours" #: base.py:1092 msgid "hours" msgstr "heures" #: base.py:1092 msgid "minutes" msgstr "minutes" #: base.py:1092 msgid "seconds" msgstr "secondes" #: base.py:1097 #, python-format msgid "1st %(weekday)s" msgstr "1er %(weekday)s" #: base.py:1098 #, python-format msgid "2nd %(weekday)s" msgstr "2ème %(weekday)s" #: base.py:1099 #, python-format msgid "3rd %(weekday)s" msgstr "3ème %(weekday)s" #: base.py:1100 base.py:1126 #, python-format msgid "last %(weekday)s" msgstr "dernier %(weekday)s" #: base.py:1101 #, python-format msgid "2nd last %(weekday)s" msgstr "avant dernier %(weekday)s" #: base.py:1102 #, python-format msgid "3rd last %(weekday)s" msgstr "3ème dernier %(weekday)s" #: base.py:1105 base.py:1131 msgid "last" msgstr "dernier" #: base.py:1106 msgid "2nd last" msgstr "2ème dernier" #: base.py:1107 msgid "3rd last" msgstr "3ème dernier" #: base.py:1108 msgid "4th last" msgstr "4ème dernier" #: base.py:1111 msgid "Mon" msgstr "Lun" #: base.py:1111 msgid "Tue" msgstr "Mar" #: base.py:1111 msgid "Wed" msgstr "Mer" #: base.py:1112 msgid "Thu" msgstr "Jeu" #: base.py:1112 msgid "Fri" msgstr "Ven" #: base.py:1112 msgid "Sat" msgstr "Sam" #: base.py:1112 msgid "Sun" msgstr "Dim" #: base.py:1115 msgid "Jan" msgstr "Jan" #: base.py:1115 msgid "Feb" msgstr "Fév" #: base.py:1115 msgid "Mar" msgstr "Mar" #: base.py:1115 msgid "Apr" msgstr "Avr" #: base.py:1116 msgid "Jun" msgstr "Juin" #: base.py:1116 msgid "Jul" msgstr "Juil" #: base.py:1116 msgid "Aug" msgstr "Aoû" #: base.py:1117 msgid "Sep" msgstr "Sep" #: base.py:1117 msgid "Oct" msgstr "Oct" #: base.py:1117 msgid "Nov" msgstr "Nov" #: base.py:1117 msgid "Dec" msgstr "Déc" #: base.py:1122 #, python-format msgid "first %(weekday)s" msgstr "premier %(weekday)s" #: base.py:1123 #, python-format msgid "second %(weekday)s" msgstr "deuxième %(weekday)s" #: base.py:1124 #, python-format msgid "third %(weekday)s" msgstr "troisième %(weekday)s" #: base.py:1125 #, python-format msgid "fourth %(weekday)s" msgstr "quatrième %(weekday)s" #: base.py:1127 #, python-format msgid "second last %(weekday)s" msgstr "avant dernier %(weekday)s" #: base.py:1128 #, python-format msgid "third last %(weekday)s" msgstr "troisième dernier %(weekday)s" #: base.py:1132 msgid "second last" msgstr "pénultième" #: base.py:1133 msgid "third last" msgstr "antépénultième" #: base.py:1134 msgid "fourth last" msgstr "quatrième dernier" #: base.py:1137 choices.py:17 msgid "Monday" msgstr "lundi" #: base.py:1137 choices.py:18 msgid "Tuesday" msgstr "mardi" #: base.py:1137 choices.py:19 msgid "Wednesday" msgstr "mercredi" #: base.py:1138 choices.py:20 msgid "Thursday" msgstr "jeudi" #: base.py:1138 choices.py:21 msgid "Friday" msgstr "vendredi" #: base.py:1138 choices.py:22 msgid "Saturday" msgstr "samedi" #: base.py:1138 choices.py:23 msgid "Sunday" msgstr "dimanche" #: base.py:1141 choices.py:27 msgid "January" msgstr "janvier" #: base.py:1141 choices.py:28 msgid "February" msgstr "février" #: base.py:1141 choices.py:29 msgid "March" msgstr "mars" #: base.py:1141 choices.py:30 msgid "April" msgstr "avril" #: base.py:1142 choices.py:32 msgid "June" msgstr "juin" #: base.py:1142 choices.py:33 msgid "July" msgstr "juillet" #: base.py:1142 choices.py:34 msgid "August" msgstr "août" #: base.py:1143 choices.py:35 msgid "September" msgstr "septembre" #: base.py:1143 choices.py:36 msgid "October" msgstr "octobre" #: base.py:1143 choices.py:37 msgid "November" msgstr "novembre" #: base.py:1143 choices.py:38 msgid "December" msgstr "décembre" #: base.py:1161 base.py:1178 base.py:1189 base.py:1202 base.py:1220 msgid ", " msgstr ", " #: base.py:1167 #, python-format msgid "every %(number)s %(freq)s" msgstr "tous les %(number)s %(freq)s" #: base.py:1181 base.py:1205 #, python-format msgid "each %(items)s" msgstr "chaque %(items)s" #: base.py:1184 base.py:1193 base.py:1197 #, python-format msgid "on the %(items)s" msgstr "pour le %(items)s" #: base.py:1212 msgid "occuring once" msgstr "se répète une fois" #: base.py:1214 #, python-format msgid "occuring %(number)s times" msgstr "se répète %(number)s fois" #: base.py:1217 #, python-format msgid "until %(date)s" msgstr "jusqu'à %(date)s" #: choices.py:7 msgid "Secondly" msgstr "Toutes les secondes" #: choices.py:8 msgid "Minutely" msgstr "Toutes les minutes" #: choices.py:9 msgid "Hourly" msgstr "Toutes les heures" #: choices.py:10 msgid "Daily" msgstr "Quotidien" #: choices.py:11 msgid "Weekly" msgstr "Hebdomadaire" #: choices.py:12 msgid "Monthly" msgstr "Mensuel" #: choices.py:13 msgid "Yearly" msgstr "Annuel" #: choices.py:31 msgid "May" msgstr "mai" #: choices.py:44 msgid "Inclusion" msgstr "Inclusion" #: choices.py:45 msgid "Exclusion" msgstr "Exclusion" #: forms.py:72 msgid "Invalid frequency." msgstr "Fréquence invalide" #: forms.py:74 #, python-format msgid "Max rules exceeded. The limit is %(limit)s" msgstr "Nombre maximum de règles dépassé. La limite est %(limit)s" #: forms.py:76 #, python-format msgid "Max exclusion rules exceeded. The limit is %(limit)s" msgstr "Nombre maximum de règles d'exclusion déppassé. La limite est %(limit)s" #: forms.py:78 #, python-format msgid "Max dates exceeded. The limit is %(limit)s" msgstr "Nombre maximum de dates dépassé. La limite est %(limit)s" #: forms.py:80 #, python-format msgid "Max exclusion dates exceeded. The limit is %(limit)s" msgstr "Nombre maximum de dates éxclues dépassé. La limite est %(limit)s" #~ msgid "year" #~ msgstr "année" #~ msgid "month" #~ msgstr "mois" #~ msgid "week" #~ msgstr "semaine" #~ msgid "day" #~ msgstr "jour" #~ msgid "hour" #~ msgstr "heure" #~ msgid "minute" #~ msgstr "minute" #~ msgid "second" #~ msgstr "seconde" ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/locale/fr/LC_MESSAGES/djangojs.mo0000644000076500000240000001271300000000000024254 0ustar00aleksistaff|x y               ! & - 6 ; ? D M R X q                       7 O S X ` g j q ~               % + / 9 R W ` f y }        !(19?NV]b{  .=BIOTtZ  +9S esv   $ -8<EGKPX]ejosx|  &*359?AGKQS\`ikp w  '.3;OV]px}  ';D[m *X5Fi_h0P?ybAW8MK'u +q^EZ;r"QpB.4)&n(Sv,O6Jdl3#IDtc@oCjf=1->kG%< 7LY!T2 {9`x g \Ne[Hw: /]a|V$RUzms1st %(weekday)s2nd %(weekday)s2nd last2nd last %(weekday)s3rd %(weekday)s3rd last3rd last %(weekday)s4th %(weekday)s4th lastAMAdd dateAdd ruleAprAprilAugAug.AugustCalendarDateDecDec.DecemberEachEveryExclude these occurencesExclude this dateFebFeb.FebruaryFrequencyFriFridayFriday first letterFJanJan.JanuaryJulJulyJunJuneMarMarchMonMondayMonday first letterMNovNov.NovemberOccurs %(number)s timeOccurs %(number)s timesOctOct.OctoberOn thePMRemoveRepeat untilSatSaturdaySaturday first letterSSepSept.SeptemberSunSundaySunday first letterSThuThursdayThursday first letterTTimeTueTuesdayTuesday first letterTUntilWedWednesdayWednesday first letterWa.m.annuallydailydate%l, %F %j, %Ydaydayseach %(items)severy %(number)s %(freq)sexcludingfirst %(weekday)sfourth %(weekday)sfourth lasthourhourlyhoursincludinglastlast %(weekday)smidnightminuteminutelyminutesmonthmonth nameMaymonthlymonthsnoonoccuring %(number)s timeoccuring %(number)s timeson the %(items)sp.m.secondsecond %(weekday)ssecond lastsecond last %(weekday)ssecondlysecondsthird %(weekday)sthird lastthird last %(weekday)suntil %(date)sweekweeklyweeksyearyearsProject-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2017-02-24 23:11+0100 PO-Revision-Date: 2017-02-24 23:19+0100 Last-Translator: Olivier Le Brouster Language-Team: LANGUAGE Language: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 1.5.4 1er %(weekday)s2ème %(weekday)s2ème dernieravant dernier %(weekday)s3ème %(weekday)s3ème dernier3ème dernier %(weekday)s4ème %(weekday)s4ème dernierAMAjouter une dateAjouter une règleAvravrilAoûAoû.aoûtCalendrierDateDécDéc.décembreChaqueTou(te)s lesExclure ces occurrencesExclure cette dateFévFév.févrierFréquenceVenvendrediVJanJan.janvierJuiljuilletJuinjuinMarmarsLunlundiLNovNov.novembreSe répète %(number)s foisSe répète %(number)s foisOctOct.octobrePour lePMEnleverRépéter jusqu'àSamsamediSSepSept.septembreDimdimancheDJeujeudiJHeureMarmardiMJusqu'auMermercrediMa.m.annuelquotidien%l %j %F %Yjourjourschaque %(items)stou(te)s les %(number)s %(freq)shormispremier %(weekday)squatrième %(weekday)squatrième dernierheuretoutes les heuresheuresavecdernierdernier %(weekday)sminuitminutetoutes les minutesminutesmoismaimensuelmoismidise répète %(number)s foisse répète %(number)s foispour le %(items)sp.m.secondedeuxième %(weekday)spénultièmeavant dernier %(weekday)stoutes les secondessecondestroisième %(weekday)santépénultièmetroisième dernier %(weekday)sjusqu'au %(date)ssemainehebdomadairesemainesannéeannées././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/locale/fr/LC_MESSAGES/djangojs.po0000644000076500000240000002630000000000000024254 0ustar00aleksistaff# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-24 23:11+0100\n" "PO-Revision-Date: 2017-02-24 23:19+0100\n" "Last-Translator: Olivier Le Brouster \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.5.4\n" #: static/recurrence/js/recurrence-widget.js:1609 msgctxt "date" msgid "%l, %F %j, %Y" msgstr "%l %j %F %Y" #: static/recurrence/js/recurrence-widget.js:1774 msgid "including" msgstr "avec" #: static/recurrence/js/recurrence-widget.js:1774 msgid "excluding" msgstr "hormis" #: static/recurrence/js/recurrence-widget.js:1778 msgid "Frequency" msgstr "Fréquence" #: static/recurrence/js/recurrence-widget.js:1779 msgid "On the" msgstr "Pour le" #: static/recurrence/js/recurrence-widget.js:1780 msgid "Each" msgstr "Chaque" #: static/recurrence/js/recurrence-widget.js:1781 msgid "Every" msgstr "Tou(te)s les" #: static/recurrence/js/recurrence-widget.js:1782 msgid "Until" msgstr "Jusqu'au" #: static/recurrence/js/recurrence-widget.js:1783 msgid "Occurs %(number)s time" msgstr "Se répète %(number)s fois" #: static/recurrence/js/recurrence-widget.js:1784 msgid "Occurs %(number)s times" msgstr "Se répète %(number)s fois" #: static/recurrence/js/recurrence-widget.js:1785 msgid "Date" msgstr "Date" #: static/recurrence/js/recurrence-widget.js:1786 msgid "Time" msgstr "Heure" #: static/recurrence/js/recurrence-widget.js:1787 msgid "Repeat until" msgstr "Répéter jusqu'à" #: static/recurrence/js/recurrence-widget.js:1788 msgid "Exclude these occurences" msgstr "Exclure ces occurrences" #: static/recurrence/js/recurrence-widget.js:1789 msgid "Exclude this date" msgstr "Exclure cette date" #: static/recurrence/js/recurrence-widget.js:1790 msgid "Add rule" msgstr "Ajouter une règle" #: static/recurrence/js/recurrence-widget.js:1791 msgid "Add date" msgstr "Ajouter une date" #: static/recurrence/js/recurrence-widget.js:1792 msgid "Remove" msgstr "Enlever" #: static/recurrence/js/recurrence-widget.js:1793 msgid "Calendar" msgstr "Calendrier" #: static/recurrence/js/recurrence.js:218 msgctxt "Until date format" msgid "%Y-%m-%d" msgstr "" #: static/recurrence/js/recurrence.js:1017 msgid "midnight" msgstr "minuit" #: static/recurrence/js/recurrence.js:1018 msgid "noon" msgstr "midi" #: static/recurrence/js/recurrence.js:1019 msgid "on the %(items)s" msgstr "pour le %(items)s" #: static/recurrence/js/recurrence.js:1020 msgid "every %(number)s %(freq)s" msgstr "tou(te)s les %(number)s %(freq)s" #: static/recurrence/js/recurrence.js:1021 msgid "each %(items)s" msgstr "chaque %(items)s" #: static/recurrence/js/recurrence.js:1022 msgid "occuring %(number)s time" msgstr "se répète %(number)s fois" #: static/recurrence/js/recurrence.js:1023 msgid "occuring %(number)s times" msgstr "se répète %(number)s fois" #: static/recurrence/js/recurrence.js:1024 msgid "until %(date)s" msgstr "jusqu'au %(date)s" #: static/recurrence/js/recurrence.js:1028 msgid "year" msgstr "année" #: static/recurrence/js/recurrence.js:1028 msgid "month" msgstr "mois" #: static/recurrence/js/recurrence.js:1028 msgid "week" msgstr "semaine" #: static/recurrence/js/recurrence.js:1028 msgid "day" msgstr "jour" #: static/recurrence/js/recurrence.js:1029 msgid "hour" msgstr "heure" #: static/recurrence/js/recurrence.js:1029 msgid "minute" msgstr "minute" #: static/recurrence/js/recurrence.js:1029 msgid "second" msgstr "seconde" #: static/recurrence/js/recurrence.js:1032 msgid "years" msgstr "années" #: static/recurrence/js/recurrence.js:1032 msgid "months" msgstr "mois" #: static/recurrence/js/recurrence.js:1032 msgid "weeks" msgstr "semaines" #: static/recurrence/js/recurrence.js:1032 msgid "days" msgstr "jours" #: static/recurrence/js/recurrence.js:1033 msgid "hours" msgstr "heures" #: static/recurrence/js/recurrence.js:1033 msgid "minutes" msgstr "minutes" #: static/recurrence/js/recurrence.js:1033 msgid "seconds" msgstr "secondes" #: static/recurrence/js/recurrence.js:1036 msgid "annually" msgstr "annuel" #: static/recurrence/js/recurrence.js:1036 msgid "monthly" msgstr "mensuel" #: static/recurrence/js/recurrence.js:1036 msgid "weekly" msgstr "hebdomadaire" #: static/recurrence/js/recurrence.js:1036 msgid "daily" msgstr "quotidien" #: static/recurrence/js/recurrence.js:1037 msgid "hourly" msgstr "toutes les heures" #: static/recurrence/js/recurrence.js:1037 msgid "minutely" msgstr "toutes les minutes" #: static/recurrence/js/recurrence.js:1037 msgid "secondly" msgstr "toutes les secondes" #: static/recurrence/js/recurrence.js:1040 msgid "Monday" msgstr "lundi" #: static/recurrence/js/recurrence.js:1040 msgid "Tuesday" msgstr "mardi" #: static/recurrence/js/recurrence.js:1040 msgid "Wednesday" msgstr "mercredi" #: static/recurrence/js/recurrence.js:1040 msgid "Thursday" msgstr "jeudi" #: static/recurrence/js/recurrence.js:1041 msgid "Friday" msgstr "vendredi" #: static/recurrence/js/recurrence.js:1041 msgid "Saturday" msgstr "samedi" #: static/recurrence/js/recurrence.js:1041 msgid "Sunday" msgstr "dimanche" #: static/recurrence/js/recurrence.js:1044 msgid "Mon" msgstr "Lun" #: static/recurrence/js/recurrence.js:1044 msgid "Tue" msgstr "Mar" #: static/recurrence/js/recurrence.js:1044 msgid "Wed" msgstr "Mer" #: static/recurrence/js/recurrence.js:1044 msgid "Thu" msgstr "Jeu" #: static/recurrence/js/recurrence.js:1045 msgid "Fri" msgstr "Ven" #: static/recurrence/js/recurrence.js:1045 msgid "Sat" msgstr "Sam" #: static/recurrence/js/recurrence.js:1045 msgid "Sun" msgstr "Dim" #: static/recurrence/js/recurrence.js:1048 msgctxt "Monday first letter" msgid "M" msgstr "L" #: static/recurrence/js/recurrence.js:1049 msgctxt "Tuesday first letter" msgid "T" msgstr "M" #: static/recurrence/js/recurrence.js:1050 msgctxt "Wednesday first letter" msgid "W" msgstr "M" #: static/recurrence/js/recurrence.js:1051 msgctxt "Thursday first letter" msgid "T" msgstr "J" #: static/recurrence/js/recurrence.js:1052 msgctxt "Friday first letter" msgid "F" msgstr "V" #: static/recurrence/js/recurrence.js:1053 msgctxt "Saturday first letter" msgid "S" msgstr "S" #: static/recurrence/js/recurrence.js:1054 msgctxt "Sunday first letter" msgid "S" msgstr "D" #: static/recurrence/js/recurrence.js:1057 msgid "first %(weekday)s" msgstr "premier %(weekday)s" #: static/recurrence/js/recurrence.js:1058 msgid "second %(weekday)s" msgstr "deuxième %(weekday)s" #: static/recurrence/js/recurrence.js:1059 msgid "third %(weekday)s" msgstr "troisième %(weekday)s" #: static/recurrence/js/recurrence.js:1060 msgid "fourth %(weekday)s" msgstr "quatrième %(weekday)s" #: static/recurrence/js/recurrence.js:1061 #: static/recurrence/js/recurrence.js:1070 msgid "last %(weekday)s" msgstr "dernier %(weekday)s" #: static/recurrence/js/recurrence.js:1062 msgid "second last %(weekday)s" msgstr "avant dernier %(weekday)s" #: static/recurrence/js/recurrence.js:1063 msgid "third last %(weekday)s" msgstr "troisième dernier %(weekday)s" #: static/recurrence/js/recurrence.js:1066 msgid "1st %(weekday)s" msgstr "1er %(weekday)s" #: static/recurrence/js/recurrence.js:1067 msgid "2nd %(weekday)s" msgstr "2ème %(weekday)s" #: static/recurrence/js/recurrence.js:1068 msgid "3rd %(weekday)s" msgstr "3ème %(weekday)s" #: static/recurrence/js/recurrence.js:1069 msgid "4th %(weekday)s" msgstr "4ème %(weekday)s" #: static/recurrence/js/recurrence.js:1071 msgid "2nd last %(weekday)s" msgstr "avant dernier %(weekday)s" #: static/recurrence/js/recurrence.js:1072 msgid "3rd last %(weekday)s" msgstr "3ème dernier %(weekday)s" #: static/recurrence/js/recurrence.js:1075 #: static/recurrence/js/recurrence.js:1081 msgid "last" msgstr "dernier" #: static/recurrence/js/recurrence.js:1076 msgid "second last" msgstr "pénultième" #: static/recurrence/js/recurrence.js:1077 msgid "third last" msgstr "antépénultième" #: static/recurrence/js/recurrence.js:1078 msgid "fourth last" msgstr "quatrième dernier" #: static/recurrence/js/recurrence.js:1082 msgid "2nd last" msgstr "2ème dernier" #: static/recurrence/js/recurrence.js:1083 msgid "3rd last" msgstr "3ème dernier" #: static/recurrence/js/recurrence.js:1084 msgid "4th last" msgstr "4ème dernier" #: static/recurrence/js/recurrence.js:1087 msgid "January" msgstr "janvier" #: static/recurrence/js/recurrence.js:1087 msgid "February" msgstr "février" #: static/recurrence/js/recurrence.js:1087 #: static/recurrence/js/recurrence.js:1099 msgid "March" msgstr "mars" #: static/recurrence/js/recurrence.js:1088 #: static/recurrence/js/recurrence.js:1100 msgid "April" msgstr "avril" #: static/recurrence/js/recurrence.js:1088 #: static/recurrence/js/recurrence.js:1094 #: static/recurrence/js/recurrence.js:1100 msgctxt "month name" msgid "May" msgstr "mai" #: static/recurrence/js/recurrence.js:1088 #: static/recurrence/js/recurrence.js:1100 msgid "June" msgstr "juin" #: static/recurrence/js/recurrence.js:1089 #: static/recurrence/js/recurrence.js:1101 msgid "July" msgstr "juillet" #: static/recurrence/js/recurrence.js:1089 msgid "August" msgstr "août" #: static/recurrence/js/recurrence.js:1089 msgid "September" msgstr "septembre" #: static/recurrence/js/recurrence.js:1090 msgid "October" msgstr "octobre" #: static/recurrence/js/recurrence.js:1090 msgid "November" msgstr "novembre" #: static/recurrence/js/recurrence.js:1090 msgid "December" msgstr "décembre" #: static/recurrence/js/recurrence.js:1093 msgid "Jan" msgstr "Jan" #: static/recurrence/js/recurrence.js:1093 msgid "Feb" msgstr "Fév" #: static/recurrence/js/recurrence.js:1093 msgid "Mar" msgstr "Mar" #: static/recurrence/js/recurrence.js:1094 msgid "Apr" msgstr "Avr" #: static/recurrence/js/recurrence.js:1094 msgid "Jun" msgstr "Juin" #: static/recurrence/js/recurrence.js:1095 msgid "Jul" msgstr "Juil" #: static/recurrence/js/recurrence.js:1095 msgid "Aug" msgstr "Aoû" #: static/recurrence/js/recurrence.js:1095 msgid "Sep" msgstr "Sep" #: static/recurrence/js/recurrence.js:1096 msgid "Oct" msgstr "Oct" #: static/recurrence/js/recurrence.js:1096 msgid "Nov" msgstr "Nov" #: static/recurrence/js/recurrence.js:1096 msgid "Dec" msgstr "Déc" #: static/recurrence/js/recurrence.js:1099 msgid "Jan." msgstr "Jan." #: static/recurrence/js/recurrence.js:1099 msgid "Feb." msgstr "Fév." #: static/recurrence/js/recurrence.js:1101 msgid "Aug." msgstr "Aoû." #: static/recurrence/js/recurrence.js:1101 msgid "Sept." msgstr "Sept." #: static/recurrence/js/recurrence.js:1102 msgid "Oct." msgstr "Oct." #: static/recurrence/js/recurrence.js:1102 msgid "Nov." msgstr "Nov." #: static/recurrence/js/recurrence.js:1102 msgid "Dec." msgstr "Déc." #: static/recurrence/js/recurrence.js:1105 msgid "a.m." msgstr "a.m." #: static/recurrence/js/recurrence.js:1105 msgid "p.m." msgstr "p.m." #: static/recurrence/js/recurrence.js:1106 msgid "AM" msgstr "AM" #: static/recurrence/js/recurrence.js:1106 msgid "PM" msgstr "PM" #: static/recurrence/js/recurrence.js:1108 msgctxt "Day of month" msgid "%j%S" msgstr "" #~ msgid "last day" #~ msgstr "dernier jour" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1643105481.2651062 django-recurrence-1.11.1/recurrence/locale/he/0000755000076500000240000000000000000000000020314 5ustar00aleksistaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1643105481.2953212 django-recurrence-1.11.1/recurrence/locale/he/LC_MESSAGES/0000755000076500000240000000000000000000000022101 5ustar00aleksistaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/locale/he/LC_MESSAGES/django.mo0000644000076500000240000001171000000000000023700 0ustar00aleksistaff] *:CXaekov|  *4" 4W *                = ] a j n v z              # , 4 < C ] k |            * & . &K (r  *     ,: B MX ^ko   AN:\Q8 ?M Q_o w  U7;MQcgy '0 9D]f o z &  -8O*n   U* T(EB R] ?OCP6"#: K7LZ&I35/NS$.1F[< A'D-W=HM2 G4)\@Y>X980;V,+%!JQ, 1st %(weekday)s2nd %(weekday)s2nd last2nd last %(weekday)s3rd %(weekday)s3rd last3rd last %(weekday)s4th lastAprAprilAugAugustDailyDecDecemberExclusionFebFebruaryFriFridayHourlyInclusionInvalid frequency.JanJanuaryJulJulyJunJuneMarMarchMax dates exceeded. The limit is %(limit)sMax exclusion dates exceeded. The limit is %(limit)sMax exclusion rules exceeded. The limit is %(limit)sMax rules exceeded. The limit is %(limit)sMayMinutelyMonMondayMonthlyNovNovemberOctOctoberSatSaturdaySecondlySepSeptemberSunSundayThis field is required. Set either a recurrence rule or date.ThuThursdayTueTuesdayWedWednesdayWeeklyYearlyannuallydailydayseach %(items)severy %(number)s %(freq)sfirst %(weekday)sfourth %(weekday)sfourth lasthourlyhourslastlast %(weekday)sminutelyminutesmonthlymonthsoccuring %(number)s timesoccuring onceon the %(items)ssecond %(weekday)ssecond lastsecond last %(weekday)ssecondlysecondsthird %(weekday)sthird lastthird last %(weekday)suntil %(date)sweeklyweeksyearsProject-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2019-08-11 20:24+0300 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit , %(weekday)s ראשון לפני אחרון%(weekday)s שני לפני אחרוןשני לפני האחרון%(weekday)s שני לפני אחרון%(weekday)s שלוש לפני אחרוןשלישי לפני אחרון%(weekday)s שלישי לפני אחרוןרביעי לפני אחרוןאפר'אפרילאוג'אוגוסטמדי יוםדצמ'דצמברהחרגהפב'פברוארו'יום שישימדי שעההכללהתדירות לא ולידי.ינו'ינואריול'יולייוניונימרץמרץכמות התאריכים עברה. המגבלה היא %(limit)sכמות התאריכים החרגים עברה. המגבלה היא %(limit)sכמות מקסימלי של חוקים החרגים עברה. המגבלה היא %(limit)sכמות מקסימלית של חוקים עברה. המגבלה היא %(limit)sמאימדי דקהב'יום שנימדי חודשנוב'נובמבראוק'אוקטוברש'יום שבתשניתספט'ספטמברא'יום ראשוןהשדה הזאת נדרש. קבע או חוק חזרות או תאריך חזרות.ה'יום חמישיג'יום שלישיד'יום רביעימדי שבועמדי שנהשנתייומיימיםכל %(items)sכל %(number)s %(freq)s%(weekday)s ראשון%(weekday)s רביעירביעי לפני אחרוןשעתישעותאחרון%(weekday)s האחרוןדקתידקותחודשיחודשיםמקרה %(number)s פעמיםמקרה חד פעמיבה%(items)s%(weekday)s שנישני לפני אחרון%(weekday)s שני לפני אחרוןשנייתישניות%(weekday)s שלישישלישי לפני אחרון%(weekday)s שלישי לפני אחרוןעד %(date)sשבועישבועותשנים././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/locale/he/LC_MESSAGES/django.po0000644000076500000240000002027600000000000023712 0ustar00aleksistaff# Hebrew translation # This file is distributed under the same license as the PACKAGE package. # Ben Lewis , 2019. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-08-11 20:24+0300\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: recurrence/base.py:1111 msgid "annually" msgstr "שנתי" #: recurrence/base.py:1111 msgid "monthly" msgstr "חודשי" #: recurrence/base.py:1111 msgid "weekly" msgstr "שבועי" #: recurrence/base.py:1111 msgid "daily" msgstr "יומי" #: recurrence/base.py:1112 msgid "hourly" msgstr "שעתי" #: recurrence/base.py:1112 msgid "minutely" msgstr "דקתי" #: recurrence/base.py:1112 msgid "secondly" msgstr "שנייתי" #: recurrence/base.py:1115 msgid "years" msgstr "שנים" #: recurrence/base.py:1115 msgid "months" msgstr "חודשים" #: recurrence/base.py:1115 msgid "weeks" msgstr "שבועות" #: recurrence/base.py:1115 msgid "days" msgstr "ימים" #: recurrence/base.py:1116 msgid "hours" msgstr "שעות" #: recurrence/base.py:1116 msgid "minutes" msgstr "דקות" #: recurrence/base.py:1116 msgid "seconds" msgstr "שניות" #: recurrence/base.py:1121 #, python-format msgid "1st %(weekday)s" msgstr "%(weekday)s ראשון לפני אחרון" #: recurrence/base.py:1122 #, python-format msgid "2nd %(weekday)s" msgstr "%(weekday)s שני לפני אחרון" #: recurrence/base.py:1123 #, python-format msgid "3rd %(weekday)s" msgstr "%(weekday)s שלוש לפני אחרון" #: recurrence/base.py:1124 recurrence/base.py:1150 #, python-format msgid "last %(weekday)s" msgstr "%(weekday)s האחרון" #: recurrence/base.py:1125 #, python-format msgid "2nd last %(weekday)s" msgstr "%(weekday)s שני לפני אחרון" #: recurrence/base.py:1126 #, python-format msgid "3rd last %(weekday)s" msgstr "%(weekday)s שלישי לפני אחרון" #: recurrence/base.py:1129 recurrence/base.py:1155 msgid "last" msgstr "אחרון" #: recurrence/base.py:1130 msgid "2nd last" msgstr "שני לפני האחרון" #: recurrence/base.py:1131 msgid "3rd last" msgstr "שלישי לפני אחרון" #: recurrence/base.py:1132 msgid "4th last" msgstr "רביעי לפני אחרון" #: recurrence/base.py:1135 msgid "Mon" msgstr "ב'" #: recurrence/base.py:1135 msgid "Tue" msgstr "ג'" #: recurrence/base.py:1135 msgid "Wed" msgstr "ד'" #: recurrence/base.py:1136 msgid "Thu" msgstr "ה'" #: recurrence/base.py:1136 msgid "Fri" msgstr "ו'" #: recurrence/base.py:1136 msgid "Sat" msgstr "ש'" #: recurrence/base.py:1136 msgid "Sun" msgstr "א'" #: recurrence/base.py:1139 msgid "Jan" msgstr "ינו'" #: recurrence/base.py:1139 msgid "Feb" msgstr "פב'" #: recurrence/base.py:1139 msgid "Mar" msgstr "מרץ" #: recurrence/base.py:1139 msgid "Apr" msgstr "אפר'" #: recurrence/base.py:1140 msgid "Jun" msgstr "יונ" #: recurrence/base.py:1140 msgid "Jul" msgstr "יול'" #: recurrence/base.py:1140 msgid "Aug" msgstr "אוג'" #: recurrence/base.py:1141 msgid "Sep" msgstr "ספט'" #: recurrence/base.py:1141 msgid "Oct" msgstr "אוק'" #: recurrence/base.py:1141 msgid "Nov" msgstr "נוב'" #: recurrence/base.py:1141 msgid "Dec" msgstr "דצמ'" #: recurrence/base.py:1146 #, python-format msgid "first %(weekday)s" msgstr "%(weekday)s ראשון" #: recurrence/base.py:1147 #, python-format msgid "second %(weekday)s" msgstr "%(weekday)s שני" #: recurrence/base.py:1148 #, python-format msgid "third %(weekday)s" msgstr "%(weekday)s שלישי" #: recurrence/base.py:1149 #, python-format msgid "fourth %(weekday)s" msgstr "%(weekday)s רביעי" #: recurrence/base.py:1151 #, python-format msgid "second last %(weekday)s" msgstr "%(weekday)s שני לפני אחרון" #: recurrence/base.py:1152 #, python-format msgid "third last %(weekday)s" msgstr "%(weekday)s שלישי לפני אחרון" #: recurrence/base.py:1156 msgid "second last" msgstr "שני לפני אחרון" #: recurrence/base.py:1157 msgid "third last" msgstr "שלישי לפני אחרון" #: recurrence/base.py:1158 msgid "fourth last" msgstr "רביעי לפני אחרון" #: recurrence/base.py:1161 recurrence/choices.py:17 msgid "Monday" msgstr "יום שני" #: recurrence/base.py:1161 recurrence/choices.py:18 msgid "Tuesday" msgstr "יום שלישי" #: recurrence/base.py:1161 recurrence/choices.py:19 msgid "Wednesday" msgstr "יום רביעי" #: recurrence/base.py:1162 recurrence/choices.py:20 msgid "Thursday" msgstr "יום חמישי" #: recurrence/base.py:1162 recurrence/choices.py:21 msgid "Friday" msgstr "יום שישי" #: recurrence/base.py:1162 recurrence/choices.py:22 msgid "Saturday" msgstr "יום שבת" #: recurrence/base.py:1162 recurrence/choices.py:23 msgid "Sunday" msgstr "יום ראשון" #: recurrence/base.py:1165 recurrence/choices.py:27 msgid "January" msgstr "ינואר" #: recurrence/base.py:1165 recurrence/choices.py:28 msgid "February" msgstr "פברואר" #: recurrence/base.py:1165 recurrence/choices.py:29 msgid "March" msgstr "מרץ" #: recurrence/base.py:1165 recurrence/choices.py:30 msgid "April" msgstr "אפריל" #: recurrence/base.py:1166 recurrence/choices.py:32 msgid "June" msgstr "יוני" #: recurrence/base.py:1166 recurrence/choices.py:33 msgid "July" msgstr "יולי" #: recurrence/base.py:1166 recurrence/choices.py:34 msgid "August" msgstr "אוגוסט" #: recurrence/base.py:1167 recurrence/choices.py:35 msgid "September" msgstr "ספטמבר" #: recurrence/base.py:1167 recurrence/choices.py:36 msgid "October" msgstr "אוקטובר" #: recurrence/base.py:1167 recurrence/choices.py:37 msgid "November" msgstr "נובמבר" #: recurrence/base.py:1167 recurrence/choices.py:38 msgid "December" msgstr "דצמבר" #: recurrence/base.py:1185 recurrence/base.py:1202 recurrence/base.py:1213 #: recurrence/base.py:1226 recurrence/base.py:1244 msgid ", " msgstr ", " #: recurrence/base.py:1191 #, python-format msgid "every %(number)s %(freq)s" msgstr "כל %(number)s %(freq)s" #: recurrence/base.py:1205 recurrence/base.py:1229 #, python-format msgid "each %(items)s" msgstr "כל %(items)s" #: recurrence/base.py:1208 recurrence/base.py:1217 recurrence/base.py:1221 #, python-format msgid "on the %(items)s" msgstr "בה%(items)s" #: recurrence/base.py:1236 msgid "occuring once" msgstr "מקרה חד פעמי" #: recurrence/base.py:1238 #, python-format msgid "occuring %(number)s times" msgstr "מקרה %(number)s פעמים" #: recurrence/base.py:1241 #, python-format msgid "until %(date)s" msgstr "עד %(date)s" #: recurrence/choices.py:7 msgid "Secondly" msgstr "שנית" #: recurrence/choices.py:8 msgid "Minutely" msgstr "מדי דקה" #: recurrence/choices.py:9 msgid "Hourly" msgstr "מדי שעה" #: recurrence/choices.py:10 msgid "Daily" msgstr "מדי יום" #: recurrence/choices.py:11 msgid "Weekly" msgstr "מדי שבוע" #: recurrence/choices.py:12 msgid "Monthly" msgstr "מדי חודש" #: recurrence/choices.py:13 msgid "Yearly" msgstr "מדי שנה" #: recurrence/choices.py:31 msgid "May" msgstr "מאי" #: recurrence/choices.py:44 msgid "Inclusion" msgstr "הכללה" #: recurrence/choices.py:45 msgid "Exclusion" msgstr "החרגה" #: recurrence/forms.py:52 msgid "Invalid frequency." msgstr "תדירות לא ולידי." #: recurrence/forms.py:54 #, python-format msgid "Max rules exceeded. The limit is %(limit)s" msgstr "כמות מקסימלית של חוקים עברה. המגבלה היא %(limit)s" #: recurrence/forms.py:56 #, python-format msgid "Max exclusion rules exceeded. The limit is %(limit)s" msgstr "כמות מקסימלי של חוקים החרגים עברה. המגבלה היא %(limit)s" #: recurrence/forms.py:58 #, python-format msgid "Max dates exceeded. The limit is %(limit)s" msgstr "כמות התאריכים עברה. המגבלה היא %(limit)s" #: recurrence/forms.py:60 #, python-format msgid "Max exclusion dates exceeded. The limit is %(limit)s" msgstr "כמות התאריכים החרגים עברה. המגבלה היא %(limit)s" #: recurrence/forms.py:62 msgid "This field is required. Set either a recurrence rule or date." msgstr "השדה הזאת נדרש. קבע או חוק חזרות או תאריך חזרות." ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/locale/he/LC_MESSAGES/djangojs.mo0000644000076500000240000001314300000000000024237 0ustar00aleksistaff{h i y                 & + / 4 = B H a s w |                    ' ? C H P W Z a n r {                ) B G P V Z _ n          +3:?Xr   &,17  *;f}&# *5< D Q _jq y%#   '29BIRY` dru|    $'. 6 CN`cgy| )@_fox     4 A KVi*  & $2 ; FSZ*W5Fh^g0P?xaAV8MK't +p]EY;q"QoB.4)&m(Ru,O6Jck3#IDsb@nCie=1->jG%< 7LX!S2 z9w f [NdZHv: /\`{U$_Tylr1st %(weekday)s2nd %(weekday)s2nd last2nd last %(weekday)s3rd %(weekday)s3rd last3rd last %(weekday)s4th %(weekday)s4th lastAMAdd dateAdd ruleAprAprilAugAug.AugustCalendarDateDecDec.DecemberEachEveryExclude these occurencesExclude this dateFebFeb.FebruaryFrequencyFriFridayFriday first letterFJanJan.JanuaryJulJulyJunJuneMarMarchMonMondayMonday first letterMNovNov.NovemberOccurs %(number)s timeOccurs %(number)s timesOctOct.OctoberOn thePMRemoveRepeat untilSatSaturdaySaturday first letterSSepSept.SeptemberSunSundaySunday first letterSThuThursdayThursday first letterTTimeTueTuesdayTuesday first letterTUntilWedWednesdayWednesday first letterWa.m.annuallydailydaydayseach %(items)severy %(number)s %(freq)sexcludingfirst %(weekday)sfourth %(weekday)sfourth lasthourhourlyhoursincludinglastlast %(weekday)smidnightminuteminutelyminutesmonthmonth nameMaymonthlymonthsnoonoccuring %(number)s timeoccuring %(number)s timeson the %(items)sp.m.secondsecond %(weekday)ssecond lastsecond last %(weekday)ssecondlysecondsthird %(weekday)sthird lastthird last %(weekday)suntil %(date)sweekweeklyweeksyearyearsProject-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2019-08-11 20:24+0300 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit %(weekday)s ראשון%(weekday)s שנישני לפני אחרון%(weekday)s ראשון לפני אחרון%(weekday)s שלישישלישי לפני אחרון%(weekday)s שני לפני אחרון%(weekday)s רביעירביעי לפני אחרון הוסיף תאריךהוסיף חוקאפראפרילאוגאוג'אוגוסטלוח שנהתאריךדצמדצמ'דצמברכלכלמחריג את הפעמים האלהמרחיג את התאריך הזהפברפבר'פברוארתדירותו'יום שישיוינוינו'ינואריוליולייוניונימרץמרץב'יום שניבנובנוב'נובמברקורא %(number)s פעםקורא %(number)s פעמיםאוקאוק'אוקטוברעל האחה"צמסירחוזר עדש'יום שבתשספטספט'ספטמבריום א'יום ראשוןאה'יום חמישיהשעהג'יום שלישיגעדד'יום רביעיד שנתיימייוםימיםכל %(items)sכל %(number)s %(freq)sלא כולל%(weekday)s ראשון%(weekday)s רביעישלישי לפני אחרוןשעהשעתישעותכוללאחרון%(weekday)s אחרוןחצותדקהדקתידקותחודשמאיחודשיחודשיםצהרייםקורה %(number)s פעםקורה %(number)s פעמיםבה%(item)sאחה"צשנייה%(weekday)s שניראשון לפני אחרון%(weekday)s ראשון לפני אחרוןשנייתישניות%(weekday)s שלישישני לפני אחרון%(weekday)s שני לפני אחרוןעד %(date)sשבועשבועישבועותשנהשנים././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/locale/he/LC_MESSAGES/djangojs.po0000644000076500000240000002602700000000000024247 0ustar00aleksistaff# Hebrew translation # This file is distributed under the same license as the PACKAGE package. # Ben Lewis , 2019. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-08-11 20:24+0300\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: static/recurrence/js/recurrence-widget.js:1774 msgid "including" msgstr "כולל" #: static/recurrence/js/recurrence-widget.js:1774 msgid "excluding" msgstr "לא כולל" #: static/recurrence/js/recurrence-widget.js:1778 msgid "Frequency" msgstr "תדירות" #: static/recurrence/js/recurrence-widget.js:1779 msgid "On the" msgstr "על ה" #: static/recurrence/js/recurrence-widget.js:1780 msgid "Each" msgstr "כל" #: static/recurrence/js/recurrence-widget.js:1781 msgid "Every" msgstr "כל" #: static/recurrence/js/recurrence-widget.js:1782 msgid "Until" msgstr "עד" #: static/recurrence/js/recurrence-widget.js:1783 msgid "Occurs %(number)s time" msgstr "קורא %(number)s פעם" #: static/recurrence/js/recurrence-widget.js:1784 msgid "Occurs %(number)s times" msgstr "קורא %(number)s פעמים" #: static/recurrence/js/recurrence-widget.js:1785 msgid "Date" msgstr "תאריך" #: static/recurrence/js/recurrence-widget.js:1786 msgid "Time" msgstr "שעה" #: static/recurrence/js/recurrence-widget.js:1787 msgid "Repeat until" msgstr "חוזר עד" #: static/recurrence/js/recurrence-widget.js:1788 msgid "Exclude these occurences" msgstr "מחריג את הפעמים האלה" #: static/recurrence/js/recurrence-widget.js:1789 msgid "Exclude this date" msgstr "מרחיג את התאריך הזה" #: static/recurrence/js/recurrence-widget.js:1790 msgid "Add rule" msgstr "הוסיף חוק" #: static/recurrence/js/recurrence-widget.js:1791 msgid "Add date" msgstr "הוסיף תאריך" #: static/recurrence/js/recurrence-widget.js:1792 msgid "Remove" msgstr "מסיר" #: static/recurrence/js/recurrence-widget.js:1793 msgid "Calendar" msgstr "לוח שנה" #: static/recurrence/js/recurrence.js:1017 msgid "midnight" msgstr "חצות" #: static/recurrence/js/recurrence.js:1018 msgid "noon" msgstr "צהריים" #: static/recurrence/js/recurrence.js:1019 msgid "on the %(items)s" msgstr "בה%(item)s" #: static/recurrence/js/recurrence.js:1020 msgid "every %(number)s %(freq)s" msgstr "כל %(number)s %(freq)s" #: static/recurrence/js/recurrence.js:1021 msgid "each %(items)s" msgstr "כל %(items)s" #: static/recurrence/js/recurrence.js:1022 msgid "occuring %(number)s time" msgstr "קורה %(number)s פעם" #: static/recurrence/js/recurrence.js:1023 msgid "occuring %(number)s times" msgstr "קורה %(number)s פעמים" #: static/recurrence/js/recurrence.js:1024 msgid "until %(date)s" msgstr "עד %(date)s" #: static/recurrence/js/recurrence.js:1028 msgid "year" msgstr "שנה" #: static/recurrence/js/recurrence.js:1028 msgid "month" msgstr "חודש" #: static/recurrence/js/recurrence.js:1028 msgid "week" msgstr "שבוע" #: static/recurrence/js/recurrence.js:1028 msgid "day" msgstr "יום" #: static/recurrence/js/recurrence.js:1029 msgid "hour" msgstr "שעה" #: static/recurrence/js/recurrence.js:1029 msgid "minute" msgstr "דקה" #: static/recurrence/js/recurrence.js:1029 msgid "second" msgstr "שנייה" #: static/recurrence/js/recurrence.js:1032 msgid "years" msgstr "שנים" #: static/recurrence/js/recurrence.js:1032 msgid "months" msgstr "חודשים" #: static/recurrence/js/recurrence.js:1032 msgid "weeks" msgstr "שבועות" #: static/recurrence/js/recurrence.js:1032 msgid "days" msgstr "ימים" #: static/recurrence/js/recurrence.js:1033 msgid "hours" msgstr "שעות" #: static/recurrence/js/recurrence.js:1033 msgid "minutes" msgstr "דקות" #: static/recurrence/js/recurrence.js:1033 msgid "seconds" msgstr "שניות" #: static/recurrence/js/recurrence.js:1036 msgid "annually" msgstr "שנתי" #: static/recurrence/js/recurrence.js:1036 msgid "monthly" msgstr "חודשי" #: static/recurrence/js/recurrence.js:1036 msgid "weekly" msgstr "שבועי" #: static/recurrence/js/recurrence.js:1036 msgid "daily" msgstr "ימי" #: static/recurrence/js/recurrence.js:1037 msgid "hourly" msgstr "שעתי" #: static/recurrence/js/recurrence.js:1037 msgid "minutely" msgstr "דקתי" #: static/recurrence/js/recurrence.js:1037 msgid "secondly" msgstr "שנייתי" #: static/recurrence/js/recurrence.js:1040 msgid "Monday" msgstr "יום שני" #: static/recurrence/js/recurrence.js:1040 msgid "Tuesday" msgstr "יום שלישי" #: static/recurrence/js/recurrence.js:1040 msgid "Wednesday" msgstr "יום רביעי" #: static/recurrence/js/recurrence.js:1040 msgid "Thursday" msgstr "יום חמישי" #: static/recurrence/js/recurrence.js:1041 msgid "Friday" msgstr "יום שישי" #: static/recurrence/js/recurrence.js:1041 msgid "Saturday" msgstr "יום שבת" #: static/recurrence/js/recurrence.js:1041 msgid "Sunday" msgstr "יום ראשון" #: static/recurrence/js/recurrence.js:1044 msgid "Mon" msgstr "ב'" #: static/recurrence/js/recurrence.js:1044 msgid "Tue" msgstr "ג'" #: static/recurrence/js/recurrence.js:1044 msgid "Wed" msgstr "ד'" #: static/recurrence/js/recurrence.js:1044 msgid "Thu" msgstr "ה'" #: static/recurrence/js/recurrence.js:1045 msgid "Fri" msgstr "ו'" #: static/recurrence/js/recurrence.js:1045 msgid "Sat" msgstr "ש'" #: static/recurrence/js/recurrence.js:1045 msgid "Sun" msgstr "יום א'" #: static/recurrence/js/recurrence.js:1048 msgctxt "Monday first letter" msgid "M" msgstr "ב" #: static/recurrence/js/recurrence.js:1049 msgctxt "Tuesday first letter" msgid "T" msgstr "ג" #: static/recurrence/js/recurrence.js:1050 msgctxt "Wednesday first letter" msgid "W" msgstr "ד" #: static/recurrence/js/recurrence.js:1051 msgctxt "Thursday first letter" msgid "T" msgstr "ה" #: static/recurrence/js/recurrence.js:1052 msgctxt "Friday first letter" msgid "F" msgstr "ו" #: static/recurrence/js/recurrence.js:1053 msgctxt "Saturday first letter" msgid "S" msgstr "ש" #: static/recurrence/js/recurrence.js:1054 msgctxt "Sunday first letter" msgid "S" msgstr "א" #: static/recurrence/js/recurrence.js:1057 msgid "first %(weekday)s" msgstr "%(weekday)s ראשון" #: static/recurrence/js/recurrence.js:1058 msgid "second %(weekday)s" msgstr "%(weekday)s שני" #: static/recurrence/js/recurrence.js:1059 msgid "third %(weekday)s" msgstr "%(weekday)s שלישי" #: static/recurrence/js/recurrence.js:1060 msgid "fourth %(weekday)s" msgstr "%(weekday)s רביעי" #: static/recurrence/js/recurrence.js:1061 #: static/recurrence/js/recurrence.js:1070 msgid "last %(weekday)s" msgstr "%(weekday)s אחרון" #: static/recurrence/js/recurrence.js:1062 msgid "second last %(weekday)s" msgstr "%(weekday)s ראשון לפני אחרון" #: static/recurrence/js/recurrence.js:1063 msgid "third last %(weekday)s" msgstr "%(weekday)s שני לפני אחרון" #: static/recurrence/js/recurrence.js:1066 msgid "1st %(weekday)s" msgstr "%(weekday)s ראשון" #: static/recurrence/js/recurrence.js:1067 msgid "2nd %(weekday)s" msgstr "%(weekday)s שני" #: static/recurrence/js/recurrence.js:1068 msgid "3rd %(weekday)s" msgstr "%(weekday)s שלישי" #: static/recurrence/js/recurrence.js:1069 msgid "4th %(weekday)s" msgstr "%(weekday)s רביעי" #: static/recurrence/js/recurrence.js:1071 msgid "2nd last %(weekday)s" msgstr "%(weekday)s ראשון לפני אחרון" #: static/recurrence/js/recurrence.js:1072 msgid "3rd last %(weekday)s" msgstr "%(weekday)s שני לפני אחרון" #: static/recurrence/js/recurrence.js:1075 #: static/recurrence/js/recurrence.js:1081 msgid "last" msgstr "אחרון" #: static/recurrence/js/recurrence.js:1076 msgid "second last" msgstr "ראשון לפני אחרון" #: static/recurrence/js/recurrence.js:1077 msgid "third last" msgstr "שני לפני אחרון" #: static/recurrence/js/recurrence.js:1078 msgid "fourth last" msgstr "שלישי לפני אחרון" #: static/recurrence/js/recurrence.js:1082 msgid "2nd last" msgstr "שני לפני אחרון" #: static/recurrence/js/recurrence.js:1083 msgid "3rd last" msgstr "שלישי לפני אחרון" #: static/recurrence/js/recurrence.js:1084 msgid "4th last" msgstr "רביעי לפני אחרון" #: static/recurrence/js/recurrence.js:1087 msgid "January" msgstr "ינואר" #: static/recurrence/js/recurrence.js:1087 msgid "February" msgstr "פברואר" #: static/recurrence/js/recurrence.js:1087 #: static/recurrence/js/recurrence.js:1099 msgid "March" msgstr "מרץ" #: static/recurrence/js/recurrence.js:1088 #: static/recurrence/js/recurrence.js:1100 msgid "April" msgstr "אפריל" #: static/recurrence/js/recurrence.js:1088 #: static/recurrence/js/recurrence.js:1094 #: static/recurrence/js/recurrence.js:1100 msgctxt "month name" msgid "May" msgstr "מאי" #: static/recurrence/js/recurrence.js:1088 #: static/recurrence/js/recurrence.js:1100 msgid "June" msgstr "יוני" #: static/recurrence/js/recurrence.js:1089 #: static/recurrence/js/recurrence.js:1101 msgid "July" msgstr "יולי" #: static/recurrence/js/recurrence.js:1089 msgid "August" msgstr "אוגוסט" #: static/recurrence/js/recurrence.js:1089 msgid "September" msgstr "ספטמבר" #: static/recurrence/js/recurrence.js:1090 msgid "October" msgstr "אוקטובר" #: static/recurrence/js/recurrence.js:1090 msgid "November" msgstr "נובמבר" #: static/recurrence/js/recurrence.js:1090 msgid "December" msgstr "דצמבר" #: static/recurrence/js/recurrence.js:1093 msgid "Jan" msgstr "ינו" #: static/recurrence/js/recurrence.js:1093 msgid "Feb" msgstr "פבר" #: static/recurrence/js/recurrence.js:1093 msgid "Mar" msgstr "מרץ" #: static/recurrence/js/recurrence.js:1094 msgid "Apr" msgstr "אפר" #: static/recurrence/js/recurrence.js:1094 msgid "Jun" msgstr "יונ" #: static/recurrence/js/recurrence.js:1095 msgid "Jul" msgstr "יול" #: static/recurrence/js/recurrence.js:1095 msgid "Aug" msgstr "אוג" #: static/recurrence/js/recurrence.js:1095 msgid "Sep" msgstr "ספט" #: static/recurrence/js/recurrence.js:1096 msgid "Oct" msgstr "אוק" #: static/recurrence/js/recurrence.js:1096 msgid "Nov" msgstr "נוב" #: static/recurrence/js/recurrence.js:1096 msgid "Dec" msgstr "דצמ" #: static/recurrence/js/recurrence.js:1099 msgid "Jan." msgstr "ינו'" #: static/recurrence/js/recurrence.js:1099 msgid "Feb." msgstr "פבר'" #: static/recurrence/js/recurrence.js:1101 msgid "Aug." msgstr "אוג'" #: static/recurrence/js/recurrence.js:1101 msgid "Sept." msgstr "ספט'" #: static/recurrence/js/recurrence.js:1102 msgid "Oct." msgstr "אוק'" #: static/recurrence/js/recurrence.js:1102 msgid "Nov." msgstr "נוב'" #: static/recurrence/js/recurrence.js:1102 msgid "Dec." msgstr "דצמ'" #: static/recurrence/js/recurrence.js:1105 msgid "a.m." msgstr " " #: static/recurrence/js/recurrence.js:1105 msgid "p.m." msgstr "אחה\"צ" #: static/recurrence/js/recurrence.js:1106 msgid "AM" msgstr " " #: static/recurrence/js/recurrence.js:1106 msgid "PM" msgstr "אחה\"צ" #~ msgid "last day" #~ msgstr "יום אחרון" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1643105481.2653713 django-recurrence-1.11.1/recurrence/locale/hu/0000755000076500000240000000000000000000000020334 5ustar00aleksistaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1643105481.2964494 django-recurrence-1.11.1/recurrence/locale/hu/LC_MESSAGES/0000755000076500000240000000000000000000000022121 5ustar00aleksistaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/locale/hu/LC_MESSAGES/django.mo0000644000076500000240000001106300000000000023721 0ustar00aleksistaff\*3HQU[_flp y *4 4G *|                    ( , 6 = D M S X g              . A M e n v       q t          !+/8= E Q^y}9DF,;s   ", 1>BGKRZbjrv  !!(J^o "*/T* S(DA Q\ >NBO"#9 J6KY&H35/MR$.1EZ; @'C-V<GL2 F4)[?X=W870:U,+%!IP, 1st %(weekday)s2nd %(weekday)s2nd last2nd last %(weekday)s3rd %(weekday)s3rd last3rd last %(weekday)s4th lastAprAprilAugAugustDailyDecDecemberExclusionFebFebruaryFriFridayHourlyInclusionInvalid frequency.JanJanuaryJulJulyJunJuneMarMarchMax dates exceeded. The limit is %(limit)sMax exclusion dates exceeded. The limit is %(limit)sMax exclusion rules exceeded. The limit is %(limit)sMax rules exceeded. The limit is %(limit)sMayMinutelyMonMondayMonthlyNovNovemberOctOctoberSatSaturdaySecondlySepSeptemberSunSundayThuThursdayTueTuesdayWedWednesdayWeeklyYearlyannuallydailydayseach %(items)severy %(number)s %(freq)sfirst %(weekday)sfourth %(weekday)sfourth lasthourlyhourslastlast %(weekday)sminutelyminutesmonthlymonthsoccuring %(number)s timesoccuring onceon the %(items)ssecond %(weekday)ssecond lastsecond last %(weekday)ssecondlysecondsthird %(weekday)sthird lastthird last %(weekday)suntil %(date)sweeklyweeksyearsProject-Id-Version: django-recurrence master Report-Msgid-Bugs-To: https://github.com/django-recurrence/django-recurrence/issues PO-Revision-Date: 2020-02-26 00:09+0100 Last-Translator: Balázs Úr Language-Team: Hungarian Language: hu MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); X-Generator: Lokalize 19.04.3 , 1. %(weekday)s2. %(weekday)s2. utolsó2. utolsó %(weekday)s3. %(weekday)s3. utolsó3. utolsó %(weekday)s4. utolsóÁprÁprilisAugAugusztusNapontaDecDecemberKizárásFebFebruárPénPéntekÓránkéntTartalmazásÉrvénytelen gyakoriság.JanJanuárJúlJúliusJúnJúniusMárMárciusA dátumok legnagyobb száma elérve. A korlát %(limit)sA kizárási dátumok legnagyobb száma elérve. A korlát %(limit)sA kizárási szabályok legnagyobb száma elérve. A korlát %(limit)sA szabályok legnagyobb száma elérve. A korlát %(limit)sMájusPercenkéntHétHétfőHavontaNovNovemberOktOktóberSzoSzombatMásodpercenkéntSzeSzeptemberVasVasárnapCsüCsütörtökKedKeddSzeSzerdaHetenteÉventeéventenapontanapminden %(items)sminden %(number)s. %(freq)selső %(weekday)snegyedik %(weekday)snegyedik utolsóóránkéntórautolsóutolsó %(weekday)spercenkéntperchavontahónap%(number)s alkalommal fordul előegyszer fordul előekkor: %(items)smásodik %(weekday)smásodik utolsómásodik utolsó %(weekday)smásodpercenkéntmásodpercharmadik %(weekday)sharmadik utolsóharmadik utolsó %(weekday)seddig: %(date)shetentehétév././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/locale/hu/LC_MESSAGES/django.po0000644000076500000240000001522600000000000023731 0ustar00aleksistaff# Hungarian translation for django-recurrence. # Copyright (C) 2020 Free Software Foundation, Inc. # This file is distributed under the same license as the django-recurrence package. # # Balázs Úr , 2020. msgid "" msgstr "" "Project-Id-Version: django-recurrence master\n" "Report-Msgid-Bugs-To: https://github.com/django-recurrence/django-recurrence/issues\n" "POT-Creation-Date: 2017-02-24 23:21+0100\n" "PO-Revision-Date: 2020-02-26 00:09+0100\n" "Last-Translator: Balázs Úr \n" "Language-Team: Hungarian\n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Lokalize 19.04.3\n" #: base.py:1087 msgid "annually" msgstr "évente" #: base.py:1087 msgid "monthly" msgstr "havonta" #: base.py:1087 msgid "weekly" msgstr "hetente" #: base.py:1087 msgid "daily" msgstr "naponta" #: base.py:1088 msgid "hourly" msgstr "óránként" #: base.py:1088 msgid "minutely" msgstr "percenként" #: base.py:1088 msgid "secondly" msgstr "másodpercenként" #: base.py:1091 msgid "years" msgstr "év" #: base.py:1091 msgid "months" msgstr "hónap" #: base.py:1091 msgid "weeks" msgstr "hét" #: base.py:1091 msgid "days" msgstr "nap" #: base.py:1092 msgid "hours" msgstr "óra" #: base.py:1092 msgid "minutes" msgstr "perc" #: base.py:1092 msgid "seconds" msgstr "másodperc" #: base.py:1097 #, python-format msgid "1st %(weekday)s" msgstr "1. %(weekday)s" #: base.py:1098 #, python-format msgid "2nd %(weekday)s" msgstr "2. %(weekday)s" #: base.py:1099 #, python-format msgid "3rd %(weekday)s" msgstr "3. %(weekday)s" #: base.py:1100 base.py:1126 #, python-format msgid "last %(weekday)s" msgstr "utolsó %(weekday)s" #: base.py:1101 #, python-format msgid "2nd last %(weekday)s" msgstr "2. utolsó %(weekday)s" #: base.py:1102 #, python-format msgid "3rd last %(weekday)s" msgstr "3. utolsó %(weekday)s" #: base.py:1105 base.py:1131 msgid "last" msgstr "utolsó" #: base.py:1106 msgid "2nd last" msgstr "2. utolsó" #: base.py:1107 msgid "3rd last" msgstr "3. utolsó" #: base.py:1108 msgid "4th last" msgstr "4. utolsó" #: base.py:1111 msgid "Mon" msgstr "Hét" #: base.py:1111 msgid "Tue" msgstr "Ked" #: base.py:1111 msgid "Wed" msgstr "Sze" #: base.py:1112 msgid "Thu" msgstr "Csü" #: base.py:1112 msgid "Fri" msgstr "Pén" #: base.py:1112 msgid "Sat" msgstr "Szo" #: base.py:1112 msgid "Sun" msgstr "Vas" #: base.py:1115 msgid "Jan" msgstr "Jan" #: base.py:1115 msgid "Feb" msgstr "Feb" #: base.py:1115 msgid "Mar" msgstr "Már" #: base.py:1115 msgid "Apr" msgstr "Ápr" #: base.py:1116 msgid "Jun" msgstr "Jún" #: base.py:1116 msgid "Jul" msgstr "Júl" #: base.py:1116 msgid "Aug" msgstr "Aug" #: base.py:1117 msgid "Sep" msgstr "Sze" #: base.py:1117 msgid "Oct" msgstr "Okt" #: base.py:1117 msgid "Nov" msgstr "Nov" #: base.py:1117 msgid "Dec" msgstr "Dec" #: base.py:1122 #, python-format msgid "first %(weekday)s" msgstr "első %(weekday)s" #: base.py:1123 #, python-format msgid "second %(weekday)s" msgstr "második %(weekday)s" #: base.py:1124 #, python-format msgid "third %(weekday)s" msgstr "harmadik %(weekday)s" #: base.py:1125 #, python-format msgid "fourth %(weekday)s" msgstr "negyedik %(weekday)s" #: base.py:1127 #, python-format msgid "second last %(weekday)s" msgstr "második utolsó %(weekday)s" #: base.py:1128 #, python-format msgid "third last %(weekday)s" msgstr "harmadik utolsó %(weekday)s" #: base.py:1132 msgid "second last" msgstr "második utolsó" #: base.py:1133 msgid "third last" msgstr "harmadik utolsó" #: base.py:1134 msgid "fourth last" msgstr "negyedik utolsó" #: base.py:1137 choices.py:17 msgid "Monday" msgstr "Hétfő" #: base.py:1137 choices.py:18 msgid "Tuesday" msgstr "Kedd" #: base.py:1137 choices.py:19 msgid "Wednesday" msgstr "Szerda" #: base.py:1138 choices.py:20 msgid "Thursday" msgstr "Csütörtök" #: base.py:1138 choices.py:21 msgid "Friday" msgstr "Péntek" #: base.py:1138 choices.py:22 msgid "Saturday" msgstr "Szombat" #: base.py:1138 choices.py:23 msgid "Sunday" msgstr "Vasárnap" #: base.py:1141 choices.py:27 msgid "January" msgstr "Január" #: base.py:1141 choices.py:28 msgid "February" msgstr "Február" #: base.py:1141 choices.py:29 msgid "March" msgstr "Március" #: base.py:1141 choices.py:30 msgid "April" msgstr "Április" #: base.py:1142 choices.py:32 msgid "June" msgstr "Június" #: base.py:1142 choices.py:33 msgid "July" msgstr "Július" #: base.py:1142 choices.py:34 msgid "August" msgstr "Augusztus" #: base.py:1143 choices.py:35 msgid "September" msgstr "Szeptember" #: base.py:1143 choices.py:36 msgid "October" msgstr "Október" #: base.py:1143 choices.py:37 msgid "November" msgstr "November" #: base.py:1143 choices.py:38 msgid "December" msgstr "December" #: base.py:1161 base.py:1178 base.py:1189 base.py:1202 base.py:1220 msgid ", " msgstr ", " #: base.py:1167 #, python-format msgid "every %(number)s %(freq)s" msgstr "minden %(number)s. %(freq)s" #: base.py:1181 base.py:1205 #, python-format msgid "each %(items)s" msgstr "minden %(items)s" #: base.py:1184 base.py:1193 base.py:1197 #, python-format msgid "on the %(items)s" msgstr "ekkor: %(items)s" #: base.py:1212 msgid "occuring once" msgstr "egyszer fordul elő" #: base.py:1214 #, python-format msgid "occuring %(number)s times" msgstr "%(number)s alkalommal fordul elő" #: base.py:1217 #, python-format msgid "until %(date)s" msgstr "eddig: %(date)s" #: choices.py:7 msgid "Secondly" msgstr "Másodpercenként" #: choices.py:8 msgid "Minutely" msgstr "Percenként" #: choices.py:9 msgid "Hourly" msgstr "Óránként" #: choices.py:10 msgid "Daily" msgstr "Naponta" #: choices.py:11 msgid "Weekly" msgstr "Hetente" #: choices.py:12 msgid "Monthly" msgstr "Havonta" #: choices.py:13 msgid "Yearly" msgstr "Évente" #: choices.py:31 msgid "May" msgstr "Május" #: choices.py:44 msgid "Inclusion" msgstr "Tartalmazás" #: choices.py:45 msgid "Exclusion" msgstr "Kizárás" #: forms.py:72 msgid "Invalid frequency." msgstr "Érvénytelen gyakoriság." #: forms.py:74 #, python-format msgid "Max rules exceeded. The limit is %(limit)s" msgstr "A szabályok legnagyobb száma elérve. A korlát %(limit)s" #: forms.py:76 #, python-format msgid "Max exclusion rules exceeded. The limit is %(limit)s" msgstr "A kizárási szabályok legnagyobb száma elérve. A korlát %(limit)s" #: forms.py:78 #, python-format msgid "Max dates exceeded. The limit is %(limit)s" msgstr "A dátumok legnagyobb száma elérve. A korlát %(limit)s" #: forms.py:80 #, python-format msgid "Max exclusion dates exceeded. The limit is %(limit)s" msgstr "A kizárási dátumok legnagyobb száma elérve. A korlát %(limit)s" ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/locale/hu/LC_MESSAGES/djangojs.mo0000644000076500000240000001303600000000000024260 0ustar00aleksistaff}             # ' - 1 6 = F K ] a f o t z                    0 4 9 B Y q u z                $ ( 0 G M h l v           ",1BKR[cix $ 6AXglsy~)8 GRi x   (/6Qcgm v!! /38AHKZlpxz~    .7I^o t  !!0A FQfw  +Y6Gj`i1R@zcBX9OL(v!,r_F[<s#SqC/5*'o)Tw-Q7Kem4$JEudMApDkg>2.?lH&= 8NZ"U3 |:y h{ ]Pf\ Ix; 0^b}W%aVnt1st %(weekday)s2nd %(weekday)s2nd last2nd last %(weekday)s3rd %(weekday)s3rd last3rd last %(weekday)s4th %(weekday)s4th lastAMAdd dateAdd ruleAprAprilAugAug.AugustCalendarDateDay of month%j%SDecDec.DecemberEachEveryExclude these occurencesExclude this dateFebFeb.FebruaryFrequencyFriFridayFriday first letterFJanJan.JanuaryJulJulyJunJuneMarMarchMonMondayMonday first letterMNovNov.NovemberOccurs %(number)s timeOccurs %(number)s timesOctOct.OctoberOn thePMRemoveRepeat untilSatSaturdaySaturday first letterSSepSept.SeptemberSunSundaySunday first letterSThuThursdayThursday first letterTTimeTueTuesdayTuesday first letterTUntilUntil date format%Y-%m-%dWedWednesdayWednesday first letterWa.m.annuallydailydaydayseach %(items)severy %(number)s %(freq)sexcludingfirst %(weekday)sfourth %(weekday)sfourth lasthourhourlyhoursincludinglastlast %(weekday)smidnightminuteminutelyminutesmonthmonth nameMaymonthlymonthsnoonoccuring %(number)s timeoccuring %(number)s timeson the %(items)sp.m.secondsecond %(weekday)ssecond lastsecond last %(weekday)ssecondlysecondsthird %(weekday)sthird lastthird last %(weekday)suntil %(date)sweekweeklyweeksyearyearsProject-Id-Version: django-recurrence master Report-Msgid-Bugs-To: https://github.com/django-recurrence/django-recurrence/issues PO-Revision-Date: 2020-02-26 00:21+0100 Last-Translator: Balázs Úr Language-Team: Hungarian Language: hu MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); X-Generator: Lokalize 19.04.3 1. %(weekday)s2. %(weekday)s2. utolsó2. utolsó %(weekday)s3. %(weekday)s3. utolsó3. utolsó %(weekday)s4. %(weekday)s4. utolsóDEDátum hozzáadásaSzabály hozzáadásaÁprÁprilisAugAug.AugusztusNaptárDátum%j%SDecDec.DecemberMindenMindenElőfordulások kizárásaDátum kizárásaFebFebr.FebruárGyakoriságPénPéntekPJanJan.JanuárJúlJúliusJúnJúniusMárMárciusHétHétfőHNovNov.November%(number)s alkalommal fordul elő%(number)s alkalommal fordul előOktOkt.OktóberEkkor:DUEltávolításIsmétlés eddig:SzoSzombatSSzeSzept.SzeptemberVasVasárnapVCsüCsütörtökCIdőKedKeddKEddig:%Y. %m. %d.SzeSzerdaSd.e.éventenapontanapnapminden %(items)sminden %(number)s. %(freq)skizárvaelső %(weekday)snegyedik %(weekday)snegyedik utolsóóraóránkéntórabeleértveutolsóutolsó %(weekday)séjfélpercpercenkéntperchónapMájushavontahónapdél%(number)s alkalommal fordul elő%(number)s alkalommal fordul előekkor: %(items)sd.u.másodpercmásodik %(weekday)smásodik utolsómásodik utolsó %(weekday)smásodpercenkéntmásodpercharmadik %(weekday)sharmadik utolsóharmadik utolsó %(weekday)seddig: %(date)shéthetentehétévév././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/locale/hu/LC_MESSAGES/djangojs.po0000644000076500000240000002641200000000000024265 0ustar00aleksistaff# Hungarian translation for django-recurrence. # Copyright (C) 2020 Free Software Foundation, Inc. # This file is distributed under the same license as the django-recurrence package. # # Balázs Úr , 2020. msgid "" msgstr "" "Project-Id-Version: django-recurrence master\n" "Report-Msgid-Bugs-To: https://github.com/django-recurrence/django-recurrence/issues\n" "POT-Creation-Date: 2017-02-24 23:11+0100\n" "PO-Revision-Date: 2020-02-26 00:21+0100\n" "Last-Translator: Balázs Úr \n" "Language-Team: Hungarian\n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Lokalize 19.04.3\n" #: static/recurrence/js/recurrence-widget.js:1609 msgctxt "date" msgid "%l, %F %j, %Y" msgstr "" #: static/recurrence/js/recurrence-widget.js:1774 msgid "including" msgstr "beleértve" #: static/recurrence/js/recurrence-widget.js:1774 msgid "excluding" msgstr "kizárva" #: static/recurrence/js/recurrence-widget.js:1778 msgid "Frequency" msgstr "Gyakoriság" #: static/recurrence/js/recurrence-widget.js:1779 msgid "On the" msgstr "Ekkor:" #: static/recurrence/js/recurrence-widget.js:1780 msgid "Each" msgstr "Minden" #: static/recurrence/js/recurrence-widget.js:1781 msgid "Every" msgstr "Minden" #: static/recurrence/js/recurrence-widget.js:1782 msgid "Until" msgstr "Eddig:" #: static/recurrence/js/recurrence-widget.js:1783 msgid "Occurs %(number)s time" msgstr "%(number)s alkalommal fordul elő" #: static/recurrence/js/recurrence-widget.js:1784 msgid "Occurs %(number)s times" msgstr "%(number)s alkalommal fordul elő" #: static/recurrence/js/recurrence-widget.js:1785 msgid "Date" msgstr "Dátum" #: static/recurrence/js/recurrence-widget.js:1786 msgid "Time" msgstr "Idő" #: static/recurrence/js/recurrence-widget.js:1787 msgid "Repeat until" msgstr "Ismétlés eddig:" #: static/recurrence/js/recurrence-widget.js:1788 msgid "Exclude these occurences" msgstr "Előfordulások kizárása" #: static/recurrence/js/recurrence-widget.js:1789 msgid "Exclude this date" msgstr "Dátum kizárása" #: static/recurrence/js/recurrence-widget.js:1790 msgid "Add rule" msgstr "Szabály hozzáadása" #: static/recurrence/js/recurrence-widget.js:1791 msgid "Add date" msgstr "Dátum hozzáadása" #: static/recurrence/js/recurrence-widget.js:1792 msgid "Remove" msgstr "Eltávolítás" #: static/recurrence/js/recurrence-widget.js:1793 msgid "Calendar" msgstr "Naptár" #: static/recurrence/js/recurrence.js:218 msgctxt "Until date format" msgid "%Y-%m-%d" msgstr "%Y. %m. %d." #: static/recurrence/js/recurrence.js:1017 msgid "midnight" msgstr "éjfél" #: static/recurrence/js/recurrence.js:1018 msgid "noon" msgstr "dél" #: static/recurrence/js/recurrence.js:1019 msgid "on the %(items)s" msgstr "ekkor: %(items)s" #: static/recurrence/js/recurrence.js:1020 msgid "every %(number)s %(freq)s" msgstr "minden %(number)s. %(freq)s" #: static/recurrence/js/recurrence.js:1021 msgid "each %(items)s" msgstr "minden %(items)s" #: static/recurrence/js/recurrence.js:1022 msgid "occuring %(number)s time" msgstr "%(number)s alkalommal fordul elő" #: static/recurrence/js/recurrence.js:1023 msgid "occuring %(number)s times" msgstr "%(number)s alkalommal fordul elő" #: static/recurrence/js/recurrence.js:1024 msgid "until %(date)s" msgstr "eddig: %(date)s" #: static/recurrence/js/recurrence.js:1028 msgid "year" msgstr "év" #: static/recurrence/js/recurrence.js:1028 msgid "month" msgstr "hónap" #: static/recurrence/js/recurrence.js:1028 msgid "week" msgstr "hét" #: static/recurrence/js/recurrence.js:1028 msgid "day" msgstr "nap" #: static/recurrence/js/recurrence.js:1029 msgid "hour" msgstr "óra" #: static/recurrence/js/recurrence.js:1029 msgid "minute" msgstr "perc" #: static/recurrence/js/recurrence.js:1029 msgid "second" msgstr "másodperc" #: static/recurrence/js/recurrence.js:1032 msgid "years" msgstr "év" #: static/recurrence/js/recurrence.js:1032 msgid "months" msgstr "hónap" #: static/recurrence/js/recurrence.js:1032 msgid "weeks" msgstr "hét" #: static/recurrence/js/recurrence.js:1032 msgid "days" msgstr "nap" #: static/recurrence/js/recurrence.js:1033 msgid "hours" msgstr "óra" #: static/recurrence/js/recurrence.js:1033 msgid "minutes" msgstr "perc" #: static/recurrence/js/recurrence.js:1033 msgid "seconds" msgstr "másodperc" #: static/recurrence/js/recurrence.js:1036 msgid "annually" msgstr "évente" #: static/recurrence/js/recurrence.js:1036 msgid "monthly" msgstr "havonta" #: static/recurrence/js/recurrence.js:1036 msgid "weekly" msgstr "hetente" #: static/recurrence/js/recurrence.js:1036 msgid "daily" msgstr "naponta" #: static/recurrence/js/recurrence.js:1037 msgid "hourly" msgstr "óránként" #: static/recurrence/js/recurrence.js:1037 msgid "minutely" msgstr "percenként" #: static/recurrence/js/recurrence.js:1037 msgid "secondly" msgstr "másodpercenként" #: static/recurrence/js/recurrence.js:1040 msgid "Monday" msgstr "Hétfő" #: static/recurrence/js/recurrence.js:1040 msgid "Tuesday" msgstr "Kedd" #: static/recurrence/js/recurrence.js:1040 msgid "Wednesday" msgstr "Szerda" #: static/recurrence/js/recurrence.js:1040 msgid "Thursday" msgstr "Csütörtök" #: static/recurrence/js/recurrence.js:1041 msgid "Friday" msgstr "Péntek" #: static/recurrence/js/recurrence.js:1041 msgid "Saturday" msgstr "Szombat" #: static/recurrence/js/recurrence.js:1041 msgid "Sunday" msgstr "Vasárnap" #: static/recurrence/js/recurrence.js:1044 msgid "Mon" msgstr "Hét" #: static/recurrence/js/recurrence.js:1044 msgid "Tue" msgstr "Ked" #: static/recurrence/js/recurrence.js:1044 msgid "Wed" msgstr "Sze" #: static/recurrence/js/recurrence.js:1044 msgid "Thu" msgstr "Csü" #: static/recurrence/js/recurrence.js:1045 msgid "Fri" msgstr "Pén" #: static/recurrence/js/recurrence.js:1045 msgid "Sat" msgstr "Szo" #: static/recurrence/js/recurrence.js:1045 msgid "Sun" msgstr "Vas" #: static/recurrence/js/recurrence.js:1048 msgctxt "Monday first letter" msgid "M" msgstr "H" #: static/recurrence/js/recurrence.js:1049 msgctxt "Tuesday first letter" msgid "T" msgstr "K" #: static/recurrence/js/recurrence.js:1050 msgctxt "Wednesday first letter" msgid "W" msgstr "S" #: static/recurrence/js/recurrence.js:1051 msgctxt "Thursday first letter" msgid "T" msgstr "C" #: static/recurrence/js/recurrence.js:1052 msgctxt "Friday first letter" msgid "F" msgstr "P" #: static/recurrence/js/recurrence.js:1053 msgctxt "Saturday first letter" msgid "S" msgstr "S" #: static/recurrence/js/recurrence.js:1054 msgctxt "Sunday first letter" msgid "S" msgstr "V" #: static/recurrence/js/recurrence.js:1057 msgid "first %(weekday)s" msgstr "első %(weekday)s" #: static/recurrence/js/recurrence.js:1058 msgid "second %(weekday)s" msgstr "második %(weekday)s" #: static/recurrence/js/recurrence.js:1059 msgid "third %(weekday)s" msgstr "harmadik %(weekday)s" #: static/recurrence/js/recurrence.js:1060 msgid "fourth %(weekday)s" msgstr "negyedik %(weekday)s" #: static/recurrence/js/recurrence.js:1061 #: static/recurrence/js/recurrence.js:1070 msgid "last %(weekday)s" msgstr "utolsó %(weekday)s" #: static/recurrence/js/recurrence.js:1062 msgid "second last %(weekday)s" msgstr "második utolsó %(weekday)s" #: static/recurrence/js/recurrence.js:1063 msgid "third last %(weekday)s" msgstr "harmadik utolsó %(weekday)s" #: static/recurrence/js/recurrence.js:1066 msgid "1st %(weekday)s" msgstr "1. %(weekday)s" #: static/recurrence/js/recurrence.js:1067 msgid "2nd %(weekday)s" msgstr "2. %(weekday)s" #: static/recurrence/js/recurrence.js:1068 msgid "3rd %(weekday)s" msgstr "3. %(weekday)s" #: static/recurrence/js/recurrence.js:1069 msgid "4th %(weekday)s" msgstr "4. %(weekday)s" #: static/recurrence/js/recurrence.js:1071 msgid "2nd last %(weekday)s" msgstr "2. utolsó %(weekday)s" #: static/recurrence/js/recurrence.js:1072 msgid "3rd last %(weekday)s" msgstr "3. utolsó %(weekday)s" #: static/recurrence/js/recurrence.js:1075 #: static/recurrence/js/recurrence.js:1081 msgid "last" msgstr "utolsó" #: static/recurrence/js/recurrence.js:1076 msgid "second last" msgstr "második utolsó" #: static/recurrence/js/recurrence.js:1077 msgid "third last" msgstr "harmadik utolsó" #: static/recurrence/js/recurrence.js:1078 msgid "fourth last" msgstr "negyedik utolsó" #: static/recurrence/js/recurrence.js:1082 msgid "2nd last" msgstr "2. utolsó" #: static/recurrence/js/recurrence.js:1083 msgid "3rd last" msgstr "3. utolsó" #: static/recurrence/js/recurrence.js:1084 msgid "4th last" msgstr "4. utolsó" #: static/recurrence/js/recurrence.js:1087 msgid "January" msgstr "Január" #: static/recurrence/js/recurrence.js:1087 msgid "February" msgstr "Február" #: static/recurrence/js/recurrence.js:1087 #: static/recurrence/js/recurrence.js:1099 msgid "March" msgstr "Március" #: static/recurrence/js/recurrence.js:1088 #: static/recurrence/js/recurrence.js:1100 msgid "April" msgstr "Április" #: static/recurrence/js/recurrence.js:1088 #: static/recurrence/js/recurrence.js:1094 #: static/recurrence/js/recurrence.js:1100 msgctxt "month name" msgid "May" msgstr "Május" #: static/recurrence/js/recurrence.js:1088 #: static/recurrence/js/recurrence.js:1100 msgid "June" msgstr "Június" #: static/recurrence/js/recurrence.js:1089 #: static/recurrence/js/recurrence.js:1101 msgid "July" msgstr "Július" #: static/recurrence/js/recurrence.js:1089 msgid "August" msgstr "Augusztus" #: static/recurrence/js/recurrence.js:1089 msgid "September" msgstr "Szeptember" #: static/recurrence/js/recurrence.js:1090 msgid "October" msgstr "Október" #: static/recurrence/js/recurrence.js:1090 msgid "November" msgstr "November" #: static/recurrence/js/recurrence.js:1090 msgid "December" msgstr "December" #: static/recurrence/js/recurrence.js:1093 msgid "Jan" msgstr "Jan" #: static/recurrence/js/recurrence.js:1093 msgid "Feb" msgstr "Feb" #: static/recurrence/js/recurrence.js:1093 msgid "Mar" msgstr "Már" #: static/recurrence/js/recurrence.js:1094 msgid "Apr" msgstr "Ápr" #: static/recurrence/js/recurrence.js:1094 msgid "Jun" msgstr "Jún" #: static/recurrence/js/recurrence.js:1095 msgid "Jul" msgstr "Júl" #: static/recurrence/js/recurrence.js:1095 msgid "Aug" msgstr "Aug" #: static/recurrence/js/recurrence.js:1095 msgid "Sep" msgstr "Sze" #: static/recurrence/js/recurrence.js:1096 msgid "Oct" msgstr "Okt" #: static/recurrence/js/recurrence.js:1096 msgid "Nov" msgstr "Nov" #: static/recurrence/js/recurrence.js:1096 msgid "Dec" msgstr "Dec" #: static/recurrence/js/recurrence.js:1099 msgid "Jan." msgstr "Jan." #: static/recurrence/js/recurrence.js:1099 msgid "Feb." msgstr "Febr." #: static/recurrence/js/recurrence.js:1101 msgid "Aug." msgstr "Aug." #: static/recurrence/js/recurrence.js:1101 msgid "Sept." msgstr "Szept." #: static/recurrence/js/recurrence.js:1102 msgid "Oct." msgstr "Okt." #: static/recurrence/js/recurrence.js:1102 msgid "Nov." msgstr "Nov." #: static/recurrence/js/recurrence.js:1102 msgid "Dec." msgstr "Dec." #: static/recurrence/js/recurrence.js:1105 msgid "a.m." msgstr "d.e." #: static/recurrence/js/recurrence.js:1105 msgid "p.m." msgstr "d.u." #: static/recurrence/js/recurrence.js:1106 msgid "AM" msgstr "DE" #: static/recurrence/js/recurrence.js:1106 msgid "PM" msgstr "DU" #: static/recurrence/js/recurrence.js:1108 msgctxt "Day of month" msgid "%j%S" msgstr "%j%S" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1643105481.2656062 django-recurrence-1.11.1/recurrence/locale/nl/0000755000076500000240000000000000000000000020331 5ustar00aleksistaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1643105481.2974877 django-recurrence-1.11.1/recurrence/locale/nl/LC_MESSAGES/0000755000076500000240000000000000000000000022116 5ustar00aleksistaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/locale/nl/LC_MESSAGES/django.mo0000644000076500000240000001070000000000000023713 0ustar00aleksistaff[ 5>BHLSY] fpt} *444 *i                      # * 1 : @ E T n             . : R [ c u       T c r          "%- 5?TX`dimrv0|AC53i my|        &,=Vi|    #/ KXa s  S) R'C@P[ =MAN!"8I5JX%G24.LQ#-0D: ?&B, U;FKY1 E3(Z>W<V76/9T+*$ HO1st %(weekday)s2nd %(weekday)s2nd last2nd last %(weekday)s3rd %(weekday)s3rd last3rd last %(weekday)s4th lastAprAprilAugAugustDailyDecDecemberExclusionFebFebruaryFriFridayHourlyInclusionInvalid frequency.JanJanuaryJulJulyJunJuneMarMarchMax dates exceeded. The limit is %(limit)sMax exclusion dates exceeded. The limit is %(limit)sMax exclusion rules exceeded. The limit is %(limit)sMax rules exceeded. The limit is %(limit)sMayMinutelyMonMondayMonthlyNovNovemberOctOctoberSatSaturdaySecondlySepSeptemberSunSundayThuThursdayTueTuesdayWedWednesdayWeeklyYearlyannuallydailydayseach %(items)severy %(number)s %(freq)sfirst %(weekday)sfourth %(weekday)sfourth lasthourlyhourslastlast %(weekday)sminutelyminutesmonthlymonthsoccuring %(number)s timesoccuring onceon the %(items)ssecond %(weekday)ssecond lastsecond last %(weekday)ssecondlysecondsthird %(weekday)sthird lastthird last %(weekday)suntil %(date)sweeklyweeksyearsProject-Id-Version: Django Recurrence 1.0.1 Report-Msgid-Bugs-To: POT-Creation-Date: 2017-02-24 23:21+0100 PO-Revision-Date: 2017-02-24 23:28+0100 Last-Translator: Bart Heesink Language-Team: Language: Dutch MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 1.5.7 X-Poedit-SourceCharset: UTF-8 1e %(weekday)s2e %(weekday)s2 na laatste2 na laatste %(weekday)s3e %(weekday)s3 na laatste3 na laatste %(weekday)s4 na laatsteapraprilaugaugustusDagelijksdecdecemberUitgezonderdfebfebruarivrvrijdagElk uurInclusiefOngeldige herhaling.janjanuarijuljulijunjunimrtmaartMaximaal aantal van %(limit)s data overschreden.Maximaal aantal van %(limit)s uitgezonderde data is overschreden.Maximaal aantal van %(limit)s uitgezonderde regels is overschreden.Maximaal aantal van %(limit)s regels is overschreden.meiElke minuutmamaandagMaandelijksnovnovemberoktoktoberzazaterdagElke secondesepseptemberzozondagdodonderdagdidinsdagwowoensdagWekelijksJaarlijksjaarlijksdagelijksdageniedere %(items)selke %(number)s %(freq)seerste %(weekday)svierde %(weekday)svierde laatsteelk uururenlaatstelaatste %(weekday)selke minuutminutenmaandelijksmaanden%(number)s keer herhalenéénmaligop de %(items)stweede %(weekday)svoorlaatstetwee na laatste %(weekday)selke secondesecondenderde %(weekday)sderde laatstedrie na laatste %(weekday)stot %(date)swekelijkswekenjaren././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/locale/nl/LC_MESSAGES/django.po0000644000076500000240000001534100000000000023724 0ustar00aleksistaff# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: Django Recurrence 1.0.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-24 23:21+0100\n" "PO-Revision-Date: 2017-02-24 23:28+0100\n" "Last-Translator: Bart Heesink \n" "Language-Team: \n" "Language: Dutch\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.5.7\n" "X-Poedit-SourceCharset: UTF-8\n" #: base.py:1087 msgid "annually" msgstr "jaarlijks" #: base.py:1087 msgid "monthly" msgstr "maandelijks" #: base.py:1087 msgid "weekly" msgstr "wekelijks" #: base.py:1087 msgid "daily" msgstr "dagelijks" #: base.py:1088 msgid "hourly" msgstr "elk uur" #: base.py:1088 msgid "minutely" msgstr "elke minuut" #: base.py:1088 msgid "secondly" msgstr "elke seconde" #: base.py:1091 msgid "years" msgstr "jaren" #: base.py:1091 msgid "months" msgstr "maanden" #: base.py:1091 msgid "weeks" msgstr "weken" #: base.py:1091 msgid "days" msgstr "dagen" #: base.py:1092 msgid "hours" msgstr "uren" #: base.py:1092 msgid "minutes" msgstr "minuten" #: base.py:1092 msgid "seconds" msgstr "seconden" #: base.py:1097 #, python-format msgid "1st %(weekday)s" msgstr "1e %(weekday)s" #: base.py:1098 #, python-format msgid "2nd %(weekday)s" msgstr "2e %(weekday)s" #: base.py:1099 #, python-format msgid "3rd %(weekday)s" msgstr "3e %(weekday)s" #: base.py:1100 base.py:1126 #, python-format msgid "last %(weekday)s" msgstr "laatste %(weekday)s" #: base.py:1101 #, python-format msgid "2nd last %(weekday)s" msgstr "2 na laatste %(weekday)s" #: base.py:1102 #, python-format msgid "3rd last %(weekday)s" msgstr "3 na laatste %(weekday)s" #: base.py:1105 base.py:1131 msgid "last" msgstr "laatste" #: base.py:1106 msgid "2nd last" msgstr "2 na laatste" #: base.py:1107 msgid "3rd last" msgstr "3 na laatste" #: base.py:1108 msgid "4th last" msgstr "4 na laatste" #: base.py:1111 msgid "Mon" msgstr "ma" #: base.py:1111 msgid "Tue" msgstr "di" #: base.py:1111 msgid "Wed" msgstr "wo" #: base.py:1112 msgid "Thu" msgstr "do" #: base.py:1112 msgid "Fri" msgstr "vr" #: base.py:1112 msgid "Sat" msgstr "za" #: base.py:1112 msgid "Sun" msgstr "zo" #: base.py:1115 msgid "Jan" msgstr "jan" #: base.py:1115 msgid "Feb" msgstr "feb" #: base.py:1115 msgid "Mar" msgstr "mrt" #: base.py:1115 msgid "Apr" msgstr "apr" #: base.py:1116 msgid "Jun" msgstr "jun" #: base.py:1116 msgid "Jul" msgstr "jul" #: base.py:1116 msgid "Aug" msgstr "aug" #: base.py:1117 msgid "Sep" msgstr "sep" #: base.py:1117 msgid "Oct" msgstr "okt" #: base.py:1117 msgid "Nov" msgstr "nov" #: base.py:1117 msgid "Dec" msgstr "dec" #: base.py:1122 #, python-format msgid "first %(weekday)s" msgstr "eerste %(weekday)s" #: base.py:1123 #, python-format msgid "second %(weekday)s" msgstr "tweede %(weekday)s" #: base.py:1124 #, python-format msgid "third %(weekday)s" msgstr "derde %(weekday)s" #: base.py:1125 #, python-format msgid "fourth %(weekday)s" msgstr "vierde %(weekday)s" #: base.py:1127 #, python-format msgid "second last %(weekday)s" msgstr "twee na laatste %(weekday)s" #: base.py:1128 #, python-format msgid "third last %(weekday)s" msgstr "drie na laatste %(weekday)s" #: base.py:1132 msgid "second last" msgstr "voorlaatste" #: base.py:1133 msgid "third last" msgstr "derde laatste" #: base.py:1134 msgid "fourth last" msgstr "vierde laatste" #: base.py:1137 choices.py:17 msgid "Monday" msgstr "maandag" #: base.py:1137 choices.py:18 msgid "Tuesday" msgstr "dinsdag" #: base.py:1137 choices.py:19 msgid "Wednesday" msgstr "woensdag" #: base.py:1138 choices.py:20 msgid "Thursday" msgstr "donderdag" #: base.py:1138 choices.py:21 msgid "Friday" msgstr "vrijdag" #: base.py:1138 choices.py:22 msgid "Saturday" msgstr "zaterdag" #: base.py:1138 choices.py:23 msgid "Sunday" msgstr "zondag" #: base.py:1141 choices.py:27 msgid "January" msgstr "januari" #: base.py:1141 choices.py:28 msgid "February" msgstr "februari" #: base.py:1141 choices.py:29 msgid "March" msgstr "maart" #: base.py:1141 choices.py:30 msgid "April" msgstr "april" #: base.py:1142 choices.py:32 msgid "June" msgstr "juni" #: base.py:1142 choices.py:33 msgid "July" msgstr "juli" #: base.py:1142 choices.py:34 msgid "August" msgstr "augustus" #: base.py:1143 choices.py:35 msgid "September" msgstr "september" #: base.py:1143 choices.py:36 msgid "October" msgstr "oktober" #: base.py:1143 choices.py:37 msgid "November" msgstr "november" #: base.py:1143 choices.py:38 msgid "December" msgstr "december" #: base.py:1161 base.py:1178 base.py:1189 base.py:1202 base.py:1220 msgid ", " msgstr "" #: base.py:1167 #, python-format msgid "every %(number)s %(freq)s" msgstr "elke %(number)s %(freq)s" #: base.py:1181 base.py:1205 #, python-format msgid "each %(items)s" msgstr "iedere %(items)s" #: base.py:1184 base.py:1193 base.py:1197 #, python-format msgid "on the %(items)s" msgstr "op de %(items)s" #: base.py:1212 msgid "occuring once" msgstr "éénmalig" #: base.py:1214 #, python-format msgid "occuring %(number)s times" msgstr "%(number)s keer herhalen" #: base.py:1217 #, python-format msgid "until %(date)s" msgstr "tot %(date)s" #: choices.py:7 msgid "Secondly" msgstr "Elke seconde" #: choices.py:8 msgid "Minutely" msgstr "Elke minuut" #: choices.py:9 msgid "Hourly" msgstr "Elk uur" #: choices.py:10 msgid "Daily" msgstr "Dagelijks" #: choices.py:11 msgid "Weekly" msgstr "Wekelijks" #: choices.py:12 msgid "Monthly" msgstr "Maandelijks" #: choices.py:13 msgid "Yearly" msgstr "Jaarlijks" #: choices.py:31 msgid "May" msgstr "mei" #: choices.py:44 msgid "Inclusion" msgstr "Inclusief" #: choices.py:45 msgid "Exclusion" msgstr "Uitgezonderd" #: forms.py:72 msgid "Invalid frequency." msgstr "Ongeldige herhaling." #: forms.py:74 #, python-format msgid "Max rules exceeded. The limit is %(limit)s" msgstr "Maximaal aantal van %(limit)s regels is overschreden." #: forms.py:76 #, python-format msgid "Max exclusion rules exceeded. The limit is %(limit)s" msgstr "Maximaal aantal van %(limit)s uitgezonderde regels is overschreden." #: forms.py:78 #, python-format msgid "Max dates exceeded. The limit is %(limit)s" msgstr "Maximaal aantal van %(limit)s data overschreden." #: forms.py:80 #, python-format msgid "Max exclusion dates exceeded. The limit is %(limit)s" msgstr "Maximaal aantal van %(limit)s uitgezonderde data is overschreden." #~ msgid "year" #~ msgstr "jaar" #~ msgid "month" #~ msgstr "maand" #~ msgid "week" #~ msgstr "week" #~ msgid "day" #~ msgstr "dag" #~ msgid "hour" #~ msgstr "uur" #~ msgid "minute" #~ msgstr "minuut" #~ msgid "second" #~ msgstr "seconde" ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/locale/nl/LC_MESSAGES/djangojs.mo0000644000076500000240000001233600000000000024257 0ustar00aleksistaffw  ) 9 B W g p                    $ ) 2 < @ G ] a f n r w {                  % = A G Q U \ r v               - 7 I \ h m t z              (/ BNfow Wf u  "+4:>BKRXg}  $(0 6 BNQZ\` eory{ ~     />BJ R\d x      -9 U bo    bF#D_O.J@u)oY glj1eQ/m[7\ksKc4q2X% 'VL"n^0!]d`G+E?8I hifp*S$At<M-3N(HUCv6 &w=BZr,>RaW:9T5 ;P1st %(weekday)s2nd %(weekday)s2nd last2nd last %(weekday)s3rd %(weekday)s3rd last3rd last %(weekday)s4th %(weekday)s4th lastAdd dateAdd ruleAprAprilAugAug.AugustCalendarDateDecDec.DecemberEachEveryExclude these occurencesExclude this dateFebFeb.FebruaryFrequencyFriFridayFriday first letterFJanJan.JanuaryJulJulyJunJuneMarMarchMonMondayMonday first letterMNovNov.NovemberOccurs %(number)s timeOccurs %(number)s timesOctOct.OctoberOn theRemoveRepeat untilSatSaturdaySaturday first letterSSepSept.SeptemberSunSundaySunday first letterSThuThursdayThursday first letterTTimeTueTuesdayTuesday first letterTUntilWedWednesdayWednesday first letterWannuallydailydaydayseach %(items)severy %(number)s %(freq)sexcludingfirst %(weekday)sfourth %(weekday)sfourth lasthourhourlyhoursincludinglastlast %(weekday)smidnightminuteminutelyminutesmonthmonth nameMaymonthlymonthsnoonoccuring %(number)s timeoccuring %(number)s timeson the %(items)ssecondsecond %(weekday)ssecond lastsecond last %(weekday)ssecondlysecondsthird %(weekday)sthird lastthird last %(weekday)suntil %(date)sweekweeklyweeksyearyearsProject-Id-Version: Django Recurrence 1.0.1 Report-Msgid-Bugs-To: POT-Creation-Date: 2017-02-24 23:11+0100 PO-Revision-Date: 2017-02-24 23:31+0100 Last-Translator: Bart Heesink Language-Team: Language: Dutch MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 1.5.7 X-Poedit-SourceCharset: UTF-8 1e %(weekday)s2e %(weekday)s2 na laatste2 na laatste %(weekday)s3e %(weekday)s3 na laatste3 na laatste %(weekday)s4e %(weekday)s4 na laatsteDatum toevoegenHerhaling toevoegenapraprilaugaugaugustusKalenderDatumdecdecdecemberIedereOm deSluit deze uitDeze datum uitsluitenfebfebfebruariFrequentievrvrijdagvjanjanjanuarijuljulijunjunimrtmaartmamaandagmnovnovnovemberHerhaal %(number)s keerHerhaal %(number)s keeroktoktoktoberOp deVerwijderenHerhaal totzazaterdagzsepseptseptemberzozondagzdodonderdagdTijddidinsdagdTotwowoensdagwjaarlijksdagelijksdagendagelijkselke %(items)siedere %(number)s %(freq)suitgezonderdeerste %(weekday)svierde %(weekday)svierde laatsteuurelk uurelk uurinclusieflaatstelaatste %(weekday)s's avondsminuutelke minuutelke minuutmaandenmeimaandelijksmaandelijks's middagsherhaalt %(number)s keerherhaalt %(number)s keerop de %(items)ssecondetweede %(weekday)svoorlaatstetwee na laatste %(weekday)selke secondeelke secondederde %(weekday)sderde laatstedrie na laatste %(weekday)stot %(date)swekenwekelijkswekelijksjarenjaren././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/locale/nl/LC_MESSAGES/djangojs.po0000644000076500000240000002613600000000000024265 0ustar00aleksistaff# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: Django Recurrence 1.0.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-24 23:11+0100\n" "PO-Revision-Date: 2017-02-24 23:31+0100\n" "Last-Translator: Bart Heesink \n" "Language-Team: \n" "Language: Dutch\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.5.7\n" "X-Poedit-SourceCharset: UTF-8\n" #: static/recurrence/js/recurrence-widget.js:1609 msgctxt "date" msgid "%l, %F %j, %Y" msgstr "" #: static/recurrence/js/recurrence-widget.js:1774 msgid "including" msgstr "inclusief" #: static/recurrence/js/recurrence-widget.js:1774 msgid "excluding" msgstr "uitgezonderd" #: static/recurrence/js/recurrence-widget.js:1778 msgid "Frequency" msgstr "Frequentie" #: static/recurrence/js/recurrence-widget.js:1779 msgid "On the" msgstr "Op de" #: static/recurrence/js/recurrence-widget.js:1780 msgid "Each" msgstr "Iedere" #: static/recurrence/js/recurrence-widget.js:1781 msgid "Every" msgstr "Om de" #: static/recurrence/js/recurrence-widget.js:1782 msgid "Until" msgstr "Tot" #: static/recurrence/js/recurrence-widget.js:1783 msgid "Occurs %(number)s time" msgstr "Herhaal %(number)s keer" #: static/recurrence/js/recurrence-widget.js:1784 msgid "Occurs %(number)s times" msgstr "Herhaal %(number)s keer" #: static/recurrence/js/recurrence-widget.js:1785 msgid "Date" msgstr "Datum" #: static/recurrence/js/recurrence-widget.js:1786 msgid "Time" msgstr "Tijd" #: static/recurrence/js/recurrence-widget.js:1787 msgid "Repeat until" msgstr "Herhaal tot" #: static/recurrence/js/recurrence-widget.js:1788 msgid "Exclude these occurences" msgstr "Sluit deze uit" #: static/recurrence/js/recurrence-widget.js:1789 msgid "Exclude this date" msgstr "Deze datum uitsluiten" #: static/recurrence/js/recurrence-widget.js:1790 msgid "Add rule" msgstr "Herhaling toevoegen" #: static/recurrence/js/recurrence-widget.js:1791 msgid "Add date" msgstr "Datum toevoegen" #: static/recurrence/js/recurrence-widget.js:1792 msgid "Remove" msgstr "Verwijderen" #: static/recurrence/js/recurrence-widget.js:1793 msgid "Calendar" msgstr "Kalender" #: static/recurrence/js/recurrence.js:218 msgctxt "Until date format" msgid "%Y-%m-%d" msgstr "" #: static/recurrence/js/recurrence.js:1017 msgid "midnight" msgstr "'s avonds" #: static/recurrence/js/recurrence.js:1018 msgid "noon" msgstr "'s middags" #: static/recurrence/js/recurrence.js:1019 msgid "on the %(items)s" msgstr "op de %(items)s" #: static/recurrence/js/recurrence.js:1020 msgid "every %(number)s %(freq)s" msgstr "iedere %(number)s %(freq)s" #: static/recurrence/js/recurrence.js:1021 msgid "each %(items)s" msgstr "elke %(items)s" #: static/recurrence/js/recurrence.js:1022 msgid "occuring %(number)s time" msgstr "herhaalt %(number)s keer" #: static/recurrence/js/recurrence.js:1023 msgid "occuring %(number)s times" msgstr "herhaalt %(number)s keer" #: static/recurrence/js/recurrence.js:1024 msgid "until %(date)s" msgstr "tot %(date)s" #: static/recurrence/js/recurrence.js:1028 msgid "year" msgstr "jaren" #: static/recurrence/js/recurrence.js:1028 msgid "month" msgstr "maanden" #: static/recurrence/js/recurrence.js:1028 msgid "week" msgstr "weken" #: static/recurrence/js/recurrence.js:1028 msgid "day" msgstr "dagen" #: static/recurrence/js/recurrence.js:1029 msgid "hour" msgstr "uur" #: static/recurrence/js/recurrence.js:1029 msgid "minute" msgstr "minuut" #: static/recurrence/js/recurrence.js:1029 msgid "second" msgstr "seconde" #: static/recurrence/js/recurrence.js:1032 msgid "years" msgstr "jaren" #: static/recurrence/js/recurrence.js:1032 msgid "months" msgstr "maandelijks" #: static/recurrence/js/recurrence.js:1032 msgid "weeks" msgstr "wekelijks" #: static/recurrence/js/recurrence.js:1032 msgid "days" msgstr "dagelijks" #: static/recurrence/js/recurrence.js:1033 msgid "hours" msgstr "elk uur" #: static/recurrence/js/recurrence.js:1033 msgid "minutes" msgstr "elke minuut" #: static/recurrence/js/recurrence.js:1033 msgid "seconds" msgstr "elke seconde" #: static/recurrence/js/recurrence.js:1036 msgid "annually" msgstr "jaarlijks" #: static/recurrence/js/recurrence.js:1036 msgid "monthly" msgstr "maandelijks" #: static/recurrence/js/recurrence.js:1036 msgid "weekly" msgstr "wekelijks" #: static/recurrence/js/recurrence.js:1036 msgid "daily" msgstr "dagelijks" #: static/recurrence/js/recurrence.js:1037 msgid "hourly" msgstr "elk uur" #: static/recurrence/js/recurrence.js:1037 msgid "minutely" msgstr "elke minuut" #: static/recurrence/js/recurrence.js:1037 msgid "secondly" msgstr "elke seconde" #: static/recurrence/js/recurrence.js:1040 msgid "Monday" msgstr "maandag" #: static/recurrence/js/recurrence.js:1040 msgid "Tuesday" msgstr "dinsdag" #: static/recurrence/js/recurrence.js:1040 msgid "Wednesday" msgstr "woensdag" #: static/recurrence/js/recurrence.js:1040 msgid "Thursday" msgstr "donderdag" #: static/recurrence/js/recurrence.js:1041 msgid "Friday" msgstr "vrijdag" #: static/recurrence/js/recurrence.js:1041 msgid "Saturday" msgstr "zaterdag" #: static/recurrence/js/recurrence.js:1041 msgid "Sunday" msgstr "zondag" #: static/recurrence/js/recurrence.js:1044 msgid "Mon" msgstr "ma" #: static/recurrence/js/recurrence.js:1044 msgid "Tue" msgstr "di" #: static/recurrence/js/recurrence.js:1044 msgid "Wed" msgstr "wo" #: static/recurrence/js/recurrence.js:1044 msgid "Thu" msgstr "do" #: static/recurrence/js/recurrence.js:1045 msgid "Fri" msgstr "vr" #: static/recurrence/js/recurrence.js:1045 msgid "Sat" msgstr "za" #: static/recurrence/js/recurrence.js:1045 msgid "Sun" msgstr "zo" #: static/recurrence/js/recurrence.js:1048 msgctxt "Monday first letter" msgid "M" msgstr "m" #: static/recurrence/js/recurrence.js:1049 msgctxt "Tuesday first letter" msgid "T" msgstr "d" #: static/recurrence/js/recurrence.js:1050 msgctxt "Wednesday first letter" msgid "W" msgstr "w" #: static/recurrence/js/recurrence.js:1051 msgctxt "Thursday first letter" msgid "T" msgstr "d" #: static/recurrence/js/recurrence.js:1052 msgctxt "Friday first letter" msgid "F" msgstr "v" #: static/recurrence/js/recurrence.js:1053 msgctxt "Saturday first letter" msgid "S" msgstr "z" #: static/recurrence/js/recurrence.js:1054 msgctxt "Sunday first letter" msgid "S" msgstr "z" #: static/recurrence/js/recurrence.js:1057 msgid "first %(weekday)s" msgstr "eerste %(weekday)s" #: static/recurrence/js/recurrence.js:1058 msgid "second %(weekday)s" msgstr "tweede %(weekday)s" #: static/recurrence/js/recurrence.js:1059 msgid "third %(weekday)s" msgstr "derde %(weekday)s" #: static/recurrence/js/recurrence.js:1060 msgid "fourth %(weekday)s" msgstr "vierde %(weekday)s" #: static/recurrence/js/recurrence.js:1061 #: static/recurrence/js/recurrence.js:1070 msgid "last %(weekday)s" msgstr "laatste %(weekday)s" #: static/recurrence/js/recurrence.js:1062 msgid "second last %(weekday)s" msgstr "twee na laatste %(weekday)s" #: static/recurrence/js/recurrence.js:1063 msgid "third last %(weekday)s" msgstr "drie na laatste %(weekday)s" #: static/recurrence/js/recurrence.js:1066 msgid "1st %(weekday)s" msgstr "1e %(weekday)s" #: static/recurrence/js/recurrence.js:1067 msgid "2nd %(weekday)s" msgstr "2e %(weekday)s" #: static/recurrence/js/recurrence.js:1068 msgid "3rd %(weekday)s" msgstr "3e %(weekday)s" #: static/recurrence/js/recurrence.js:1069 msgid "4th %(weekday)s" msgstr "4e %(weekday)s" #: static/recurrence/js/recurrence.js:1071 msgid "2nd last %(weekday)s" msgstr "2 na laatste %(weekday)s" #: static/recurrence/js/recurrence.js:1072 msgid "3rd last %(weekday)s" msgstr "3 na laatste %(weekday)s" #: static/recurrence/js/recurrence.js:1075 #: static/recurrence/js/recurrence.js:1081 msgid "last" msgstr "laatste" #: static/recurrence/js/recurrence.js:1076 msgid "second last" msgstr "voorlaatste" #: static/recurrence/js/recurrence.js:1077 msgid "third last" msgstr "derde laatste" #: static/recurrence/js/recurrence.js:1078 msgid "fourth last" msgstr "vierde laatste" #: static/recurrence/js/recurrence.js:1082 msgid "2nd last" msgstr "2 na laatste" #: static/recurrence/js/recurrence.js:1083 msgid "3rd last" msgstr "3 na laatste" #: static/recurrence/js/recurrence.js:1084 msgid "4th last" msgstr "4 na laatste" #: static/recurrence/js/recurrence.js:1087 msgid "January" msgstr "januari" #: static/recurrence/js/recurrence.js:1087 msgid "February" msgstr "februari" #: static/recurrence/js/recurrence.js:1087 #: static/recurrence/js/recurrence.js:1099 msgid "March" msgstr "maart" #: static/recurrence/js/recurrence.js:1088 #: static/recurrence/js/recurrence.js:1100 msgid "April" msgstr "april" #: static/recurrence/js/recurrence.js:1088 #: static/recurrence/js/recurrence.js:1094 #: static/recurrence/js/recurrence.js:1100 msgctxt "month name" msgid "May" msgstr "mei" #: static/recurrence/js/recurrence.js:1088 #: static/recurrence/js/recurrence.js:1100 msgid "June" msgstr "juni" #: static/recurrence/js/recurrence.js:1089 #: static/recurrence/js/recurrence.js:1101 msgid "July" msgstr "juli" #: static/recurrence/js/recurrence.js:1089 msgid "August" msgstr "augustus" #: static/recurrence/js/recurrence.js:1089 msgid "September" msgstr "september" #: static/recurrence/js/recurrence.js:1090 msgid "October" msgstr "oktober" #: static/recurrence/js/recurrence.js:1090 msgid "November" msgstr "november" #: static/recurrence/js/recurrence.js:1090 msgid "December" msgstr "december" #: static/recurrence/js/recurrence.js:1093 msgid "Jan" msgstr "jan" #: static/recurrence/js/recurrence.js:1093 msgid "Feb" msgstr "feb" #: static/recurrence/js/recurrence.js:1093 msgid "Mar" msgstr "mrt" #: static/recurrence/js/recurrence.js:1094 msgid "Apr" msgstr "apr" #: static/recurrence/js/recurrence.js:1094 msgid "Jun" msgstr "jun" #: static/recurrence/js/recurrence.js:1095 msgid "Jul" msgstr "jul" #: static/recurrence/js/recurrence.js:1095 msgid "Aug" msgstr "aug" #: static/recurrence/js/recurrence.js:1095 msgid "Sep" msgstr "sep" #: static/recurrence/js/recurrence.js:1096 msgid "Oct" msgstr "okt" #: static/recurrence/js/recurrence.js:1096 msgid "Nov" msgstr "nov" #: static/recurrence/js/recurrence.js:1096 msgid "Dec" msgstr "dec" #: static/recurrence/js/recurrence.js:1099 msgid "Jan." msgstr "jan" #: static/recurrence/js/recurrence.js:1099 msgid "Feb." msgstr "feb" #: static/recurrence/js/recurrence.js:1101 msgid "Aug." msgstr "aug" #: static/recurrence/js/recurrence.js:1101 msgid "Sept." msgstr "sept" #: static/recurrence/js/recurrence.js:1102 msgid "Oct." msgstr "okt" #: static/recurrence/js/recurrence.js:1102 msgid "Nov." msgstr "nov" #: static/recurrence/js/recurrence.js:1102 msgid "Dec." msgstr "dec" #: static/recurrence/js/recurrence.js:1105 msgid "a.m." msgstr "" #: static/recurrence/js/recurrence.js:1105 msgid "p.m." msgstr "" #: static/recurrence/js/recurrence.js:1106 msgid "AM" msgstr "" #: static/recurrence/js/recurrence.js:1106 msgid "PM" msgstr "" #: static/recurrence/js/recurrence.js:1108 msgctxt "Day of month" msgid "%j%S" msgstr "" #~ msgid "last day" #~ msgstr "laatste dag" ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1643105481.265843 django-recurrence-1.11.1/recurrence/locale/pt_BR/0000755000076500000240000000000000000000000020726 5ustar00aleksistaff././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1643105481.298638 django-recurrence-1.11.1/recurrence/locale/pt_BR/LC_MESSAGES/0000755000076500000240000000000000000000000022513 5ustar00aleksistaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/locale/pt_BR/LC_MESSAGES/django.mo0000644000076500000240000001063600000000000024320 0ustar00aleksistaff\*3HQU[_flp y *4 4G *|                    ( , 6 = D M S X g              . A M e n v      P   / ? K c s            #+/59?C0J;{>1( ,:> FRV_ckpx    4G Vbhp    .7L[ v T* S(DA Q\ >NBO"#9 J6KY&H35/MR$.1EZ; @'C-V<GL2 F4)[?X=W870:U,+%!IP, 1st %(weekday)s2nd %(weekday)s2nd last2nd last %(weekday)s3rd %(weekday)s3rd last3rd last %(weekday)s4th lastAprAprilAugAugustDailyDecDecemberExclusionFebFebruaryFriFridayHourlyInclusionInvalid frequency.JanJanuaryJulJulyJunJuneMarMarchMax dates exceeded. The limit is %(limit)sMax exclusion dates exceeded. The limit is %(limit)sMax exclusion rules exceeded. The limit is %(limit)sMax rules exceeded. The limit is %(limit)sMayMinutelyMonMondayMonthlyNovNovemberOctOctoberSatSaturdaySecondlySepSeptemberSunSundayThuThursdayTueTuesdayWedWednesdayWeeklyYearlyannuallydailydayseach %(items)severy %(number)s %(freq)sfirst %(weekday)sfourth %(weekday)sfourth lasthourlyhourslastlast %(weekday)sminutelyminutesmonthlymonthsoccuring %(number)s timesoccuring onceon the %(items)ssecond %(weekday)ssecond lastsecond last %(weekday)ssecondlysecondsthird %(weekday)sthird lastthird last %(weekday)suntil %(date)sweeklyweeksyearsProject-Id-Version: Report-Msgid-Bugs-To: POT-Creation-Date: 2017-02-24 23:21+0100 PO-Revision-Date: 2017-02-24 23:32+0100 Last-Translator: Diego Ponciano Language-Team: Language: pt_BR MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Gtranslator 2.91.7 ,1º %(weekday)s2º %(weekday)s2º último2º último %(weekday)s3º %(weekday)s3º último3º último %(weekday)s4º últimoAbrAbrilAgoAgostoDiariamenteDezDezembroExclusãoFevFevereiroSexSextaA cada horaInclusãoFreqência inválida.JanJaneiroJulJulhoJunJunhoMarMarçoMáximo de datas excedido. O limite é %(limit)sMáximo de datas excluídas excedido. O limite é %(limit)sMáximo de regras de exclusão excedido. O limite é %(limit)sMáximo de regras excedido. O limite é %(limit)sMaiA cada minutoSegSegundaMensalmenteNovNovembroOutOutubroSábSábadoA cada segundoSetSetembroDomDomingoQuiQuintaTerTerçaQuaQuartaSemanalmenteAnualmenteanualmentediariamentediascada %(items)sa cada %(number)s %(freq)sprimeiro %(weekday)squarto %(weekday)squarto últimoa cada horahorasúltimoúltimo %(weekday)sa cada minutominutosmensalmentemesesque ocorre %(number)s vezesque ocorre uma veznos %(items)ssegundo %(weekday)spenúltimopenúltimo %(weekday)sa cada segundosegundosterceiro %(weekday)santepenúltimoantepenúltimo %(weekday)saté %(date)ssemanalmentesemanasanos././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/locale/pt_BR/LC_MESSAGES/django.po0000644000076500000240000001526300000000000024324 0ustar00aleksistaff# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Diego Ponciano , 2016. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-24 23:21+0100\n" "PO-Revision-Date: 2017-02-24 23:32+0100\n" "Last-Translator: Diego Ponciano \n" "Language-Team: \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Gtranslator 2.91.7\n" #: base.py:1087 msgid "annually" msgstr "anualmente" #: base.py:1087 msgid "monthly" msgstr "mensalmente" #: base.py:1087 msgid "weekly" msgstr "semanalmente" #: base.py:1087 msgid "daily" msgstr "diariamente" #: base.py:1088 msgid "hourly" msgstr "a cada hora" #: base.py:1088 msgid "minutely" msgstr "a cada minuto" #: base.py:1088 msgid "secondly" msgstr "a cada segundo" #: base.py:1091 msgid "years" msgstr "anos" #: base.py:1091 msgid "months" msgstr "meses" #: base.py:1091 msgid "weeks" msgstr "semanas" #: base.py:1091 msgid "days" msgstr "dias" #: base.py:1092 msgid "hours" msgstr "horas" #: base.py:1092 msgid "minutes" msgstr "minutos" #: base.py:1092 msgid "seconds" msgstr "segundos" #: base.py:1097 #, python-format msgid "1st %(weekday)s" msgstr "1º %(weekday)s" #: base.py:1098 #, python-format msgid "2nd %(weekday)s" msgstr "2º %(weekday)s" #: base.py:1099 #, python-format msgid "3rd %(weekday)s" msgstr "3º %(weekday)s" #: base.py:1100 base.py:1126 #, python-format msgid "last %(weekday)s" msgstr "último %(weekday)s" #: base.py:1101 #, python-format msgid "2nd last %(weekday)s" msgstr "2º último %(weekday)s" #: base.py:1102 #, python-format msgid "3rd last %(weekday)s" msgstr "3º último %(weekday)s" #: base.py:1105 base.py:1131 msgid "last" msgstr "último" #: base.py:1106 msgid "2nd last" msgstr "2º último" #: base.py:1107 msgid "3rd last" msgstr "3º último" #: base.py:1108 msgid "4th last" msgstr "4º último" #: base.py:1111 msgid "Mon" msgstr "Seg" #: base.py:1111 msgid "Tue" msgstr "Ter" #: base.py:1111 msgid "Wed" msgstr "Qua" #: base.py:1112 msgid "Thu" msgstr "Qui" #: base.py:1112 msgid "Fri" msgstr "Sex" #: base.py:1112 msgid "Sat" msgstr "Sáb" #: base.py:1112 msgid "Sun" msgstr "Dom" #: base.py:1115 msgid "Jan" msgstr "Jan" #: base.py:1115 msgid "Feb" msgstr "Fev" #: base.py:1115 msgid "Mar" msgstr "Mar" #: base.py:1115 msgid "Apr" msgstr "Abr" #: base.py:1116 msgid "Jun" msgstr "Jun" #: base.py:1116 msgid "Jul" msgstr "Jul" #: base.py:1116 msgid "Aug" msgstr "Ago" #: base.py:1117 msgid "Sep" msgstr "Set" #: base.py:1117 msgid "Oct" msgstr "Out" #: base.py:1117 msgid "Nov" msgstr "Nov" #: base.py:1117 msgid "Dec" msgstr "Dez" #: base.py:1122 #, python-format msgid "first %(weekday)s" msgstr "primeiro %(weekday)s" #: base.py:1123 #, python-format msgid "second %(weekday)s" msgstr "segundo %(weekday)s" #: base.py:1124 #, python-format msgid "third %(weekday)s" msgstr "terceiro %(weekday)s" #: base.py:1125 #, python-format msgid "fourth %(weekday)s" msgstr "quarto %(weekday)s" #: base.py:1127 #, python-format msgid "second last %(weekday)s" msgstr "penúltimo %(weekday)s" #: base.py:1128 #, python-format msgid "third last %(weekday)s" msgstr "antepenúltimo %(weekday)s" #: base.py:1132 msgid "second last" msgstr "penúltimo" #: base.py:1133 msgid "third last" msgstr "antepenúltimo" #: base.py:1134 msgid "fourth last" msgstr "quarto último" #: base.py:1137 choices.py:17 msgid "Monday" msgstr "Segunda" #: base.py:1137 choices.py:18 msgid "Tuesday" msgstr "Terça" #: base.py:1137 choices.py:19 msgid "Wednesday" msgstr "Quarta" #: base.py:1138 choices.py:20 msgid "Thursday" msgstr "Quinta" #: base.py:1138 choices.py:21 msgid "Friday" msgstr "Sexta" #: base.py:1138 choices.py:22 msgid "Saturday" msgstr "Sábado" #: base.py:1138 choices.py:23 msgid "Sunday" msgstr "Domingo" #: base.py:1141 choices.py:27 msgid "January" msgstr "Janeiro" #: base.py:1141 choices.py:28 msgid "February" msgstr "Fevereiro" #: base.py:1141 choices.py:29 msgid "March" msgstr "Março" #: base.py:1141 choices.py:30 msgid "April" msgstr "Abril" #: base.py:1142 choices.py:32 msgid "June" msgstr "Junho" #: base.py:1142 choices.py:33 msgid "July" msgstr "Julho" #: base.py:1142 choices.py:34 msgid "August" msgstr "Agosto" #: base.py:1143 choices.py:35 msgid "September" msgstr "Setembro" #: base.py:1143 choices.py:36 msgid "October" msgstr "Outubro" #: base.py:1143 choices.py:37 msgid "November" msgstr "Novembro" #: base.py:1143 choices.py:38 msgid "December" msgstr "Dezembro" #: base.py:1161 base.py:1178 base.py:1189 base.py:1202 base.py:1220 msgid ", " msgstr "," #: base.py:1167 #, python-format msgid "every %(number)s %(freq)s" msgstr "a cada %(number)s %(freq)s" #: base.py:1181 base.py:1205 #, python-format msgid "each %(items)s" msgstr "cada %(items)s" #: base.py:1184 base.py:1193 base.py:1197 #, python-format msgid "on the %(items)s" msgstr "nos %(items)s" #: base.py:1212 msgid "occuring once" msgstr "que ocorre uma vez" #: base.py:1214 #, python-format msgid "occuring %(number)s times" msgstr "que ocorre %(number)s vezes" #: base.py:1217 #, python-format msgid "until %(date)s" msgstr "até %(date)s" #: choices.py:7 msgid "Secondly" msgstr "A cada segundo" #: choices.py:8 msgid "Minutely" msgstr "A cada minuto" #: choices.py:9 msgid "Hourly" msgstr "A cada hora" #: choices.py:10 msgid "Daily" msgstr "Diariamente" #: choices.py:11 msgid "Weekly" msgstr "Semanalmente" #: choices.py:12 msgid "Monthly" msgstr "Mensalmente" #: choices.py:13 msgid "Yearly" msgstr "Anualmente" #: choices.py:31 msgid "May" msgstr "Mai" #: choices.py:44 msgid "Inclusion" msgstr "Inclusão" #: choices.py:45 msgid "Exclusion" msgstr "Exclusão" #: forms.py:72 msgid "Invalid frequency." msgstr "Freqência inválida." #: forms.py:74 #, python-format msgid "Max rules exceeded. The limit is %(limit)s" msgstr "Máximo de regras excedido. O limite é %(limit)s" #: forms.py:76 #, python-format msgid "Max exclusion rules exceeded. The limit is %(limit)s" msgstr "Máximo de regras de exclusão excedido. O limite é %(limit)s" #: forms.py:78 #, python-format msgid "Max dates exceeded. The limit is %(limit)s" msgstr "Máximo de datas excedido. O limite é %(limit)s" #: forms.py:80 #, python-format msgid "Max exclusion dates exceeded. The limit is %(limit)s" msgstr "Máximo de datas excluídas excedido. O limite é %(limit)s" #~ msgid "year" #~ msgstr "ano" #~ msgid "month" #~ msgstr "mês" #~ msgid "week" #~ msgstr "semana" #~ msgid "day" #~ msgstr "dia" #~ msgid "hour" #~ msgstr "hora" #~ msgid "minute" #~ msgstr "minuto" #~ msgid "second" #~ msgstr "segundo" ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/locale/pt_BR/LC_MESSAGES/djangojs.mo0000644000076500000240000001240400000000000024650 0ustar00aleksistaff{h i y                 & + / 4 = B H a s w |                    ' ? C H P W Z a n r {                ) B G P V Z _ n          +3:?Xr   &,1P7     )48>BG NZ_chqv{  #9QUZbeh p}   *4I\k p|     )7<D Xcz  *W5Fh^g0P?xaAV8MK't +p]EY;q"QoB.4)&m(Ru,O6Jck3#IDsb@nCie=1->jG%< 7LX!S2 z9w f [NdZHv: /\`{U$_Tylr1st %(weekday)s2nd %(weekday)s2nd last2nd last %(weekday)s3rd %(weekday)s3rd last3rd last %(weekday)s4th %(weekday)s4th lastAMAdd dateAdd ruleAprAprilAugAug.AugustCalendarDateDecDec.DecemberEachEveryExclude these occurencesExclude this dateFebFeb.FebruaryFrequencyFriFridayFriday first letterFJanJan.JanuaryJulJulyJunJuneMarMarchMonMondayMonday first letterMNovNov.NovemberOccurs %(number)s timeOccurs %(number)s timesOctOct.OctoberOn thePMRemoveRepeat untilSatSaturdaySaturday first letterSSepSept.SeptemberSunSundaySunday first letterSThuThursdayThursday first letterTTimeTueTuesdayTuesday first letterTUntilWedWednesdayWednesday first letterWa.m.annuallydailydaydayseach %(items)severy %(number)s %(freq)sexcludingfirst %(weekday)sfourth %(weekday)sfourth lasthourhourlyhoursincludinglastlast %(weekday)smidnightminuteminutelyminutesmonthmonth nameMaymonthlymonthsnoonoccuring %(number)s timeoccuring %(number)s timeson the %(items)sp.m.secondsecond %(weekday)ssecond lastsecond last %(weekday)ssecondlysecondsthird %(weekday)sthird lastthird last %(weekday)suntil %(date)sweekweeklyweeksyearyearsProject-Id-Version: Report-Msgid-Bugs-To: POT-Creation-Date: 2017-02-24 23:11+0100 PO-Revision-Date: 2017-02-24 23:33+0100 Last-Translator: Diego Ponciano Language-Team: Language: pt_BR MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Gtranslator 2.91.7 1º %(weekday)s2º %(weekday)s2º último2º último %(weekday)s3º %(weekday)s3º último3º último %(weekday)s4º %(weekday)s4º últimoAMNova dataNova regraAbrAbrilAgoAgo.AgostoCalendárioDataDezDez.DezembroCadaTodaExcluir estas ocorrênciasExcluir esta dataFevFev.FevereiroFrequênciaSexSextaSJanJan.JaneiroJulJulhoJunJunhoMarMarçoSegSegundaSNovNov.NovembroOcorre %(number)s vezOcorre %(number)s vezesOutOut.OutubroNaPMRemoverRepetir atéSábSábadoSSetSet.SetembroDomDomingoDQuiQuintaQHoraTerTerçaTAtéQuaQuartaQa.m.anualmentediariamentediadiascada %(items)stodo %(number)s %(freq)sexcluindoprimeiro %(weekday)squarto %(weekday)squarto últimohoraa cada horahorasincluindoúltimoúltimo %(weekday)smeia-noiteminutoa cada minutominutosmêsMaiomensalmentemesesmeio-diaocorrendo %(number)s vezocorrendo %(number)s vezesnos %(items)sp.m.segundosegundo %(weekday)spenúltimopenúltimo %(weekday)sa cada segundosegundosterceiro %(weekday)santipenúltimoantipenúltimo %(weekday)saté %(date)ssemanasemanalmentesemanasanoanos././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/locale/pt_BR/LC_MESSAGES/djangojs.po0000644000076500000240000002616000000000000024657 0ustar00aleksistaff# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # FULL NAME , 2016. # Diego Ponciano , 2016. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-24 23:11+0100\n" "PO-Revision-Date: 2017-02-24 23:33+0100\n" "Last-Translator: Diego Ponciano \n" "Language-Team: \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Gtranslator 2.91.7\n" #: static/recurrence/js/recurrence-widget.js:1609 msgctxt "date" msgid "%l, %F %j, %Y" msgstr "" #: static/recurrence/js/recurrence-widget.js:1774 msgid "including" msgstr "incluindo" #: static/recurrence/js/recurrence-widget.js:1774 msgid "excluding" msgstr "excluindo" #: static/recurrence/js/recurrence-widget.js:1778 msgid "Frequency" msgstr "Frequência" #: static/recurrence/js/recurrence-widget.js:1779 msgid "On the" msgstr "Na" #: static/recurrence/js/recurrence-widget.js:1780 msgid "Each" msgstr "Cada" #: static/recurrence/js/recurrence-widget.js:1781 msgid "Every" msgstr "Toda" #: static/recurrence/js/recurrence-widget.js:1782 msgid "Until" msgstr "Até" #: static/recurrence/js/recurrence-widget.js:1783 msgid "Occurs %(number)s time" msgstr "Ocorre %(number)s vez" #: static/recurrence/js/recurrence-widget.js:1784 msgid "Occurs %(number)s times" msgstr "Ocorre %(number)s vezes" #: static/recurrence/js/recurrence-widget.js:1785 msgid "Date" msgstr "Data" #: static/recurrence/js/recurrence-widget.js:1786 msgid "Time" msgstr "Hora" #: static/recurrence/js/recurrence-widget.js:1787 msgid "Repeat until" msgstr "Repetir até" #: static/recurrence/js/recurrence-widget.js:1788 msgid "Exclude these occurences" msgstr "Excluir estas ocorrências" #: static/recurrence/js/recurrence-widget.js:1789 msgid "Exclude this date" msgstr "Excluir esta data" #: static/recurrence/js/recurrence-widget.js:1790 msgid "Add rule" msgstr "Nova regra" #: static/recurrence/js/recurrence-widget.js:1791 msgid "Add date" msgstr "Nova data" #: static/recurrence/js/recurrence-widget.js:1792 msgid "Remove" msgstr "Remover" #: static/recurrence/js/recurrence-widget.js:1793 msgid "Calendar" msgstr "Calendário" #: static/recurrence/js/recurrence.js:218 msgctxt "Until date format" msgid "%Y-%m-%d" msgstr "" #: static/recurrence/js/recurrence.js:1017 msgid "midnight" msgstr "meia-noite" #: static/recurrence/js/recurrence.js:1018 msgid "noon" msgstr "meio-dia" #: static/recurrence/js/recurrence.js:1019 msgid "on the %(items)s" msgstr "nos %(items)s" #: static/recurrence/js/recurrence.js:1020 msgid "every %(number)s %(freq)s" msgstr "todo %(number)s %(freq)s" #: static/recurrence/js/recurrence.js:1021 msgid "each %(items)s" msgstr "cada %(items)s" #: static/recurrence/js/recurrence.js:1022 msgid "occuring %(number)s time" msgstr "ocorrendo %(number)s vez" #: static/recurrence/js/recurrence.js:1023 msgid "occuring %(number)s times" msgstr "ocorrendo %(number)s vezes" #: static/recurrence/js/recurrence.js:1024 msgid "until %(date)s" msgstr "até %(date)s" #: static/recurrence/js/recurrence.js:1028 msgid "year" msgstr "ano" #: static/recurrence/js/recurrence.js:1028 msgid "month" msgstr "mês" #: static/recurrence/js/recurrence.js:1028 msgid "week" msgstr "semana" #: static/recurrence/js/recurrence.js:1028 msgid "day" msgstr "dia" #: static/recurrence/js/recurrence.js:1029 msgid "hour" msgstr "hora" #: static/recurrence/js/recurrence.js:1029 msgid "minute" msgstr "minuto" #: static/recurrence/js/recurrence.js:1029 msgid "second" msgstr "segundo" #: static/recurrence/js/recurrence.js:1032 msgid "years" msgstr "anos" #: static/recurrence/js/recurrence.js:1032 msgid "months" msgstr "meses" #: static/recurrence/js/recurrence.js:1032 msgid "weeks" msgstr "semanas" #: static/recurrence/js/recurrence.js:1032 msgid "days" msgstr "dias" #: static/recurrence/js/recurrence.js:1033 msgid "hours" msgstr "horas" #: static/recurrence/js/recurrence.js:1033 msgid "minutes" msgstr "minutos" #: static/recurrence/js/recurrence.js:1033 msgid "seconds" msgstr "segundos" #: static/recurrence/js/recurrence.js:1036 msgid "annually" msgstr "anualmente" #: static/recurrence/js/recurrence.js:1036 msgid "monthly" msgstr "mensalmente" #: static/recurrence/js/recurrence.js:1036 msgid "weekly" msgstr "semanalmente" #: static/recurrence/js/recurrence.js:1036 msgid "daily" msgstr "diariamente" #: static/recurrence/js/recurrence.js:1037 msgid "hourly" msgstr "a cada hora" #: static/recurrence/js/recurrence.js:1037 msgid "minutely" msgstr "a cada minuto" #: static/recurrence/js/recurrence.js:1037 msgid "secondly" msgstr "a cada segundo" #: static/recurrence/js/recurrence.js:1040 msgid "Monday" msgstr "Segunda" #: static/recurrence/js/recurrence.js:1040 msgid "Tuesday" msgstr "Terça" #: static/recurrence/js/recurrence.js:1040 msgid "Wednesday" msgstr "Quarta" #: static/recurrence/js/recurrence.js:1040 msgid "Thursday" msgstr "Quinta" #: static/recurrence/js/recurrence.js:1041 msgid "Friday" msgstr "Sexta" #: static/recurrence/js/recurrence.js:1041 msgid "Saturday" msgstr "Sábado" #: static/recurrence/js/recurrence.js:1041 msgid "Sunday" msgstr "Domingo" #: static/recurrence/js/recurrence.js:1044 msgid "Mon" msgstr "Seg" #: static/recurrence/js/recurrence.js:1044 msgid "Tue" msgstr "Ter" #: static/recurrence/js/recurrence.js:1044 msgid "Wed" msgstr "Qua" #: static/recurrence/js/recurrence.js:1044 msgid "Thu" msgstr "Qui" #: static/recurrence/js/recurrence.js:1045 msgid "Fri" msgstr "Sex" #: static/recurrence/js/recurrence.js:1045 msgid "Sat" msgstr "Sáb" #: static/recurrence/js/recurrence.js:1045 msgid "Sun" msgstr "Dom" #: static/recurrence/js/recurrence.js:1048 msgctxt "Monday first letter" msgid "M" msgstr "S" #: static/recurrence/js/recurrence.js:1049 msgctxt "Tuesday first letter" msgid "T" msgstr "T" #: static/recurrence/js/recurrence.js:1050 msgctxt "Wednesday first letter" msgid "W" msgstr "Q" #: static/recurrence/js/recurrence.js:1051 msgctxt "Thursday first letter" msgid "T" msgstr "Q" #: static/recurrence/js/recurrence.js:1052 msgctxt "Friday first letter" msgid "F" msgstr "S" #: static/recurrence/js/recurrence.js:1053 msgctxt "Saturday first letter" msgid "S" msgstr "S" #: static/recurrence/js/recurrence.js:1054 msgctxt "Sunday first letter" msgid "S" msgstr "D" #: static/recurrence/js/recurrence.js:1057 msgid "first %(weekday)s" msgstr "primeiro %(weekday)s" #: static/recurrence/js/recurrence.js:1058 msgid "second %(weekday)s" msgstr "segundo %(weekday)s" #: static/recurrence/js/recurrence.js:1059 msgid "third %(weekday)s" msgstr "terceiro %(weekday)s" #: static/recurrence/js/recurrence.js:1060 msgid "fourth %(weekday)s" msgstr "quarto %(weekday)s" #: static/recurrence/js/recurrence.js:1061 #: static/recurrence/js/recurrence.js:1070 msgid "last %(weekday)s" msgstr "último %(weekday)s" #: static/recurrence/js/recurrence.js:1062 msgid "second last %(weekday)s" msgstr "penúltimo %(weekday)s" #: static/recurrence/js/recurrence.js:1063 msgid "third last %(weekday)s" msgstr "antipenúltimo %(weekday)s" #: static/recurrence/js/recurrence.js:1066 msgid "1st %(weekday)s" msgstr "1º %(weekday)s" #: static/recurrence/js/recurrence.js:1067 msgid "2nd %(weekday)s" msgstr "2º %(weekday)s" #: static/recurrence/js/recurrence.js:1068 msgid "3rd %(weekday)s" msgstr "3º %(weekday)s" #: static/recurrence/js/recurrence.js:1069 msgid "4th %(weekday)s" msgstr "4º %(weekday)s" #: static/recurrence/js/recurrence.js:1071 msgid "2nd last %(weekday)s" msgstr "2º último %(weekday)s" #: static/recurrence/js/recurrence.js:1072 msgid "3rd last %(weekday)s" msgstr "3º último %(weekday)s" #: static/recurrence/js/recurrence.js:1075 #: static/recurrence/js/recurrence.js:1081 msgid "last" msgstr "último" #: static/recurrence/js/recurrence.js:1076 msgid "second last" msgstr "penúltimo" #: static/recurrence/js/recurrence.js:1077 msgid "third last" msgstr "antipenúltimo" #: static/recurrence/js/recurrence.js:1078 msgid "fourth last" msgstr "quarto último" #: static/recurrence/js/recurrence.js:1082 msgid "2nd last" msgstr "2º último" #: static/recurrence/js/recurrence.js:1083 msgid "3rd last" msgstr "3º último" #: static/recurrence/js/recurrence.js:1084 msgid "4th last" msgstr "4º último" #: static/recurrence/js/recurrence.js:1087 msgid "January" msgstr "Janeiro" #: static/recurrence/js/recurrence.js:1087 msgid "February" msgstr "Fevereiro" #: static/recurrence/js/recurrence.js:1087 #: static/recurrence/js/recurrence.js:1099 msgid "March" msgstr "Março" #: static/recurrence/js/recurrence.js:1088 #: static/recurrence/js/recurrence.js:1100 msgid "April" msgstr "Abril" #: static/recurrence/js/recurrence.js:1088 #: static/recurrence/js/recurrence.js:1094 #: static/recurrence/js/recurrence.js:1100 msgctxt "month name" msgid "May" msgstr "Maio" #: static/recurrence/js/recurrence.js:1088 #: static/recurrence/js/recurrence.js:1100 msgid "June" msgstr "Junho" #: static/recurrence/js/recurrence.js:1089 #: static/recurrence/js/recurrence.js:1101 msgid "July" msgstr "Julho" #: static/recurrence/js/recurrence.js:1089 msgid "August" msgstr "Agosto" #: static/recurrence/js/recurrence.js:1089 msgid "September" msgstr "Setembro" #: static/recurrence/js/recurrence.js:1090 msgid "October" msgstr "Outubro" #: static/recurrence/js/recurrence.js:1090 msgid "November" msgstr "Novembro" #: static/recurrence/js/recurrence.js:1090 msgid "December" msgstr "Dezembro" #: static/recurrence/js/recurrence.js:1093 msgid "Jan" msgstr "Jan" #: static/recurrence/js/recurrence.js:1093 msgid "Feb" msgstr "Fev" #: static/recurrence/js/recurrence.js:1093 msgid "Mar" msgstr "Mar" #: static/recurrence/js/recurrence.js:1094 msgid "Apr" msgstr "Abr" #: static/recurrence/js/recurrence.js:1094 msgid "Jun" msgstr "Jun" #: static/recurrence/js/recurrence.js:1095 msgid "Jul" msgstr "Jul" #: static/recurrence/js/recurrence.js:1095 msgid "Aug" msgstr "Ago" #: static/recurrence/js/recurrence.js:1095 msgid "Sep" msgstr "Set" #: static/recurrence/js/recurrence.js:1096 msgid "Oct" msgstr "Out" #: static/recurrence/js/recurrence.js:1096 msgid "Nov" msgstr "Nov" #: static/recurrence/js/recurrence.js:1096 msgid "Dec" msgstr "Dez" #: static/recurrence/js/recurrence.js:1099 msgid "Jan." msgstr "Jan." #: static/recurrence/js/recurrence.js:1099 msgid "Feb." msgstr "Fev." #: static/recurrence/js/recurrence.js:1101 msgid "Aug." msgstr "Ago." #: static/recurrence/js/recurrence.js:1101 msgid "Sept." msgstr "Set." #: static/recurrence/js/recurrence.js:1102 msgid "Oct." msgstr "Out." #: static/recurrence/js/recurrence.js:1102 msgid "Nov." msgstr "Nov." #: static/recurrence/js/recurrence.js:1102 msgid "Dec." msgstr "Dez." #: static/recurrence/js/recurrence.js:1105 msgid "a.m." msgstr "a.m." #: static/recurrence/js/recurrence.js:1105 msgid "p.m." msgstr "p.m." #: static/recurrence/js/recurrence.js:1106 msgid "AM" msgstr "AM" #: static/recurrence/js/recurrence.js:1106 msgid "PM" msgstr "PM" #: static/recurrence/js/recurrence.js:1108 msgctxt "Day of month" msgid "%j%S" msgstr "" #~ msgid "last day" #~ msgstr "último day" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1643105481.2660677 django-recurrence-1.11.1/recurrence/locale/sk/0000755000076500000240000000000000000000000020335 5ustar00aleksistaff././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1643105481.299658 django-recurrence-1.11.1/recurrence/locale/sk/LC_MESSAGES/0000755000076500000240000000000000000000000022122 5ustar00aleksistaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/locale/sk/LC_MESSAGES/django.mo0000644000076500000240000001070300000000000023722 0ustar00aleksistaff\*3HQU[_flp y *4 4G *|                    ( , 6 = D M S X g              . A M e n v           # = P ` ~               %*/481>@pC4*/HKT]ajnwz   &8M_w ~   $>W_r  T* S(DA Q\ >NBO"#9 J6KY&H35/MR$.1EZ; @'C-V<GL2 F4)[?X=W870:U,+%!IP, 1st %(weekday)s2nd %(weekday)s2nd last2nd last %(weekday)s3rd %(weekday)s3rd last3rd last %(weekday)s4th lastAprAprilAugAugustDailyDecDecemberExclusionFebFebruaryFriFridayHourlyInclusionInvalid frequency.JanJanuaryJulJulyJunJuneMarMarchMax dates exceeded. The limit is %(limit)sMax exclusion dates exceeded. The limit is %(limit)sMax exclusion rules exceeded. The limit is %(limit)sMax rules exceeded. The limit is %(limit)sMayMinutelyMonMondayMonthlyNovNovemberOctOctoberSatSaturdaySecondlySepSeptemberSunSundayThuThursdayTueTuesdayWedWednesdayWeeklyYearlyannuallydailydayseach %(items)severy %(number)s %(freq)sfirst %(weekday)sfourth %(weekday)sfourth lasthourlyhourslastlast %(weekday)sminutelyminutesmonthlymonthsoccuring %(number)s timesoccuring onceon the %(items)ssecond %(weekday)ssecond lastsecond last %(weekday)ssecondlysecondsthird %(weekday)sthird lastthird last %(weekday)suntil %(date)sweeklyweeksyearsProject-Id-Version: Report-Msgid-Bugs-To: POT-Creation-Date: 2017-02-24 23:21+0100 PO-Revision-Date: 2017-07-28 13:58+0200 Language: sk MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Last-Translator: Language-Team: X-Generator: Poedit 2.0.1 , prvý %(weekday)sdruhý %(weekday)spredposlednýpredposledný %(weekday)stretí %(weekday)stretí od koncapredpredposledný %(weekday)sštvrý od koncaAprAprílAugAugustDenneDecDecemberVylúčenéFebFebruárPiPiatokKaždú zvolenú hodinuZahrnutéNesprávna frekvencia.JanJanuárJúlJúlJúnJúnMarMarecMaximum dátumov prekročené. Limit je %(limit)sMaximum vylučovacích dátumov prekročené. Limit je %(limit)sMaximum vylučovacích pravidiel prekročených. Limit je %(limit)sMaximum pravidiel prekročených. Limit je %(limit)sMájKaždú zvolenú minútuPoPondelokMesačneNovNovemberOktOktóberSoSobotaKaždú zvolenú sekunduSepSeptemberNeNedeľaŠtŠtvrtokUtUtorokStStredaTýždenneRočneročnedennednikaždý %(items)skaždý %(number)s %(freq)sprvý %(weekday)sštvrtý %(weekday)sštvrtý od koncakaždú zvolenú hodinuhodinyposlednýposledný %(weekday)skaždú zvolenú minútuminútymesačnemesiacenastáva %(number)s krátnastáva razo %(items)sdruhý %(weekday)spredpoklednýpredposledný %(weekday)skaždú zvolenú sekundusekundutretí %(weekday)stretí od koncatretí %(weekday)s od koncado %(date)stýždennetýždneroky././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/locale/sk/LC_MESSAGES/django.po0000644000076500000240000001472600000000000023736 0ustar00aleksistaff# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-24 23:21+0100\n" "PO-Revision-Date: 2017-07-28 13:58+0200\n" "Language: sk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Last-Translator: \n" "Language-Team: \n" "X-Generator: Poedit 2.0.1\n" #: base.py:1087 msgid "annually" msgstr "ročne" #: base.py:1087 msgid "monthly" msgstr "mesačne" #: base.py:1087 msgid "weekly" msgstr "týždenne" #: base.py:1087 msgid "daily" msgstr "denne" #: base.py:1088 msgid "hourly" msgstr "každú zvolenú hodinu" #: base.py:1088 msgid "minutely" msgstr "každú zvolenú minútu" #: base.py:1088 msgid "secondly" msgstr "každú zvolenú sekundu" #: base.py:1091 msgid "years" msgstr "roky" #: base.py:1091 msgid "months" msgstr "mesiace" #: base.py:1091 msgid "weeks" msgstr "týždne" #: base.py:1091 msgid "days" msgstr "dni" #: base.py:1092 msgid "hours" msgstr "hodiny" #: base.py:1092 msgid "minutes" msgstr "minúty" #: base.py:1092 msgid "seconds" msgstr "sekundu" #: base.py:1097 #, python-format msgid "1st %(weekday)s" msgstr "prvý %(weekday)s" #: base.py:1098 #, python-format msgid "2nd %(weekday)s" msgstr "druhý %(weekday)s" #: base.py:1099 #, python-format msgid "3rd %(weekday)s" msgstr "tretí %(weekday)s" #: base.py:1100 base.py:1126 #, python-format msgid "last %(weekday)s" msgstr "posledný %(weekday)s" #: base.py:1101 #, python-format msgid "2nd last %(weekday)s" msgstr "predposledný %(weekday)s" #: base.py:1102 #, python-format msgid "3rd last %(weekday)s" msgstr "predpredposledný %(weekday)s" #: base.py:1105 base.py:1131 msgid "last" msgstr "posledný" #: base.py:1106 msgid "2nd last" msgstr "predposledný" #: base.py:1107 msgid "3rd last" msgstr "tretí od konca" #: base.py:1108 msgid "4th last" msgstr "štvrý od konca" #: base.py:1111 msgid "Mon" msgstr "Po" #: base.py:1111 msgid "Tue" msgstr "Ut" #: base.py:1111 msgid "Wed" msgstr "St" #: base.py:1112 msgid "Thu" msgstr "Št" #: base.py:1112 msgid "Fri" msgstr "Pi" #: base.py:1112 msgid "Sat" msgstr "So" #: base.py:1112 msgid "Sun" msgstr "Ne" #: base.py:1115 msgid "Jan" msgstr "Jan" #: base.py:1115 msgid "Feb" msgstr "Feb" #: base.py:1115 msgid "Mar" msgstr "Mar" #: base.py:1115 msgid "Apr" msgstr "Apr" #: base.py:1116 msgid "Jun" msgstr "Jún" #: base.py:1116 msgid "Jul" msgstr "Júl" #: base.py:1116 msgid "Aug" msgstr "Aug" #: base.py:1117 msgid "Sep" msgstr "Sep" #: base.py:1117 msgid "Oct" msgstr "Okt" #: base.py:1117 msgid "Nov" msgstr "Nov" #: base.py:1117 msgid "Dec" msgstr "Dec" #: base.py:1122 #, python-format msgid "first %(weekday)s" msgstr "prvý %(weekday)s" #: base.py:1123 #, python-format msgid "second %(weekday)s" msgstr "druhý %(weekday)s" #: base.py:1124 #, python-format msgid "third %(weekday)s" msgstr "tretí %(weekday)s" #: base.py:1125 #, python-format msgid "fourth %(weekday)s" msgstr "štvrtý %(weekday)s" #: base.py:1127 #, python-format msgid "second last %(weekday)s" msgstr "predposledný %(weekday)s" #: base.py:1128 #, python-format msgid "third last %(weekday)s" msgstr "tretí %(weekday)s od konca" #: base.py:1132 msgid "second last" msgstr "predpokledný" #: base.py:1133 msgid "third last" msgstr "tretí od konca" #: base.py:1134 msgid "fourth last" msgstr "štvrtý od konca" #: base.py:1137 choices.py:17 msgid "Monday" msgstr "Pondelok" #: base.py:1137 choices.py:18 msgid "Tuesday" msgstr "Utorok" #: base.py:1137 choices.py:19 msgid "Wednesday" msgstr "Streda" #: base.py:1138 choices.py:20 msgid "Thursday" msgstr "Štvrtok" #: base.py:1138 choices.py:21 msgid "Friday" msgstr "Piatok" #: base.py:1138 choices.py:22 msgid "Saturday" msgstr "Sobota" #: base.py:1138 choices.py:23 msgid "Sunday" msgstr "Nedeľa" #: base.py:1141 choices.py:27 msgid "January" msgstr "Január" #: base.py:1141 choices.py:28 msgid "February" msgstr "Február" #: base.py:1141 choices.py:29 msgid "March" msgstr "Marec" #: base.py:1141 choices.py:30 msgid "April" msgstr "Apríl" #: base.py:1142 choices.py:32 msgid "June" msgstr "Jún" #: base.py:1142 choices.py:33 msgid "July" msgstr "Júl" #: base.py:1142 choices.py:34 msgid "August" msgstr "August" #: base.py:1143 choices.py:35 msgid "September" msgstr "September" #: base.py:1143 choices.py:36 msgid "October" msgstr "Október" #: base.py:1143 choices.py:37 msgid "November" msgstr "November" #: base.py:1143 choices.py:38 msgid "December" msgstr "December" #: base.py:1161 base.py:1178 base.py:1189 base.py:1202 base.py:1220 msgid ", " msgstr ", " #: base.py:1167 #, python-format msgid "every %(number)s %(freq)s" msgstr "každý %(number)s %(freq)s" #: base.py:1181 base.py:1205 #, python-format msgid "each %(items)s" msgstr "každý %(items)s" #: base.py:1184 base.py:1193 base.py:1197 #, python-format msgid "on the %(items)s" msgstr "o %(items)s" #: base.py:1212 msgid "occuring once" msgstr "nastáva raz" #: base.py:1214 #, python-format msgid "occuring %(number)s times" msgstr "nastáva %(number)s krát" #: base.py:1217 #, python-format msgid "until %(date)s" msgstr "do %(date)s" #: choices.py:7 msgid "Secondly" msgstr "Každú zvolenú sekundu" #: choices.py:8 msgid "Minutely" msgstr "Každú zvolenú minútu" #: choices.py:9 msgid "Hourly" msgstr "Každú zvolenú hodinu" #: choices.py:10 msgid "Daily" msgstr "Denne" #: choices.py:11 msgid "Weekly" msgstr "Týždenne" #: choices.py:12 msgid "Monthly" msgstr "Mesačne" #: choices.py:13 msgid "Yearly" msgstr "Ročne" #: choices.py:31 msgid "May" msgstr "Máj" #: choices.py:44 msgid "Inclusion" msgstr "Zahrnuté" #: choices.py:45 msgid "Exclusion" msgstr "Vylúčené" #: forms.py:72 msgid "Invalid frequency." msgstr "Nesprávna frekvencia." #: forms.py:74 #, python-format msgid "Max rules exceeded. The limit is %(limit)s" msgstr "Maximum pravidiel prekročených. Limit je %(limit)s" #: forms.py:76 #, python-format msgid "Max exclusion rules exceeded. The limit is %(limit)s" msgstr "Maximum vylučovacích pravidiel prekročených. Limit je %(limit)s" #: forms.py:78 #, python-format msgid "Max dates exceeded. The limit is %(limit)s" msgstr "Maximum dátumov prekročené. Limit je %(limit)s" #: forms.py:80 #, python-format msgid "Max exclusion dates exceeded. The limit is %(limit)s" msgstr "Maximum vylučovacích dátumov prekročené. Limit je %(limit)s" ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/locale/sk/LC_MESSAGES/djangojs.mo0000644000076500000240000001272500000000000024265 0ustar00aleksistaff}             # ' - 1 6 = F K ] a f o t z                    0 4 9 B Y q u z                ! ) @ F a e o           !( .8=NW^gou (0 BMdsx  !?Q bm|  %FIPRV[chmrw{    (+359BEJMTVYbel ny  -4 =G]dl  $>W_r   +Y6Fj`i1Q?zcAX8NK(v!,r_E[;s#RqB/5*'o)Tw-P7Jem4$IDudL@pCkg=2.>lG&< MZ"U3 |9ay h{ ]Of\ Hx: 0^b}W%SVnt1st %(weekday)s2nd %(weekday)s2nd last2nd last %(weekday)s3rd %(weekday)s3rd last3rd last %(weekday)s4th %(weekday)s4th lastAMAdd dateAdd ruleAprAprilAugAug.AugustCalendarDateDay of month%j%SDecDec.DecemberEachEveryExclude these occurencesExclude this dateFebFeb.FebruaryFrequencyFriFridayFriday first letterFJanJan.JanuaryJulJulyJunJuneMarMarchMonMondayMonday first letterMNovNov.NovemberOccurs %(number)s timeOccurs %(number)s timesOctOct.OctoberPMRemoveRepeat untilSatSaturdaySaturday first letterSSepSept.SeptemberSunSundaySunday first letterSThuThursdayThursday first letterTTimeTueTuesdayTuesday first letterTUntilUntil date format%Y-%m-%dWedWednesdayWednesday first letterWa.m.annuallydailydate%l, %F %j, %Ydaydayseach %(items)severy %(number)s %(freq)sexcludingfirst %(weekday)sfourth %(weekday)sfourth lasthourhourlyhoursincludinglastlast %(weekday)smidnightminuteminutelyminutesmonthmonth nameMaymonthlymonthsnoonoccuring %(number)s timeoccuring %(number)s timeson the %(items)sp.m.secondsecond %(weekday)ssecond lastsecond last %(weekday)ssecondlysecondsthird %(weekday)sthird lastthird last %(weekday)suntil %(date)sweekweeklyweeksyearyearsProject-Id-Version: Report-Msgid-Bugs-To: POT-Creation-Date: 2017-02-24 23:11+0100 PO-Revision-Date: 2017-07-28 14:23+0200 Language: sk MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Last-Translator: Language-Team: X-Generator: Poedit 2.0.1 prvý %(weekday)sdruhý %(weekday)spredposlednýpredposledný %(weekday)stretí %(weekday)stretí od koncapredpredposledný %(weekday)sprvý %(weekday)sštvrý od koncapredobedomPridať dátumPridať pravidloAprAprílAugAug.AugustKalendárDátum%j%SDecDec.DecemberKaždýKaždýVylúčiť tieto pravidláVylúčiť tento dátumFebFeb.FebruárFrekvenciaNesprávna frekvencia.PiPiatokPJanJan.JanuárJúlJúlJúnJúnMarMarecPoPondelokPNovNov.NovemberNastáva %(number)s krátNastáva %(number)s krátOktOkt.OktóberpoobedeOdstrániťOpakovať doSoSobotaSSepSept.SeptemberNeNedeľaNŠtŠtvrtokŠČasUtUtorokUDo%d.%m.%YStStredaSpredobedomročnedenne%l, %F %j, %Ydeňdnikaždý %(items)skaždý %(number)s %(freq)svylučujeprvý %(weekday)sštvrtý %(weekday)sštvrtý od koncahodinakaždú zvolenú hodinuhodinyzahŕňaposlednýposledný %(weekday)spolnocminútakaždú zvolenú minútuminútymesiacMájmesačnemesiacepoludnienastáva %(number)s krátnastáva %(number)s kráto %(items)spoobedesekundadruhý %(weekday)spredpoklednýpredposledný %(weekday)skaždú zvolenú sekundusekundytretí %(weekday)stretí od koncatretí %(weekday)s od koncado %(date)stýždeňtýždennetýždnerokrokyroky././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/locale/sk/LC_MESSAGES/djangojs.po0000644000076500000240000002614500000000000024271 0ustar00aleksistaff# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-24 23:11+0100\n" "PO-Revision-Date: 2017-07-28 14:23+0200\n" "Language: sk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Last-Translator: \n" "Language-Team: \n" "X-Generator: Poedit 2.0.1\n" #: static/recurrence/js/recurrence-widget.js:1609 msgctxt "date" msgid "%l, %F %j, %Y" msgstr "%l, %F %j, %Y" #: static/recurrence/js/recurrence-widget.js:1774 msgid "including" msgstr "zahŕňa" #: static/recurrence/js/recurrence-widget.js:1774 msgid "excluding" msgstr "vylučuje" #: static/recurrence/js/recurrence-widget.js:1778 msgid "Frequency" msgstr "FrekvenciaNesprávna frekvencia." #: static/recurrence/js/recurrence-widget.js:1779 msgid "On the" msgstr "" #: static/recurrence/js/recurrence-widget.js:1780 msgid "Each" msgstr "Každý" #: static/recurrence/js/recurrence-widget.js:1781 msgid "Every" msgstr "Každý" #: static/recurrence/js/recurrence-widget.js:1782 msgid "Until" msgstr "Do" #: static/recurrence/js/recurrence-widget.js:1783 msgid "Occurs %(number)s time" msgstr "Nastáva %(number)s krát" #: static/recurrence/js/recurrence-widget.js:1784 msgid "Occurs %(number)s times" msgstr "Nastáva %(number)s krát" #: static/recurrence/js/recurrence-widget.js:1785 msgid "Date" msgstr "Dátum" #: static/recurrence/js/recurrence-widget.js:1786 msgid "Time" msgstr "Čas" #: static/recurrence/js/recurrence-widget.js:1787 msgid "Repeat until" msgstr "Opakovať do" #: static/recurrence/js/recurrence-widget.js:1788 msgid "Exclude these occurences" msgstr "Vylúčiť tieto pravidlá" #: static/recurrence/js/recurrence-widget.js:1789 msgid "Exclude this date" msgstr "Vylúčiť tento dátum" #: static/recurrence/js/recurrence-widget.js:1790 msgid "Add rule" msgstr "Pridať pravidlo" #: static/recurrence/js/recurrence-widget.js:1791 msgid "Add date" msgstr "Pridať dátum" #: static/recurrence/js/recurrence-widget.js:1792 msgid "Remove" msgstr "Odstrániť" #: static/recurrence/js/recurrence-widget.js:1793 msgid "Calendar" msgstr "Kalendár" #: static/recurrence/js/recurrence.js:218 msgctxt "Until date format" msgid "%Y-%m-%d" msgstr "%d.%m.%Y" #: static/recurrence/js/recurrence.js:1017 msgid "midnight" msgstr "polnoc" #: static/recurrence/js/recurrence.js:1018 msgid "noon" msgstr "poludnie" #: static/recurrence/js/recurrence.js:1019 msgid "on the %(items)s" msgstr "o %(items)s" #: static/recurrence/js/recurrence.js:1020 msgid "every %(number)s %(freq)s" msgstr "každý %(number)s %(freq)s" #: static/recurrence/js/recurrence.js:1021 msgid "each %(items)s" msgstr "každý %(items)s" #: static/recurrence/js/recurrence.js:1022 msgid "occuring %(number)s time" msgstr "nastáva %(number)s krát" #: static/recurrence/js/recurrence.js:1023 msgid "occuring %(number)s times" msgstr "nastáva %(number)s krát" #: static/recurrence/js/recurrence.js:1024 msgid "until %(date)s" msgstr "do %(date)s" #: static/recurrence/js/recurrence.js:1028 msgid "year" msgstr "rok" #: static/recurrence/js/recurrence.js:1028 msgid "month" msgstr "mesiac" #: static/recurrence/js/recurrence.js:1028 msgid "week" msgstr "týždeň" #: static/recurrence/js/recurrence.js:1028 msgid "day" msgstr "deň" #: static/recurrence/js/recurrence.js:1029 msgid "hour" msgstr "hodina" #: static/recurrence/js/recurrence.js:1029 msgid "minute" msgstr "minúta" #: static/recurrence/js/recurrence.js:1029 msgid "second" msgstr "sekunda" #: static/recurrence/js/recurrence.js:1032 msgid "years" msgstr "rokyroky" #: static/recurrence/js/recurrence.js:1032 msgid "months" msgstr "mesiace" #: static/recurrence/js/recurrence.js:1032 msgid "weeks" msgstr "týždne" #: static/recurrence/js/recurrence.js:1032 msgid "days" msgstr "dni" #: static/recurrence/js/recurrence.js:1033 msgid "hours" msgstr "hodiny" #: static/recurrence/js/recurrence.js:1033 msgid "minutes" msgstr "minúty" #: static/recurrence/js/recurrence.js:1033 msgid "seconds" msgstr "sekundy" #: static/recurrence/js/recurrence.js:1036 msgid "annually" msgstr "ročne" #: static/recurrence/js/recurrence.js:1036 msgid "monthly" msgstr "mesačne" #: static/recurrence/js/recurrence.js:1036 msgid "weekly" msgstr "týždenne" #: static/recurrence/js/recurrence.js:1036 msgid "daily" msgstr "denne" #: static/recurrence/js/recurrence.js:1037 msgid "hourly" msgstr "každú zvolenú hodinu" #: static/recurrence/js/recurrence.js:1037 msgid "minutely" msgstr "každú zvolenú minútu" #: static/recurrence/js/recurrence.js:1037 msgid "secondly" msgstr "každú zvolenú sekundu" #: static/recurrence/js/recurrence.js:1040 msgid "Monday" msgstr "Pondelok" #: static/recurrence/js/recurrence.js:1040 msgid "Tuesday" msgstr "Utorok" #: static/recurrence/js/recurrence.js:1040 msgid "Wednesday" msgstr "Streda" #: static/recurrence/js/recurrence.js:1040 msgid "Thursday" msgstr "Štvrtok" #: static/recurrence/js/recurrence.js:1041 msgid "Friday" msgstr "Piatok" #: static/recurrence/js/recurrence.js:1041 msgid "Saturday" msgstr "Sobota" #: static/recurrence/js/recurrence.js:1041 msgid "Sunday" msgstr "Nedeľa" #: static/recurrence/js/recurrence.js:1044 msgid "Mon" msgstr "Po" #: static/recurrence/js/recurrence.js:1044 msgid "Tue" msgstr "Ut" #: static/recurrence/js/recurrence.js:1044 msgid "Wed" msgstr "St" #: static/recurrence/js/recurrence.js:1044 msgid "Thu" msgstr "Št" #: static/recurrence/js/recurrence.js:1045 msgid "Fri" msgstr "Pi" #: static/recurrence/js/recurrence.js:1045 msgid "Sat" msgstr "So" #: static/recurrence/js/recurrence.js:1045 msgid "Sun" msgstr "Ne" #: static/recurrence/js/recurrence.js:1048 msgctxt "Monday first letter" msgid "M" msgstr "P" #: static/recurrence/js/recurrence.js:1049 msgctxt "Tuesday first letter" msgid "T" msgstr "U" #: static/recurrence/js/recurrence.js:1050 msgctxt "Wednesday first letter" msgid "W" msgstr "S" #: static/recurrence/js/recurrence.js:1051 msgctxt "Thursday first letter" msgid "T" msgstr "Š" #: static/recurrence/js/recurrence.js:1052 msgctxt "Friday first letter" msgid "F" msgstr "P" #: static/recurrence/js/recurrence.js:1053 msgctxt "Saturday first letter" msgid "S" msgstr "S" #: static/recurrence/js/recurrence.js:1054 msgctxt "Sunday first letter" msgid "S" msgstr "N" #: static/recurrence/js/recurrence.js:1057 msgid "first %(weekday)s" msgstr "prvý %(weekday)s" #: static/recurrence/js/recurrence.js:1058 msgid "second %(weekday)s" msgstr "druhý %(weekday)s" #: static/recurrence/js/recurrence.js:1059 msgid "third %(weekday)s" msgstr "tretí %(weekday)s" #: static/recurrence/js/recurrence.js:1060 msgid "fourth %(weekday)s" msgstr "štvrtý %(weekday)s" #: static/recurrence/js/recurrence.js:1061 #: static/recurrence/js/recurrence.js:1070 msgid "last %(weekday)s" msgstr "posledný %(weekday)s" #: static/recurrence/js/recurrence.js:1062 msgid "second last %(weekday)s" msgstr "predposledný %(weekday)s" #: static/recurrence/js/recurrence.js:1063 msgid "third last %(weekday)s" msgstr "tretí %(weekday)s od konca" #: static/recurrence/js/recurrence.js:1066 msgid "1st %(weekday)s" msgstr "prvý %(weekday)s" #: static/recurrence/js/recurrence.js:1067 msgid "2nd %(weekday)s" msgstr "druhý %(weekday)s" #: static/recurrence/js/recurrence.js:1068 msgid "3rd %(weekday)s" msgstr "tretí %(weekday)s" #: static/recurrence/js/recurrence.js:1069 msgid "4th %(weekday)s" msgstr "prvý %(weekday)s" #: static/recurrence/js/recurrence.js:1071 msgid "2nd last %(weekday)s" msgstr "predposledný %(weekday)s" #: static/recurrence/js/recurrence.js:1072 msgid "3rd last %(weekday)s" msgstr "predpredposledný %(weekday)s" #: static/recurrence/js/recurrence.js:1075 #: static/recurrence/js/recurrence.js:1081 msgid "last" msgstr "posledný" #: static/recurrence/js/recurrence.js:1076 msgid "second last" msgstr "predpokledný" #: static/recurrence/js/recurrence.js:1077 msgid "third last" msgstr "tretí od konca" #: static/recurrence/js/recurrence.js:1078 msgid "fourth last" msgstr "štvrtý od konca" #: static/recurrence/js/recurrence.js:1082 msgid "2nd last" msgstr "predposledný" #: static/recurrence/js/recurrence.js:1083 msgid "3rd last" msgstr "tretí od konca" #: static/recurrence/js/recurrence.js:1084 msgid "4th last" msgstr "štvrý od konca" #: static/recurrence/js/recurrence.js:1087 msgid "January" msgstr "Január" #: static/recurrence/js/recurrence.js:1087 msgid "February" msgstr "Február" #: static/recurrence/js/recurrence.js:1087 #: static/recurrence/js/recurrence.js:1099 msgid "March" msgstr "Marec" #: static/recurrence/js/recurrence.js:1088 #: static/recurrence/js/recurrence.js:1100 msgid "April" msgstr "Apríl" #: static/recurrence/js/recurrence.js:1088 #: static/recurrence/js/recurrence.js:1094 #: static/recurrence/js/recurrence.js:1100 msgctxt "month name" msgid "May" msgstr "Máj" #: static/recurrence/js/recurrence.js:1088 #: static/recurrence/js/recurrence.js:1100 msgid "June" msgstr "Jún" #: static/recurrence/js/recurrence.js:1089 #: static/recurrence/js/recurrence.js:1101 msgid "July" msgstr "Júl" #: static/recurrence/js/recurrence.js:1089 msgid "August" msgstr "August" #: static/recurrence/js/recurrence.js:1089 msgid "September" msgstr "September" #: static/recurrence/js/recurrence.js:1090 msgid "October" msgstr "Október" #: static/recurrence/js/recurrence.js:1090 msgid "November" msgstr "November" #: static/recurrence/js/recurrence.js:1090 msgid "December" msgstr "December" #: static/recurrence/js/recurrence.js:1093 msgid "Jan" msgstr "Jan" #: static/recurrence/js/recurrence.js:1093 msgid "Feb" msgstr "Feb" #: static/recurrence/js/recurrence.js:1093 msgid "Mar" msgstr "Mar" #: static/recurrence/js/recurrence.js:1094 msgid "Apr" msgstr "Apr" #: static/recurrence/js/recurrence.js:1094 msgid "Jun" msgstr "Jún" #: static/recurrence/js/recurrence.js:1095 msgid "Jul" msgstr "Júl" #: static/recurrence/js/recurrence.js:1095 msgid "Aug" msgstr "Aug" #: static/recurrence/js/recurrence.js:1095 msgid "Sep" msgstr "Sep" #: static/recurrence/js/recurrence.js:1096 msgid "Oct" msgstr "Okt" #: static/recurrence/js/recurrence.js:1096 msgid "Nov" msgstr "Nov" #: static/recurrence/js/recurrence.js:1096 msgid "Dec" msgstr "Dec" #: static/recurrence/js/recurrence.js:1099 msgid "Jan." msgstr "Jan." #: static/recurrence/js/recurrence.js:1099 msgid "Feb." msgstr "Feb." #: static/recurrence/js/recurrence.js:1101 msgid "Aug." msgstr "Aug." #: static/recurrence/js/recurrence.js:1101 msgid "Sept." msgstr "Sept." #: static/recurrence/js/recurrence.js:1102 msgid "Oct." msgstr "Okt." #: static/recurrence/js/recurrence.js:1102 msgid "Nov." msgstr "Nov." #: static/recurrence/js/recurrence.js:1102 msgid "Dec." msgstr "Dec." #: static/recurrence/js/recurrence.js:1105 msgid "a.m." msgstr "predobedom" #: static/recurrence/js/recurrence.js:1105 msgid "p.m." msgstr "poobede" #: static/recurrence/js/recurrence.js:1106 msgid "AM" msgstr "predobedom" #: static/recurrence/js/recurrence.js:1106 msgid "PM" msgstr "poobede" #: static/recurrence/js/recurrence.js:1108 msgctxt "Day of month" msgid "%j%S" msgstr "%j%S" ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642758229.0 django-recurrence-1.11.1/recurrence/managers.py0000644000076500000240000000744500000000000020642 0ustar00aleksistafffrom django.db.models import manager import recurrence from recurrence import choices, to_utc class RuleManager(manager.Manager): def to_rule_object(self, rule_model): rule_args = (rule_model.freq,) rule_kwargs = { 'interval': rule_model.interval, 'wkst': rule_model.wkst, 'count': rule_model.count, 'until': to_utc(rule_model.until), } for param in recurrence.Rule.byparams: if param == 'byday': # see recurrence.base docstrings about byday handling rule_kwargs[param] = (map( lambda v: recurrence.Weekday(*v), rule_model.params.filter(param=param).values_list( 'value', 'index')) or None) else: rule_kwargs[param] = (map( lambda v: v[0], rule_model.params.filter(param=param).values_list( 'value' ) ) or None) return recurrence.Rule(*rule_args, **rule_kwargs) def create_from_rule_object(self, mode, rule_obj, recurrence_model): until = to_utc(rule_obj.until) rule_model = self.create( recurrence=recurrence_model, mode=mode, freq=rule_obj.freq, interval=rule_obj.interval, wkst=rule_obj.wkst, count=rule_obj.count, until=until) for param in recurrence.Rule.byparams: value_list = getattr(rule_obj, param, None) if not value_list: continue if not hasattr(value_list, '__iter__'): value_list = [value_list] for value in value_list: if param == 'byday': # see recurrence.base docstrings about byday handling weekday = recurrence.to_weekday(value) rule_model.params.create( param=param, value=weekday.number, index=weekday.index) else: rule_model.params.create(param=param, value=value) return rule_model class RecurrenceManager(manager.Manager): def to_recurrence_object(self, recurrence_model): rrules, exrules, rdates, exdates = [], [], [], [] for rule_model in recurrence_model.rules.filter(mode=choices.INCLUSION): rrules.append(rule_model.to_rule_object()) for exrule_model in recurrence_model.rules.filter(mode=choices.EXCLUSION): exrules.append(exrule_model.to_rule_object()) for rdate_model in recurrence_model.dates.filter(mode=choices.INCLUSION): rdates.append(to_utc(rdate_model.dt)) for exdate_model in recurrence_model.dates.filter(mode=choices.EXCLUSION): exdates.append(to_utc(exdate_model.dt)) dtstart = to_utc(recurrence_model.dtstart) dtend = to_utc(recurrence_model.dtend) return recurrence.Recurrence( dtstart, dtend, rrules, exrules, rdates, exdates) def create_from_recurrence_object(self, recurrence_obj): from recurrence import models recurrence_model = self.create( dtstart=to_utc(recurrence_obj.dtstart), dtend=to_utc(recurrence_obj.dtend)) for rrule in recurrence_obj.rrules: models.Rule.objects.create_from_rule_object( choices.INCLUSION, rrule, recurrence_model) for exrule in recurrence_obj.exrules: models.Rule.objects.create_from_rule_object( choices.EXCLUSION, exrule, recurrence_model) for dt in recurrence_obj.rdates: recurrence_model.dates.create(mode=choices.INCLUSION, dt=to_utc(dt)) for dt in recurrence_obj.exdates: recurrence_model.dates.create(mode=choices.EXCLUSION, dt=to_utc(dt)) return recurrence_model ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1643105481.3001611 django-recurrence-1.11.1/recurrence/migrations/0000755000076500000240000000000000000000000020635 5ustar00aleksistaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/migrations/0001_initial.py0000644000076500000240000000525300000000000023305 0ustar00aleksistafffrom django.db import models, migrations import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ ] operations = [ migrations.CreateModel( name='Date', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('mode', models.BooleanField(default=True, choices=[(True, 'Inclusion'), (False, 'Exclusion')])), ('dt', models.DateTimeField()), ], ), migrations.CreateModel( name='Param', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('param', models.CharField(max_length=16)), ('value', models.IntegerField()), ('index', models.IntegerField(default=0)), ], ), migrations.CreateModel( name='Recurrence', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('dtstart', models.DateTimeField(null=True, blank=True)), ('dtend', models.DateTimeField(null=True, blank=True)), ], ), migrations.CreateModel( name='Rule', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('mode', models.BooleanField(default=True, choices=[(True, 'Inclusion'), (False, 'Exclusion')])), ('freq', models.PositiveIntegerField(choices=[(6, 'Secondly'), (5, 'Minutely'), (4, 'Hourly'), (3, 'Daily'), (2, 'Weekly'), (1, 'Monthly'), (0, 'Yearly')])), ('interval', models.PositiveIntegerField(default=1)), ('wkst', models.PositiveIntegerField(default=0, null=True, blank=True)), ('count', models.PositiveIntegerField(null=True, blank=True)), ('until', models.DateTimeField(null=True, blank=True)), ('recurrence', models.ForeignKey(related_name='rules', on_delete=django.db.models.deletion.CASCADE, to='recurrence.Recurrence')), ], ), migrations.AddField( model_name='param', name='rule', field=models.ForeignKey(related_name='params', on_delete=django.db.models.deletion.CASCADE, to='recurrence.Rule'), ), migrations.AddField( model_name='date', name='recurrence', field=models.ForeignKey(related_name='dates', on_delete=django.db.models.deletion.CASCADE, to='recurrence.Recurrence'), ), ] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/migrations/__init__.py0000644000076500000240000000000000000000000022734 0ustar00aleksistaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/models.py0000644000076500000240000000277100000000000020325 0ustar00aleksistafffrom django.db import models import recurrence as recur from recurrence import managers, choices class Recurrence(models.Model): dtstart = models.DateTimeField(null=True, blank=True) dtend = models.DateTimeField(null=True, blank=True) objects = managers.RecurrenceManager() def to_recurrence_object(self): return Recurrence.objects.to_recurrence_object(self) class Rule(models.Model): recurrence = models.ForeignKey(Recurrence, related_name='rules', on_delete=models.CASCADE) mode = models.BooleanField(default=True, choices=choices.MODE_CHOICES) freq = models.PositiveIntegerField(choices=choices.FREQUENCY_CHOICES) interval = models.PositiveIntegerField(default=1) wkst = models.PositiveIntegerField( default=recur.Rule.firstweekday, null=True, blank=True) count = models.PositiveIntegerField(null=True, blank=True) until = models.DateTimeField(null=True, blank=True) objects = managers.RuleManager() def to_rule_object(self): return self.__class__.objects.to_rule_object(self) class Date(models.Model): recurrence = models.ForeignKey(Recurrence, related_name='dates', on_delete=models.CASCADE) mode = models.BooleanField(default=True, choices=choices.MODE_CHOICES) dt = models.DateTimeField() class Param(models.Model): rule = models.ForeignKey(Rule, related_name='params', on_delete=models.CASCADE) param = models.CharField(max_length=16) value = models.IntegerField() index = models.IntegerField(default=0) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/settings.py0000644000076500000240000000111100000000000020665 0ustar00aleksistaff""" Settings for django recurrence. DESERIALIZE_TZ determines if a datetime serialized as rfc2445 text is returned as a naive datetime or a datetime with timezone. If the django setting RECURRENCE_USE_TZ is true then a timezone aware datetime is returned If the django setting RECURRENCE_USE_TZ is false then a naive datetime is returned If this setting is not present the setting USE_TZ is used as a default. """ from django.conf import settings def deserialize_tz(): try: return settings.RECURRENCE_USE_TZ except AttributeError: return settings.USE_TZ ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1643105481.2664363 django-recurrence-1.11.1/recurrence/static/0000755000076500000240000000000000000000000017750 5ustar00aleksistaff././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1643105481.266795 django-recurrence-1.11.1/recurrence/static/recurrence/0000755000076500000240000000000000000000000022105 5ustar00aleksistaff././@PaxHeader0000000000000000000000000000003200000000000010210 xustar0026 mtime=1643105481.30035 django-recurrence-1.11.1/recurrence/static/recurrence/css/0000755000076500000240000000000000000000000022675 5ustar00aleksistaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/static/recurrence/css/recurrence.css0000644000076500000240000001315400000000000025550 0ustar00aleksistaffdiv.recurrence-widget { float: left; border: 1px solid #ccc; } div.recurrence-widget div.panel { border-bottom: 1px solid #ddd; } div.recurrence-widget select, div.recurrence-widget input { margin: 0 .5em; width: auto; } div.recurrence-widget a.recurrence-label { display: block; cursor: pointer; padding: .5em .75em; font-weight: bold; white-space: nowrap; padding-right: 3em; color: black; } div.recurrence-widget .remove, div.recurrence-widget .remove:link, div.recurrence-widget .remove:visited { float: left; padding: .25em .5em; font-size: 1.1em; font-weight: bold; cursor: pointer; text-decoration: none; color: #555; line-height: 1.4em; } div.recurrence-widget .remove:hover { color: #a00; } div.recurrence-widget .control { padding: .5em 1em .5em .5em; } div.recurrence-widget .add-button, div.recurrence-widget .add-button:link, div.recurrence-widget .add-button:visited { color: green; } div.recurrence-widget .plus { font-size: 1.2em; font-weight: bold; padding-right: .5em; } div.recurrence-widget .add-button:hover { color: green; } div.recurrence-widget .control .add-date { padding-left: 1em; margin-left: 1em; border-left: 1px solid #ddd; } div.recurrence-widget .freq { display: inline } div.recurrence-widget .interval { display: inline; padding-left: 1em; } div.recurrence-widget form { overflow: hidden; padding: .5em 2.2em; border-top: 1px solid #ddd; } div.recurrence-widget .form { padding: .5em 0; } div.recurrence-widget .radio { margin-left: 0; } div.recurrence-widget .radio:before { padding: 0px; } div.recurrence-widget .form ul { margin: 0; padding: 0; } div.recurrence-widget .form ul li { list-style-type: none; } div.recurrence-widget .section { margin: .5em 1em; } div.recurrence-widget .until-count { margin: 0; padding: 0; } div.recurrence-widget .until-count li { margin: 0; padding: 0; display: inline; list-style-type: none; } div.recurrence-widget .until-count .count { padding-left: 1em; } div.recurrence-widget .monthday .grid { margin-left: .5em; } div.recurrence-widget .grid { border: 0; border-top: 1px solid #ccc; border-left: 1px solid #ccc; } div.recurrence-widget .grid td { text-align: center; border-bottom: 1px solid #ccc; border-right: 1px solid #ccc; padding: .8em; cursor: pointer; } div.recurrence-widget .grid td.active { background-color: #ddd; } div.recurrence-widget .grid td.empty { border: 0; } div.recurrence-widget .grid-disabled td.active { background-color: #ddd; } div.recurrence-widget .disabled { opacity: .75; filter: alpha(opacity=75); } div.recurrence-widget .limit ul { margin-top: .5em; } div.recurrence-widget .weekly .section { margin: 1em 0; } div.recurrence-widget .weekly td { width: 2.5em; } div.recurrence-widget .yearly table { margin: .5em 0 1em 0; } div.recurrence-widget .yearly td { padding: 1em 1.5em; } div.recurrence-widget .checkbox { margin-left: 0; } div.recurrence-widget .checkbox:before { width: auto; height: auto; } div.recurrence-widget .until-count { margin-left: 1.5em; } div.recurrence-widget .mode { padding: .25em 0 1em 0; } div.recurrence-widget .date-selector .calendar-button { background: url('../img/recurrence-calendar-icon.png') no-repeat center; padding: .25em; } .recurrence-widget.hidden, div.recurrence-widget .hidden { display: none; } table.recurrence-calendar { position: absolute; background-color: white; border-top: 1px solid #ccc; border-left: 1px solid #ccc; /*outline: 3px solid white;*/ margin: 0; } table.recurrence-calendar td { padding: 0; } table.recurrence-calendar a, table.recurrence-calendar a:link, table.recurrence-calendar a:visited { color: #555; font-weight: bold; } table.recurrence-calendar .year, table.recurrence-calendar .navigation { border-right: 1px solid #ccc; } table.recurrence-calendar .body td { border: 0; border-bottom: 1px solid #ccc; border-right: 1px solid #ccc; } table.recurrence-calendar .body td.header { border-top: 1px solid #ccc; font-weight: bold; color: #555; } table.recurrence-calendar .body td.header, table.recurrence-calendar .body td.day { padding: .25em; text-align: center; vertical-align: center; } table.recurrence-calendar .body td.day { cursor: pointer; } table.recurrence-calendar .body td.active { background-color: #ddd; } table.recurrence-calendar .body td.empty { background-color: #eee; } table.recurrence-calendar .year { padding-top: .25em; padding-right: 2em; text-align: center; } table.recurrence-calendar .navigation { width: 100%; } table.recurrence-calendar .navigation { text-align: center; } table.recurrence-calendar .navigation td.prev-year, table.recurrence-calendar .navigation td.next-year, table.recurrence-calendar .navigation td.prev-month, table.recurrence-calendar .navigation td.next-month { /*width: 1%;*/ font-size: .8em; } table.recurrence-calendar .remove, table.recurrence-calendar .remove:link, table.recurrence-calendar .remove:visited { float: left; padding: .1em .25em; padding-bottom: 0; font-size: 1.1em; font-weight: bold; cursor: pointer; text-decoration: none; color: #555; line-height: 1.2em; } table.recurrence-calendar .remove:hover { color: #a00; } table.recurrence-calendar .footer { height: .5em; overflow: hidden; border-bottom: 1px solid #ccc; border-right: 1px solid #ccc; } ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1643105481.3006651 django-recurrence-1.11.1/recurrence/static/recurrence/img/0000755000076500000240000000000000000000000022661 5ustar00aleksistaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/static/recurrence/img/recurrence-calendar-icon.png0000644000076500000240000000043500000000000030223 0ustar00aleksistaffPNG  IHDR&/sRGBbKGD pHYs  ~tIME+5:#IDAT(ϭ !D 2:,G3 P#/8S.ؿ| s~9I){1f^R R d ֮s$t%0cCWZkqR~tPkxAuw VwsQә72sIENDB`././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1643105481.302432 django-recurrence-1.11.1/recurrence/static/recurrence/js/0000755000076500000240000000000000000000000022521 5ustar00aleksistaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/static/recurrence/js/recurrence-widget.init.js0000644000076500000240000000314200000000000027437 0ustar00aleksistaffdjango.jQuery(document).ready(function () { // Init on all existing recurrence fields initRecurrenceWidget(); // Begin DOM observation for new inline additions const targetNode = document.getElementById('container'); const config = { attributes: false, childList: true, subtree: true }; observer.observe(targetNode, config); }); /* Method iterates over all textareas with .recurrence-widget class name, excluding the last one with '__prefix__', if no parameters provided. If specific field item is prvided it will only init this particular field to prevent, unnecessary iterations. */ function initRecurrenceWidget($field) { if (!$field) { const recurrenceFields = django.jQuery(document).find('textarea.recurrence-widget:not([id*="__prefix__"])'); django.jQuery.each(recurrenceFields, function (index, field) { const $field = django.jQuery(field); new recurrence.widget.Widget($field.attr('id'), {}); }); } else { new recurrence.widget.Widget($field.attr('id'), {}); } } /* MutationObserver */ const callback = function (mutationsList, observer) { for (const mutation of mutationsList) { if (mutation.type === 'childList') { // Check if nodes were added const addedNodes = mutation.addedNodes; if (addedNodes.length > 0) { const $addedRecurrenceField = django.jQuery(addedNodes[0]).find('.recurrence-widget'); // Length has to be 1, to prevent cases when draging inlines returns length 0 or more than 1. if ($addedRecurrenceField.length === 1) { initRecurrenceWidget($addedRecurrenceField); } } } } }; const observer = new MutationObserver(callback); ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/recurrence/static/recurrence/js/recurrence-widget.js0000644000076500000240000016536400000000000026514 0ustar00aleksistaffif (!recurrence) var recurrence = {}; recurrence.widget = {}; recurrence.widget.Grid = function(cols, rows) { this.init(cols, rows); }; recurrence.widget.Grid.prototype = { init: function(cols, rows) { this.disabled = false; this.cells = []; this.cols = cols; this.rows = rows; this.init_dom(); }, init_dom: function() { var tbody = recurrence.widget.e('tbody'); for (var y=0; y < this.rows; y++) { var tr = recurrence.widget.e('tr'); tbody.appendChild(tr); for (var x=0; x < this.cols; x++) { var td = recurrence.widget.e('td'); tr.appendChild(td); this.cells.push(td); } } var table = recurrence.widget.e( 'table', { 'class': 'grid', 'cellpadding': 0, 'cellspacing': 0, 'border': 0}, [tbody]); this.elements = {'root': table, 'table': table, 'tbody': tbody}; }, cell: function(col, row) { return this.elements.tbody.childNodes[row].childNodes[col]; }, enable: function () { recurrence.widget.remove_class('disabled'); this.disabled = false; }, disable: function () { recurrence.widget.add_class('disabled'); this.disabled = true; } }; recurrence.widget.Calendar = function(date, options) { this.init(date, options); }; recurrence.widget.Calendar.prototype = { init: function(date, options) { this.date = date || recurrence.widget.date_today(); this.month = this.date.getMonth(); this.year = this.date.getFullYear(); this.options = options || {}; if (this.options.onchange) this.onchange = this.options.onchange; if (this.options.onclose) this.onclose = this.options.onclose; this.init_dom(); this.show_month(this.year, this.month); }, init_dom: function() { var calendar = this; // navigation var remove = recurrence.widget.e('a', { 'class': 'remove', 'href': 'javascript:void(0)', 'title': recurrence.display.labels.remove, 'onclick': function() { calendar.close(); } }, '×'); var year_prev = recurrence.widget.e( 'a', { 'href': 'javascript:void(0)', 'class': 'prev-year', 'onclick': function() {calendar.show_prev_year();}}, '<<'); var year_next = recurrence.widget.e( 'a', { 'href': 'javascript:void(0)', 'class': 'next-year', 'onclick': function() {calendar.show_next_year();}}, '>>'); var month_prev = recurrence.widget.e( 'a', { 'href': 'javascript:void(0)', 'class': 'prev-month', 'onclick': function() {calendar.show_prev_month();}}, '<'); var month_next = recurrence.widget.e( 'a', { 'href': 'javascript:void(0)', 'class': 'next-month', 'onclick': function() {calendar.show_next_month();}}, '>'); var month_label = recurrence.widget.e( 'span', {'class': 'recurrence-label'}, recurrence.display.months[this.month]); var header_elements = [ year_prev, month_prev, month_label, month_next, year_next]; var header_grid = new recurrence.widget.Grid(header_elements.length, 1); recurrence.array.foreach(header_elements, function(item, i) { header_grid.cells[i].appendChild(item); recurrence.widget.add_class( header_grid.cells[i], item.className); }); recurrence.widget.add_class(header_grid.elements.root, 'navigation'); // core var calendar_year = recurrence.widget.e( 'div', {'class': 'year'}, this.year); var calendar_navigation = header_grid.elements.root; // var calendar_week = week_grid.elements.root; var calendar_body = recurrence.widget.e('div', {'class': 'body'}); var calendar_footer = recurrence.widget.e('div', {'class': 'footer'}); var td = recurrence.widget.e( 'td', {}, [remove, calendar_year, calendar_navigation, calendar_body, calendar_footer]); var tr = recurrence.widget.e('tr', {}, [td]); var tbody = recurrence.widget.e('tbody', {}, [tr]); var root = recurrence.widget.e( 'table', {'class': 'recurrence-calendar hidden'}, [tbody]); this.elements = { 'root': root, 'year': calendar_year, 'year_prev': year_prev, 'year_next': year_next, 'month_prev': month_prev, 'month_next': month_next, 'month_label': month_label, 'calendar_body': calendar_body }; }, get_month_grid: function(year, month) { var calendar = this; var dt = new Date(year, month, 1); var start = dt.getDay(); var days = recurrence.date.days_in_month(dt); var rows = Math.ceil((days + start) / 7) + 1; var grid = new recurrence.widget.Grid(7, rows); var number = 1; recurrence.array.foreach( grid.cells, function(cell, i) { var cell = grid.cells[i]; if (i < 7) { var weekday_number = i - 1; if (weekday_number < 0) weekday_number = 6; else if (weekday_number > 6) weekday_number = 0; cell.innerHTML = recurrence.display.weekdays_oneletter[ weekday_number]; recurrence.widget.add_class(cell, 'header'); } else if (i - 7 < start || number > days) { recurrence.widget.add_class(cell, 'empty'); } else { recurrence.widget.add_class(cell, 'day'); if (this.date.getDate() == number && this.date.getFullYear() == dt.getFullYear() && this.date.getMonth() == dt.getMonth()) recurrence.widget.add_class(cell, 'active'); cell.innerHTML = number; number = number + 1; cell.onclick = function () { calendar.set_date( calendar.year, calendar.month, parseInt(this.innerHTML, 10)); }; } }, this); return grid; }, show_month: function(year, month) { if (this.elements.calendar_body.childNodes.length) this.elements.calendar_body.removeChild( this.elements.calendar_body.childNodes[0]); this.elements.month_grid = this.get_month_grid(year, month); this.elements.calendar_body.appendChild( this.elements.month_grid.elements.root); this.elements.month_label.firstChild.nodeValue = ( recurrence.display.months[this.month]); this.elements.year.firstChild.nodeValue = this.year; }, show_prev_year: function() { this.year = this.year - 1; this.show_month(this.year, this.month); }, show_next_year: function() { this.year = this.year + 1; this.show_month(this.year, this.month); }, show_prev_month: function() { this.month = this.month - 1; if (this.month < 0) { this.month = 11; this.year = this.year - 1; } this.show_month(this.year, this.month); }, show_next_month: function() { this.month = this.month + 1; if (this.month > 11) { this.month = 0; this.year = this.year + 1; } this.show_month(this.year, this.month); }, set_date: function(year, month, day) { if (year != this.date.getFullYear() || month != this.date.getMonth() || day != this.date.getDate()) { this.date.setTime(new Date(year, month, day).getTime()); recurrence.array.foreach( this.elements.month_grid.cells, function(cell) { if (recurrence.widget.has_class(cell, 'day')) { var number = parseInt(cell.innerHTML, 10); if (number == day) { recurrence.widget.add_class(cell, 'active'); } else { recurrence.widget.remove_class(cell, 'active'); } } }); if (this.onchange) this.onchange(this.date); } }, set_position: function(x, y) { this.elements.root.style.left = x + 'px'; this.elements.root.style.top = y + 'px'; }, show: function() { recurrence.widget.remove_class(this.elements.root, 'hidden'); }, hide: function() { recurrence.widget.add_class(this.elements.root, 'hidden'); }, close: function() { if (this.elements.root.parentNode) { this.elements.root.parentNode.removeChild(this.elements.root); if (this.onclose) this.onclose(); } } }; recurrence.widget.DateSelector = function(date, options) { this.init(date, options); }; recurrence.widget.DateSelector.prototype = { init: function(date, options) { this.disabled = false; this.date = date; this.calendar = null; this.options = options || {}; if (this.options.onchange) this.onchange = this.options.onchange; this.init_dom(); }, init_dom: function() { var dateselector = this; if (this.date) var date_value = recurrence.date.format(this.date, '%Y-%m-%d'); else var date_value = ''; var date_field = recurrence.widget.e( 'input', { 'class': 'date-field', 'size': 10, 'value': date_value, 'onchange': function() {dateselector.set_date(this.value);}}); var calendar_button = recurrence.widget.e( 'a', { 'class': 'calendar-button', 'href': 'javascript:void(0)', 'title': recurrence.display.labels.calendar, 'onclick': function() { if (!dateselector.disabled) dateselector.show_calendar(); } }, '    '); var root = recurrence.widget.e( 'span', {'class': 'date-selector'}, [date_field, calendar_button]); this.elements = { 'root': root, 'date_field': date_field, 'calendar_button': calendar_button }; }, show_calendar: function() { var dateselector = this; var calendar_blur = function(event) { var element = event.target; var is_in_dom = recurrence.widget.element_in_dom( element, dateselector.calendar.elements.root); if (!is_in_dom && element != dateselector.elements.calendar_button) { // clicked outside of calendar dateselector.calendar.close(); if (window.detachEvent) window.detachEvent('onclick', calendar_blur); else window.removeEventListener('click', calendar_blur, false); } }; if (!this.calendar) { this.calendar = new recurrence.widget.Calendar( new Date((this.date || recurrence.widget.date_today()).valueOf()), { 'onchange': function() { dateselector.set_date( recurrence.date.format(this.date, '%Y-%m-%d')); dateselector.calendar.close(); }, 'onclose': function() { if (window.detachEvent) window.detachEvent('onclick', calendar_blur); else window.removeEventListener( 'click', calendar_blur, false); dateselector.hide_calendar(); } }); document.body.appendChild(this.calendar.elements.root); this.calendar.show(); this.set_calendar_position(); if (window.attachEvent) window.attachEvent('onclick', calendar_blur); else window.addEventListener('click', calendar_blur, false); } }, set_date: function(datestring) { var tokens = datestring.split('-'); var year = parseInt(tokens[0], 10); var month = parseInt(tokens[1], 10) - 1; var day = parseInt(tokens[2], 10); var dt = new Date(year, month, day); if (String(dt) == 'Invalid Date' || String(dt) == 'NaN') { if (this.date && !this.options.allow_null) { this.elements.date_field.value = recurrence.date.format( this.date, '%Y-%m-%d'); } else { if (this.elements.date_field.value != '') { if (this.onchange) this.onchange(null); } this.elements.date_field.value = ''; } } else { if (!this.date || (year != this.date.getFullYear() || month != this.date.getMonth() || day != this.date.getDate())) { if (!this.date) this.date = recurrence.widget.date_today(); this.date.setTime(new Date(year, month, day).getTime()); this.elements.date_field.value = datestring; if (this.onchange) this.onchange(this.date); } } }, set_calendar_position: function() { var loc = recurrence.widget.cumulative_offset( this.elements.calendar_button); var calendar_x = loc[0]; var calendar_y = loc[1]; var calendar_right = ( loc[0] + this.calendar.elements.root.clientWidth); var calendar_bottom = ( loc[1] + this.calendar.elements.root.clientHeight); if (calendar_right > document.scrollWidth) calendar_x = calendar_x - ( calendar_right - document.scrollWidth); if (calendar_bottom > document.scrollHeight) calendar_y = calendar_y - ( calendar_bottom - document.scrollHeight); this.calendar.set_position(calendar_x, calendar_y); }, hide_calendar: function() { this.calendar = null; }, enable: function () { this.disabled = false; this.elements.date_field.disabled = false; }, disable: function () { this.disabled = true; this.elements.date_field.disabled = true; if (this.calendar) this.calendar.close(); } }; recurrence.widget.Widget = function(textarea, options) { this.init(textarea, options); }; recurrence.widget.Widget.prototype = { init: function(textarea, options) { if (textarea.toLowerCase) textarea = document.getElementById(textarea); this.selected_panel = null; this.panels = []; this.data = recurrence.deserialize(textarea.value); this.textarea = textarea; this.options = options; this.default_freq = options.default_freq || recurrence.WEEKLY; this.init_dom(); this.init_panels(); }, init_dom: function() { var widget = this; var panels = recurrence.widget.e('div', {'class': 'panels'}); var control = recurrence.widget.e('div', {'class': 'control'}); var root = recurrence.widget.e( 'div', {'class': this.textarea.className}, [panels, control]); var add_rule = new recurrence.widget.AddButton( recurrence.display.labels.add_rule, { 'onclick': function () {widget.add_rule();} }); recurrence.widget.add_class(add_rule.elements.root, 'add-rule'); control.appendChild(add_rule.elements.root); var add_date = new recurrence.widget.AddButton( recurrence.display.labels.add_date, { 'onclick': function () {widget.add_date();} }); recurrence.widget.add_class(add_date.elements.root, 'add-date'); control.appendChild(add_date.elements.root); this.elements = { 'root': root, 'panels': panels, 'control': control }; // attach immediately recurrence.widget.add_class(this.textarea, 'hidden'); this.textarea.parentNode.insertBefore( this.elements.root, this.textarea); }, init_panels: function() { recurrence.array.foreach( this.data.rrules, function(item) { this.add_rule_panel(recurrence.widget.INCLUSION, item); }, this); recurrence.array.foreach( this.data.exrules, function(item) { this.add_rule_panel(recurrence.widget.EXCLUSION, item); }, this); recurrence.array.foreach( this.data.rdates, function(item) { this.add_date_panel(recurrence.widget.INCLUSION, item); }, this); recurrence.array.foreach( this.data.exdates, function(item) { this.add_date_panel(recurrence.widget.EXCLUSION, item); }, this); }, add_rule_panel: function(mode, rule) { var panel = new recurrence.widget.Panel(this); var form = new recurrence.widget.RuleForm(panel, mode, rule); panel.onexpand = function() { if (panel.widget.selected_panel) if (panel.widget.selected_panel != this) panel.widget.selected_panel.collapse(); panel.widget.selected_panel = this; }; panel.onremove = function() { form.remove(); }; this.elements.panels.appendChild(panel.elements.root); this.panels.push(panel); this.update(); return panel; }, add_date_panel: function(mode, date) { var panel = new recurrence.widget.Panel(this); var form = new recurrence.widget.DateForm(panel, mode, date); panel.onexpand = function() { if (panel.widget.selected_panel) if (panel.widget.selected_panel != this) panel.widget.selected_panel.collapse(); panel.widget.selected_panel = this; }; panel.onremove = function() { form.remove(); }; this.elements.panels.appendChild(panel.elements.root); this.panels.push(panel); this.update(); return panel; }, add_rule: function(rule) { var rule = rule || new recurrence.Rule(this.default_freq); this.data.rrules.push(rule); this.add_rule_panel(recurrence.widget.INCLUSION, rule).expand(); }, add_date: function(date) { var date = date || recurrence.widget.date_today(); this.data.rdates.push(date); this.add_date_panel(recurrence.widget.INCLUSION, date).expand(); }, update: function() { this.textarea.value = this.data.serialize(); } }; recurrence.widget.AddButton = function(label, options) { this.init(label, options); }; recurrence.widget.AddButton.prototype = { init: function(label, options) { this.label = label; this.options = options || {}; this.init_dom(); }, init_dom: function() { var addbutton = this; var plus = recurrence.widget.e( 'span', {'class': 'plus'}, '+'); var label = recurrence.widget.e( 'span', {'class': 'recurrence-label'}, this.label); var root = recurrence.widget.e( 'a', {'class': 'add-button', 'href': 'javascript:void(0)'}, [plus, label]); root.onclick = function() { addbutton.options.onclick(); }; this.elements = {'root': root, 'plus': plus, 'label': label}; } }; recurrence.widget.Panel = function(widget, options) { this.init(widget, options); }; recurrence.widget.Panel.prototype = { init: function(widget, options) { this.collapsed = false; this.widget = widget; this.options = options || {}; if (this.options.onremove) this.onremove = this.options.onremove; if (this.options.onexpand) this.onexpand = this.options.onexpand; if (this.options.oncollapse) this.oncollapse = this.options.oncollapse; this.init_dom(); }, init_dom: function() { var panel = this; var remove = recurrence.widget.e('a', { 'class': 'remove', 'href': 'javascript:void(0)', 'title': recurrence.display.labels.remove, 'onclick': function() { panel.remove(); } }, '×'); var label = recurrence.widget.e('a', { 'class': 'recurrence-label', 'href': 'javascript:void(0)', 'onclick': function() { if (panel.collapsed) panel.expand(); else panel.collapse(); } }, ' '); var header = recurrence.widget.e( 'div', {'class': 'header'}, [remove, label]); var body = recurrence.widget.e( 'div', {'class': 'body'}); var root = recurrence.widget.e( 'div', {'class': 'panel'}, [header, body]); this.elements = { 'root': root, 'remove': remove, 'label': label, 'header': header, 'body': body }; this.collapse(); }, set_label: function(label) { this.elements.label.innerHTML = label; }, set_body: function(element) { if (this.elements.body.childNodes.length) this.elements.body.removeChild(this.elements.body.childNodes[0]); this.elements.body.appendChild(element); }, expand: function() { this.collapsed = false; recurrence.widget.remove_class(this.elements.body, 'hidden'); if (this.onexpand) this.onexpand(this); }, collapse: function() { this.collapsed = true; recurrence.widget.add_class(this.elements.body, 'hidden'); if (this.oncollapse) this.oncollapse(this); }, remove: function() { var parent = this.elements.root.parentNode; if (parent) parent.removeChild(this.elements.root); if (this.onremove) this.onremove(parent); } }; recurrence.widget.RuleForm = function(panel, mode, rule, options) { this.init(panel, mode, rule, options); }; recurrence.widget.RuleForm.prototype = { init: function(panel, mode, rule, options) { this.selected_freq = rule.freq; this.panel = panel; this.mode = mode; this.rule = rule; this.options = options || {}; var rule_options = { interval: rule.interval, until: rule.until, count: rule.count }; this.freq_rules = [ new recurrence.Rule(recurrence.YEARLY, rule_options), new recurrence.Rule(recurrence.MONTHLY, rule_options), new recurrence.Rule(recurrence.WEEKLY, rule_options), new recurrence.Rule(recurrence.DAILY, rule_options) ]; this.freq_rules[this.rule.freq].update(this.rule); this.init_dom(); this.set_freq(this.selected_freq); }, init_dom: function() { var form = this; // mode var mode_checkbox = recurrence.widget.e( 'input', {'class': 'checkbox', 'type': 'checkbox', 'name': 'mode'}); var mode_label = recurrence.widget.e( 'span', {'class': 'recurrence-label'}, recurrence.display.labels.exclude_occurrences); var mode_container = recurrence.widget.e( 'div', {'class': 'mode'}, [mode_checkbox, mode_label]); if (this.mode == recurrence.widget.EXCLUSION) // delay for ie6 compatibility setTimeout(function() { mode_checkbox.checked = true; recurrence.widget.add_class(form.panel, 'exclusion'); }, 10); // freq var freq_choices = recurrence.display.frequencies.slice(0, 4); var freq_options = recurrence.array.foreach( freq_choices, function(item, i) { var option = recurrence.widget.e( 'option', {'value': i}, recurrence.string.capitalize(item)); return option; }); var freq_select = recurrence.widget.e( 'select', {'name': 'freq'}, freq_options); var freq_label = recurrence.widget.e( 'span', {'class': 'recurrence-label'}, recurrence.display.labels.frequency + ':'); var freq_container = recurrence.widget.e( 'div', {'class': 'freq'}, [freq_label, freq_select]); // interval var interval_field = recurrence.widget.e( 'input', { 'name': 'interval', 'size': 1, 'value': this.rule.interval}); var interval_label1 = recurrence.widget.e( 'span', {'class': 'recurrence-label'}, recurrence.display.labels.every); var interval_label2 = recurrence.widget.e( 'span', {'class': 'laebl'}, recurrence.display.timeintervals_plural[this.rule.freq]); var interval_container = recurrence.widget.e( 'div', {'class': 'interval'}, [interval_label1, interval_field, interval_label2]); // until if (this.rule.until) until_value = recurrence.date.format(this.rule.until, '%Y-%m-%d'); else until_value = ''; var until_radio = recurrence.widget.e( 'input', {'class': 'radio', 'type': 'radio', 'name': 'until_count', 'value': 'until'}); var until_date_selector = new recurrence.widget.DateSelector( this.rule.until, { 'onchange': function(date) {form.set_until(date);}, 'allow_null': true }); var until_label = recurrence.widget.e( 'span', {'class': 'recurrence-label'}, recurrence.display.labels.date + ':'); var until_container = recurrence.widget.e( 'li', {'class': 'until'}, [until_radio, until_label, until_date_selector.elements.root]); // count if (this.rule.count) count_value = this.rule.count; else count_value = 1; var count_radio = recurrence.widget.e( 'input', { 'class': 'radio', 'type': 'radio', 'name': 'until_count', 'value': 'count'}); var count_field = recurrence.widget.e( 'input', {'name': 'count', 'size': 1, 'value': count_value}); if (this.rule.count && this.rule.count < 2) var token = recurrence.string.capitalize( recurrence.display.labels.count); else var token = recurrence.string.capitalize( recurrence.display.labels.count_plural); var count_label1 = recurrence.widget.e( 'span', {'class': 'recurrence-label'}, token.split('%(number)s')[0]); var count_label2 = recurrence.widget.e( 'span', {'class': 'recurrence-label'}, token.split('%(number)s')[1]); var count_container = recurrence.widget.e( 'li', {'class': 'count'}, [count_radio, count_label1, count_field, count_label2]); // limit container var until_count_container = recurrence.widget.e( 'ul', {'class': 'until-count'}, [until_container, count_container]); var limit_checkbox = recurrence.widget.e( 'input', { 'class': 'checkbox', 'type': 'checkbox', 'name': 'limit'}); var limit_label = recurrence.widget.e( 'span', {'class': 'recurrence-label'}, recurrence.display.labels.repeat_until + ':'); var limit_container = recurrence.widget.e( 'div', {'class': 'limit'}, [limit_checkbox, limit_label, until_count_container]); if (this.rule.until || this.rule.count) { // compatibility with ie, we delay setTimeout(function() {limit_checkbox.checked = true;}, 10); } else { until_radio.disabled = true; count_radio.disabled = true; until_date_selector.disable(); recurrence.widget.add_class(until_count_container, 'disabled'); } // core var freq_form_container = recurrence.widget.e( 'div', {'class': 'form'}); var root = recurrence.widget.e( 'form', {}, [ mode_container, freq_container, interval_container, freq_form_container, limit_container]); // events mode_checkbox.onclick = function() { if (this.checked) form.set_mode(recurrence.widget.EXCLUSION); else form.set_mode(recurrence.widget.INCLUSION); }; freq_select.onchange = function() { form.set_freq(parseInt(this.value), 10); }; interval_field.onchange = function() { form.set_interval(parseInt(this.value), 10); }; limit_checkbox.onclick = function () { if (this.checked) { recurrence.widget.remove_class( until_count_container, 'disabled'); until_radio.disabled = false; count_radio.disabled = false; if (until_radio.checked) { until_date_selector.enable(); form.set_until(until_date_selector.date); } if (count_radio.checked) { count_field.disabled = false; form.set_count(parseInt(count_field.value)); } } else { recurrence.widget.add_class( until_count_container, 'disabled'); until_radio.disabled = true; count_radio.disabled = true; until_date_selector.disable(); count_field.disabled = true; recurrence.array.foreach( form.freq_rules, function(rule) { rule.until = null; rule.count = null; }); form.update(); } } // for compatibility with ie, use timeout setTimeout(function () { if (form.rule.count) { count_radio.checked = true; until_date_selector.disable(); } else { until_radio.checked = true; count_field.disabled = true; } }, 1); until_radio.onclick = function () { this.checked = true; until_date_selector.enable(); count_radio.checked = false; count_field.disabled = true; form.set_until(until_date_selector.date); }; count_radio.onclick = function () { this.checked = true; count_field.disabled = false; until_radio.checked = false; until_date_selector.disable(); form.set_count(parseInt(count_field.value), 10); }; count_field.onchange = function () { form.set_count(parseInt(this.value), 10); }; // freq forms var forms = [ recurrence.widget.RuleYearlyForm, recurrence.widget.RuleMonthlyForm, recurrence.widget.RuleWeeklyForm, recurrence.widget.RuleDailyForm ]; var freq_forms = recurrence.array.foreach( forms, function(form, i) { var rule = this.freq_rules[i]; var f = new form(this, rule); freq_form_container.appendChild(f.elements.root); return f; }, this); this.freq_forms = freq_forms; // install dom this.panel.set_label(this.get_display_text()); this.panel.set_body(root); this.elements = { 'root': root, 'mode_checkbox': mode_checkbox, 'freq_select': freq_select, 'interval_field': interval_field, 'freq_form_container': freq_form_container, 'until_radio': until_radio, 'count_field': count_field, 'count_radio': count_radio, 'limit_checkbox': limit_checkbox }; }, get_display_text: function() { var text = this.freq_rules[this.selected_freq].get_display_text(); if (this.mode == recurrence.widget.EXCLUSION) text = recurrence.display.mode.exclusion + ' ' + text; return recurrence.string.capitalize(text); }, set_until: function(until) { recurrence.array.foreach( this.freq_rules, function(rule) { rule.count = null; rule.until = until; }); this.update(); }, set_count: function(count) { if (count < 2) var token = recurrence.string.capitalize( recurrence.display.labels.count); else var token = recurrence.string.capitalize( recurrence.display.labels.count_plural); var label1 = this.elements.count_field.previousSibling; var label2 = this.elements.count_field.nextSibling; label1.firstChild.nodeValue = token.split('%(number)s')[0]; label2.firstChild.nodeValue = token.split('%(number)s')[1]; recurrence.array.foreach( this.freq_rules, function(rule) { rule.until = null; rule.count = count; }); this.update(); }, set_interval: function(interval) { interval = parseInt(interval, 10); if (String(interval) == 'NaN') { // invalid value, reset to previous value this.elements.interval_field.value = ( this.freq_rules[this.selected_freq].interval); return; } var label = this.elements.interval_field.nextSibling; if (interval < 2) label.firstChild.nodeValue = ( recurrence.display.timeintervals[this.selected_freq]); else label.firstChild.nodeValue = ( recurrence.display.timeintervals_plural[this.selected_freq]); recurrence.array.foreach( this.freq_rules, function(rule) { rule.interval = interval; }); this.elements.interval_field.value = interval; this.update(); }, set_freq: function(freq) { this.freq_forms[this.selected_freq].hide(); this.freq_forms[freq].show(); this.elements.freq_select.value = freq; this.selected_freq = freq; // need to update interval to display different label this.set_interval(parseInt(this.elements.interval_field.value), 10); this.update(); }, set_mode: function(mode) { if (this.mode != mode) { if (this.mode == recurrence.widget.INCLUSION) { recurrence.array.remove( this.panel.widget.data.rrules, this.rule); this.panel.widget.data.exrules.push(this.rule); recurrence.widget.remove_class( this.panel.elements.root, 'inclusion'); recurrence.widget.add_class( this.panel.elements.root, 'exclusion'); } else { recurrence.array.remove( this.panel.widget.data.exrules, this.rule); this.panel.widget.data.rrules.push(this.rule); recurrence.widget.remove_class( this.panel.elements.root, 'exclusion'); recurrence.widget.add_class( this.panel.elements.root, 'inclusion'); } this.mode = mode; } this.update(); }, update: function() { this.panel.set_label(this.get_display_text()); this.rule.update(this.freq_rules[this.selected_freq]); this.panel.widget.update(); }, remove: function() { var parent = this.elements.root.parentNode; if (parent) parent.removeChild(this.elements.root); if (this.mode == recurrence.widget.INCLUSION) recurrence.array.remove(this.panel.widget.data.rrules, this.rule); else recurrence.array.remove(this.panel.widget.data.exrules, this.rule); this.panel.widget.update(); } }; recurrence.widget.RuleYearlyForm = function(panel, rule) { this.init(panel, rule); }; recurrence.widget.RuleYearlyForm.prototype = { init: function(panel, rule) { this.panel = panel; this.rule = rule; this.init_dom(); }, init_dom: function() { var form = this; var grid = new recurrence.widget.Grid(4, 3); var number = 0; for (var y=0; y < 3; y++) { for (var x=0; x < 4; x++) { var cell = grid.cell(x, y); if (this.rule.bymonth.indexOf(number + 1) > -1) recurrence.widget.add_class(cell, 'active'); cell.value = number + 1; cell.innerHTML = recurrence.display.months_short[number]; cell.onclick = function () { if (recurrence.widget.has_class(this, 'active')) recurrence.widget.remove_class(this, 'active'); else recurrence.widget.add_class(this, 'active'); form.set_bymonth(); }; number += 1; } } // by weekday checkbox var byday_checkbox = recurrence.widget.e( 'input', { 'class': 'checkbox', 'type': 'checkbox', 'name': 'byday'}); var byday_label = recurrence.widget.e( 'span', {'class': 'recurrence-label'}, recurrence.string.capitalize( recurrence.display.labels.on_the) + ':'); var byday_container = recurrence.widget.e( 'div', {'class': 'byday'}, [byday_checkbox, byday_label]); // weekday-position var position_options = recurrence.array.foreach( [1, 2, 3, 4, -1, -2, -3], function(value) { var option = recurrence.widget.e( 'option', {'value': value}, recurrence.string.strip(recurrence.display.weekdays_position[ String(value)].split('%(weekday)s')[0])); return option; }); var position_select = recurrence.widget.e( 'select', {'name': 'position'}, position_options); var weekday_options = recurrence.array.foreach( recurrence.display.weekdays, function(weekday, i) { var option = recurrence.widget.e( 'option', {'value': i}, weekday); return option; }); var weekday_select = recurrence.widget.e( 'select', {'name': 'weekday'}, weekday_options); var weekday_position_container = recurrence.widget.e( 'div', {'class': 'section'}, [position_select, weekday_select]); // core var year = recurrence.widget.e('div'); year.appendChild(grid.elements.root); var root = recurrence.widget.e( 'div', {'class': 'yearly'}, [year, byday_container, weekday_position_container]); recurrence.widget.add_class(root, 'hidden'); if (this.rule.byday.length) { if (form.rule.bysetpos.length) { position_select.value = String(form.rule.bysetpos[0]); } else { position_select.value = String(form.rule.byday[0].index); } weekday_select.value = String(form.rule.byday[0].number); byday_checkbox.checked = true; } else { position_select.disabled = true; weekday_select.disabled = true; } // events byday_checkbox.onclick = function () { if (this.checked) { position_select.disabled = false; weekday_select.disabled = false; form.set_byday(); } else { position_select.disabled = true; weekday_select.disabled = true; form.rule.byday = []; form.panel.update(); } }; position_select.onchange = function () { form.set_byday(); }; weekday_select.onchange = function () { form.set_byday(); }; this.elements = { 'root': root, 'grid': grid, 'byday_checkbox': byday_checkbox, 'position_select': position_select, 'weekday_select': weekday_select }; }, get_weekday: function() { var number = parseInt(this.elements.weekday_select.value, 10); var index = parseInt(this.elements.position_select.value, 10); return new recurrence.Weekday(number, index); }, set_bymonth: function() { var bymonth = []; recurrence.array.foreach( this.elements.grid.cells, function(cell) { if (recurrence.widget.has_class(cell, 'active')) bymonth.push(cell.value); }) this.rule.bymonth = bymonth; this.panel.update(); }, set_byday: function() { this.rule.byday = [this.get_weekday()]; this.panel.update(); }, show: function() { recurrence.widget.remove_class(this.elements.root, 'hidden'); }, hide: function() { recurrence.widget.add_class(this.elements.root, 'hidden'); } }; recurrence.widget.RuleMonthlyForm = function(panel, rule) { this.init(panel, rule); }; recurrence.widget.RuleMonthlyForm.prototype = { init: function(panel, rule) { this.panel = panel; this.rule = rule; this.init_dom(); }, init_dom: function() { var form = this; // monthday var monthday_grid = new recurrence.widget.Grid(7, Math.ceil(31 / 7)); var number = 0; for (var y=0; y < Math.ceil(31 / 7); y++) { for (var x=0; x < 7; x++) { number += 1; var cell = monthday_grid.cell(x, y); // use the last four cells to provide negative // day indexes cell.innerHTML = number<=31 ? number : number-36; if (this.rule.bymonthday.indexOf(number) > -1) recurrence.widget.add_class(cell, 'active'); cell.onclick = function () { if (monthday_grid.disabled) return; var day = parseInt(this.innerHTML, 10) || null; if (day) { if (recurrence.widget.has_class(this, 'active')) recurrence.widget.remove_class(this, 'active'); else recurrence.widget.add_class(this, 'active'); form.set_bymonthday(); } } // } } } var monthday_grid_container = recurrence.widget.e( 'div', {'class': 'section'}); monthday_grid_container.appendChild(monthday_grid.elements.root); var monthday_radio = recurrence.widget.e( 'input', { 'class': 'radio', 'type': 'radio', 'name': 'monthly', 'value': 'monthday'}); var monthday_label = recurrence.widget.e( 'span', {'class': 'recurrence-label'}, recurrence.display.labels.each + ':'); var monthday_container = recurrence.widget.e( 'li', {'class': 'monthday'}, [monthday_radio, monthday_label, monthday_grid_container]); // weekday-position var position_options = recurrence.array.foreach( [1, 2, 3, 4, -1, -2, -3], function(value) { var option = recurrence.widget.e( 'option', {'value': value}, recurrence.string.strip( recurrence.display.weekdays_position[ String(value)].split('%(weekday)s')[0])); return option; }); var position_select = recurrence.widget.e( 'select', {'name': 'position'}, position_options); var weekday_options = recurrence.array.foreach( recurrence.display.weekdays, function(weekday, i) { var option = recurrence.widget.e( 'option', {'value': i}, weekday); return option; }); var weekday_select = recurrence.widget.e( 'select', {'name': 'weekday'}, weekday_options); var weekday_position_container = recurrence.widget.e( 'div', {'class': 'section'}, [position_select, weekday_select]); var weekday_radio = recurrence.widget.e( 'input', { 'class': 'radio', 'type': 'radio', 'name': 'monthly', 'value': 'weekday'}); var weekday_label = recurrence.widget.e( 'span', {'class': 'recurrence-label'}, recurrence.display.labels.on_the + ':'); var weekday_container = recurrence.widget.e( 'li', {'class': 'weekday'}, [weekday_radio, weekday_label, weekday_position_container]); // core var monthday_weekday_container = recurrence.widget.e( 'ul', {'class': 'monthly'}, [monthday_container, weekday_container]); var root = recurrence.widget.e( 'div', {'class': 'monthly'}, [monthday_weekday_container]); recurrence.widget.add_class(root, 'hidden'); // events // for compatibility with ie, use timeout setTimeout(function () { if (form.rule.byday.length) { weekday_radio.checked = true; if (form.rule.bysetpos.length) { position_select.value = String(form.rule.bysetpos[0]); } else { position_select.value = String(form.rule.byday[0].index); } weekday_select.value = String(form.rule.byday[0].number); monthday_grid.disable(); } else { monthday_radio.checked = true; position_select.disabled = true; weekday_select.disabled = true; } }, 1); monthday_radio.onclick = function () { this.checked = true; weekday_radio.checked = false; position_select.disabled = true; weekday_select.disabled = true; monthday_grid.enable(); form.set_bymonthday(); }; weekday_radio.onclick = function () { this.checked = true; monthday_radio.checked = false; position_select.disabled = false; weekday_select.disabled = false; monthday_grid.disable(); form.set_byday(); }; position_select.onchange = function () { form.set_byday(); }; weekday_select.onchange = function () { form.set_byday(); }; this.elements = { 'root': root, 'monthday_grid': monthday_grid, 'monthday_radio': monthday_radio, 'weekday_radio': weekday_radio, 'position_select': position_select, 'weekday_select': weekday_select }; }, get_weekday: function() { var number = parseInt(this.elements.weekday_select.value, 10); var index = parseInt(this.elements.position_select.value, 10); return new recurrence.Weekday(number, index); }, set_byday: function() { this.rule.bymonthday = []; this.rule.bysetpos = []; this.rule.byday = [this.get_weekday()]; this.panel.update(); }, set_bymonthday: function() { this.rule.bysetpos = []; this.rule.byday = []; var monthdays = []; recurrence.array.foreach( this.elements.monthday_grid.cells, function(cell) { var day = parseInt(cell.innerHTML, 10) || null; if (day && recurrence.widget.has_class(cell, 'active')) monthdays.push(day); }); this.rule.bymonthday = monthdays; this.panel.update(); }, show: function() { recurrence.widget.remove_class(this.elements.root, 'hidden'); }, hide: function() { recurrence.widget.add_class(this.elements.root, 'hidden'); } }; recurrence.widget.RuleWeeklyForm = function(panel, rule) { this.init(panel, rule); }; recurrence.widget.RuleWeeklyForm.prototype = { init: function(panel, rule) { this.panel = panel; this.rule = rule; this.init_dom(); }, init_dom: function() { var form = this; var weekday_grid = new recurrence.widget.Grid(7, 1); var days = []; var days = recurrence.array.foreach( this.rule.byday, function(day) { return recurrence.to_weekday(day).number; }); for (var x=0; x < 7; x++) { var cell = weekday_grid.cell(x, 0); if (days.indexOf(x) > -1) recurrence.widget.add_class(cell, 'active'); cell.value = x; cell.innerHTML = recurrence.display.weekdays_short[x]; cell.onclick = function () { if (weekday_grid.disabled) return; if (recurrence.widget.has_class(this, 'active')) recurrence.widget.remove_class(this, 'active'); else recurrence.widget.add_class(this, 'active'); form.set_byday(); }; } var weekday_container = recurrence.widget.e( 'div', {'class': 'section'}); weekday_container.appendChild(weekday_grid.elements.root); var root = recurrence.widget.e( 'div', {'class': 'weekly hidden'}, [weekday_container]); this.elements = { 'root': root, 'weekday_grid': weekday_grid }; }, set_byday: function() { var byday = []; recurrence.array.foreach( this.elements.weekday_grid.cells, function(cell) { if (recurrence.widget.has_class(cell, 'active')) byday.push(new recurrence.Weekday(cell.value)); }); this.rule.byday = byday; this.panel.update(); }, show: function() { recurrence.widget.remove_class(this.elements.root, 'hidden'); }, hide: function() { recurrence.widget.add_class(this.elements.root, 'hidden'); } }; recurrence.widget.RuleDailyForm = function(panel, rule) { this.init(panel, rule); }; recurrence.widget.RuleDailyForm.prototype = { init: function(panel, rule) { this.panel = panel; this.rule = rule; this.init_dom(); }, init_dom: function() { var root = recurrence.widget.e('div', {'class': 'daily hidden'}); this.elements = {'root': root}; }, show: function() { // recurrence.widget.remove_class(this.elements.root, 'hidden'); }, hide: function() { // recurrence.widget.add_class(this.elements.root, 'hidden'); } }; recurrence.widget.DateForm = function(panel, mode, date) { this.init(panel, mode, date); }; recurrence.widget.DateForm.prototype = { init: function(panel, mode, date) { this.collapsed = true; this.panel = panel; this.mode = mode; this.date = date; this.init_dom(); }, init_dom: function() { var form = this; // mode var mode_checkbox = recurrence.widget.e( 'input', { 'class': 'checkbox', 'type': 'checkbox', 'name': 'mode', 'onclick': function() { if (this.checked) form.set_mode(recurrence.widget.EXCLUSION); else form.set_mode(recurrence.widget.INCLUSION); } }); if (this.mode == recurrence.widget.EXCLUSION) mode_checkbox.checked = true; var mode_label = recurrence.widget.e( 'span', {'class': 'recurrence-label'}, recurrence.display.labels.exclude_date); var mode_container = recurrence.widget.e( 'div', {'class': 'mode'}, [mode_checkbox, mode_label]); // date var date_label = recurrence.widget.e( 'span', {'class': 'recurrence-label'}, recurrence.display.labels.date + ':'); var date_selector = new recurrence.widget.DateSelector( this.date, {'onchange': function() {form.update();}}); var date_container = recurrence.widget.e( 'div', {'class': 'date'}, [date_label, date_selector.elements.root]); // core var root = recurrence.widget.e( 'form', {'class': 'date'}, [mode_container, date_container]); // init dom this.panel.set_label(this.get_display_text()); this.panel.set_body(root); this.elements = {'root': root}; }, get_display_text: function() { var text = recurrence.date.format(this.date, pgettext('date', '%l, %F %j, %Y')); if (this.mode == recurrence.widget.EXCLUSION) text = recurrence.display.mode.exclusion + ' ' + text; return recurrence.string.capitalize(text); }, set_mode: function(mode) { if (this.mode != mode) { if (this.mode == recurrence.widget.INCLUSION) { recurrence.array.remove( this.panel.widget.data.rdates, this.date); this.panel.widget.data.exdates.push(this.date); recurrence.widget.remove_class( this.elements.root, 'inclusion'); recurrence.widget.add_class( this.elements.root, 'exclusion'); this.update(); } else { recurrence.array.remove( this.panel.widget.data.exdates, this.date); this.panel.widget.data.rdates.push(this.date); recurrence.widget.remove_class( this.elements.root, 'exclusion'); recurrence.widget.add_class( this.elements.root, 'inclusion'); this.update(); } this.mode = mode; } this.update(); }, update: function() { this.panel.set_label(this.get_display_text()); this.panel.widget.update(); }, remove: function() { var parent = this.elements.root.parentNode; if (parent) parent.removeChild(this.elements.root); if (this.mode == recurrence.widget.INCLUSION) recurrence.array.remove(this.panel.widget.data.rdates, this.date); else recurrence.array.remove(this.panel.widget.data.exdates, this.date); this.panel.widget.update(); } }; recurrence.widget.e = function(tag_name, attrs, inner) { var element = document.createElement(tag_name); if (attrs) recurrence.widget.set_attrs(element, attrs); if (inner) { if (!inner.toLowerCase && inner.length) recurrence.array.foreach( inner, function(e) {element.appendChild(e);}); else element.innerHTML = inner; } return element; }; recurrence.widget.set_attrs = function(element, attrs) { for (var attname in attrs) if (attname.match(/^on/g)) element[attname] = attrs[attname]; else if (attname == 'class') element.className = attrs[attname]; else element.setAttribute(attname, attrs[attname]); }; recurrence.widget.add_class = function(element, class_name) { var names = (element.className || '').split(/[ \r\n\t]+/g); if (names.indexOf(class_name) == -1) { names.push(class_name); element.className = names.join(' '); } }; recurrence.widget.remove_class = function(element, class_name) { var names = (element.className || '').split(/[ \r\n\t]+/g); if (names.indexOf(class_name) > -1) { recurrence.array.remove(names, class_name); element.className = names.join(' '); } }; recurrence.widget.has_class = function(element, class_name) { var names = (element.className || '').split(/[ \r\n\t]+/g); if (names.indexOf(class_name) > -1) return true; else return false; }; recurrence.widget.element_in_dom = function(element, dom) { if (element == dom) { return true; } else { for (var i=0; i < dom.childNodes.length; i++) if (recurrence.widget.element_in_dom(element, dom.childNodes[i])) return true; } return false; }; recurrence.widget.cumulative_offset = function(element) { var y = 0, x = 0; do { y += element.offsetTop || 0; x += element.offsetLeft || 0; element = element.offsetParent; } while (element); return [x, y]; }; recurrence.widget.textareas_to_widgets = function(token) { var elements = []; if (!token) token = 'recurrence-widget'; if (token.toLowerCase) { var textareas = document.getElementsByTagName('textarea'); recurrence.array.foreach( textareas, function(textarea) { if (recurrence.widget.has_class(textarea, token)) elements.push(textarea); }); } recurrence.array.foreach( elements, function(e) { new recurrence.widget.Widget(e, window[e.id] || {}); }); }; recurrence.widget.date_today = function() { var date = new Date(); date.setHours(0); date.setMinutes(0); date.setSeconds(0); return date; }; recurrence.widget.INCLUSION = true; recurrence.widget.EXCLUSION = false; // display if (!recurrence.display) recurrence.display = {}; recurrence.display.mode = { 'inclusion': gettext('including'), 'exclusion': gettext('excluding') }; recurrence.display.labels = { 'frequency': gettext('Frequency'), 'on_the': gettext('On the'), 'each': gettext('Each'), 'every': gettext('Every'), 'until': gettext('Until'), 'count': gettext('Occurs %(number)s time'), 'count_plural': gettext('Occurs %(number)s times'), 'date': gettext('Date'), 'time': gettext('Time'), 'repeat_until': gettext('Repeat until'), 'exclude_occurrences': gettext('Exclude these occurences'), 'exclude_date': gettext('Exclude this date'), 'add_rule': gettext('Add rule'), 'add_date': gettext('Add date'), 'remove': gettext('Remove'), 'calendar': gettext('Calendar') }; ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642758229.0 django-recurrence-1.11.1/recurrence/static/recurrence/js/recurrence.js0000644000076500000240000010642000000000000025217 0ustar00aleksistaffif (!recurrence) var recurrence = {}; recurrence.Rule = function(freq, options) { this.init(freq, options); }; recurrence.Rule.prototype = { init: function(freq, options) { this.freq = freq; options = options || {}; this.interval = options.interval || 1; this.wkst = options.wkst || null; this.count = options.count || null; this.until = options.until || null; recurrence.array.foreach( recurrence.byparams, function (param) { if (options[param]) { var value = options[param]; if (value == null) value = []; this[param] = recurrence.array.from(value); } else { this[param] = []; } }, this); }, copy: function() { var until = this.until; if (until) until = new Date(until.valueOf()); var rule = new recurrence.Rule(this.freq, this); rule.until = until; return rule; }, update: function(rule) { rule = rule.copy(); this.freq = rule.freq; this.interval = rule.interval; this.wkst = rule.wkst; this.until = rule.until; this.count = rule.count; recurrence.array.foreach( recurrence.byparams, function(param) { this[param] = rule[param]; }, this); }, get_display_text: function(short) { short = short || false; var parts = []; var get_position_display = function(position) { if (short) return recurrence.display.weekdays_position_short[ String(position)]; else return recurrence.display.weekdays_position[ String(position)]; }; var get_weekday_display = function(number) { if (short) return recurrence.display.weekdays_short[number]; else return recurrence.display.weekdays[number]; }; var get_position_weekday = function(rule) { var items = []; if (rule.bysetpos.length && rule.byday.length) { recurrence.array.foreach( rule.bysetpos, function(x) { var label = get_position_display(x || 1); recurrence.array.foreach( rule.byday, function(y) { var weekday_display = get_weekday_display( recurrence.to_weekday(y).number); items.push( interpolate( label, {'weekday': weekday_display}, true)); }); }); } else if (rule.byday.length) { // TODO byday Weekday objects without index means // every weekday in the month, and so should appear in // plural. i.e. 'on sundays' instead of // 'on the first sunday'. recurrence.array.foreach( rule.byday, function(x, i) { var label = get_position_display(x.index || 1); var weekday_display = get_weekday_display( recurrence.to_weekday(x).number); items.push( interpolate( label, {'weekday': weekday_display}, true)); }); } return items.join(', '); } if (this.interval > 1) parts.push( interpolate( recurrence.display.tokens.every_number_freq, { 'number': this.interval, 'freq': recurrence.display.timeintervals_plural[this.freq] }, true)); else parts.push(recurrence.display.frequencies[this.freq]); if (this.freq == recurrence.YEARLY) { if (this.bymonth.length) { // i.e. 'each january, june' if (short) var months = recurrence.display.months_short; else var months = recurrence.display.months; var items = recurrence.array.foreach( this.bymonth, function(month, i) { return months[month - 1]; }); items = items.join(', '); parts.push( interpolate( recurrence.display.tokens.each, {'items': items}, true)); } if (this.byday.length || this.bysetpos.length) { var weekday_items = get_position_weekday(this); parts.push( interpolate( recurrence.display.tokens.on_the_items, {'items': weekday_items}, true)); } } if (this.freq == recurrence.MONTHLY) { if (this.bymonthday.length) { // i.e. 'on the 1st, 5th, 10th' var items = recurrence.array.foreach( this.bymonthday, function(day, i) { if (day < 0) { if (short) { return recurrence.display.last_of_month_short[String(day)] } else { return recurrence.display.last_of_month[String(day)] } } else { var dt = new Date(); dt.setMonth(0); dt.setDate(day); return recurrence.date.format(dt, recurrence.display.month_day); } }); items = items.join(', '); parts.push( interpolate( recurrence.display.tokens.on_the_items, {'items': items}, true)); } else if (this.byday.length) { if (this.byday.length || this.bysetpos.length) { var weekday_items = get_position_weekday(this); parts.push( interpolate( recurrence.display.tokens.on_the_items, {'items': weekday_items}, true)); } } } if (this.freq == recurrence.WEEKLY) { if (this.byday.length) { // i.e. 'each tuesday, wednesday' var items = recurrence.array.foreach( this.byday, function(byday) { var weekday_number = recurrence.to_weekday(byday).number; if (short) var weekday = recurrence.display.weekdays_short[ weekday_number]; else var weekday = recurrence.display.weekdays[ weekday_number]; return weekday; }); items = items.join(', '); parts.push( interpolate( recurrence.display.tokens.each, {'items': items}, true)); } } // daily frequencies has no additional formatting, // hour/minute/second formatting not supported. if (this.count) { if (this.count == 1) parts.push( interpolate( recurrence.display.tokens.count, {'number': this.count}, true)); else parts.push( interpolate( recurrence.display.tokens.count_plural, {'number': this.count}, true)); } else if (this.until) { parts.push( interpolate( recurrence.display.tokens.until, {'date': recurrence.date.format(this.until, pgettext('Until date format', '%Y-%m-%d'))}, true)); } return parts.join(', '); } }; recurrence.Recurrence = function(options) { this.init(options); }; recurrence.Recurrence.prototype = { init: function(options) { options = options || {}; this.dtstart = options.dtstart || null; this.dtend = options.dtend || null; this.rrules = recurrence.array.from(options.rrules || []); this.exrules = recurrence.array.from(options.exrules || []); this.rdates = recurrence.array.from(options.rdates || []); this.exdates = recurrence.array.from(options.exdates || []); }, copy: function() { return new recurrence.Recurrence({ 'rrules': recurrence.array.foreach( this.rrules, function(item) {return item.copy();}), 'exrules': recurrence.array.foreach( this.exrules, function(item) {return item.copy();}), 'rdates': recurrence.array.foreach( this.rdates, function(item) {return item.copy();}), 'exdates': recurrence.array.foreach( this.exdates, function(item) {return item.copy();}) }); }, serialize: function() { return recurrence.serialize(this); } }; recurrence.Weekday = function(number, index) { this.init(number, index); }; recurrence.Weekday.prototype = { init: function(number, index) { this.number = number; this.index = index || null; }, with_index: function(index) { if (index == this.index) return this; else return new recurrence.Weekday(this.number, index); }, equals: function(other) { if (this.number == other.number && this.index == other.index) return True; else return False; }, toString: function() { if (this.index) return this.index + recurrence.weekdays[this.number]; else return recurrence.weekdays[this.number]; } }; recurrence.DateFormat = function(date) { this.init(date); }; recurrence.DateFormat.prototype = { init: function(date) { this.data = date; }, format: function(format) { var tokens = format.match(recurrence.DateFormat.formatchars); recurrence.array.foreach(tokens, function(token) { if (this[token.charAt(1)]) format = format.replace(token, this[token.charAt(1)]()); }, this); return format; }, a: function() { if (this.data.getHours() > 11) return recurrence.display.ampm.am; else return recurrence.display.ampm.pm; }, A: function() { if (this.data.getHours() > 11) return recurrence.display.ampm.AM; else return recurrence.display.ampm.PM; }, f: function() { if (this.data.getMinutes() == 0) return this.g(); else return [this.g(), this.i()].join(':'); }, g: function() { if (this.data.getHours() == 0) return 12; else return this.data.getHours() - 12; return this.data.getHours(); }, G: function() { return this.data.getHours(); }, h: function() { return recurrence.string.rjust(String(this.g()), 2, '0'); }, H: function() { return recurrence.string.rjust(String(this.G()), 2, '0'); }, i: function() { return recurrence.string.rjust(String(this.data.getMinutes()), 2, '0'); }, P: function() { if (this.data.getMinutes() == 0 && this.data.getHours() == 0) return recurrence.display.tokens.midnight; if (this.data.getMinutes() == 0 && this.data.getHours() == 12) return recurrence.display.tokens.noon; }, s: function() { return recurrence.string.rjust(String(this.data.getSeconds()), 2, '0'); }, Y: function() { return this.data.getFullYear(); }, b: function() { return recurrence.display.months_short[this.data.getMonth()]; }, d: function() { return recurrence.string.rjust(String(this.data.getDate()), 2, '0'); }, D: function() { return recurrence.display.weekdays_short[ recurrence.date.weekday(this.data)]; }, F: function() { return recurrence.display.months[this.data.getMonth()]; }, I: function() { var now = new Date(); var date1 = new Date(now.getFullYear(), 0, 1, 0, 0, 0, 0); var date2 = new Date(now.getFullYear(), 6, 1, 0, 0, 0, 0); var temp = date1.toGMTString(); var date3 = new Date(temp.substring(0, temp.lastIndexOf(' ')-1)); var temp = date2.toGMTString(); var date4 = new Date(temp.substring(0, temp.lastIndexOf(" ")-1)); var hours_diff_standard_time = (date1 - date3) / (1000 * 60 * 60); var hours_diff_daylight_time = (date2 - date4) / (1000 * 60 * 60); if (hours_diff_daylight_time == hours_diff_standard_time) return '0'; else return '1'; }, j: function() { return this.data.getDate(); }, l: function() { return recurrence.display.weekdays[ recurrence.date.weekday(this.data)]; }, L: function() { return recurrence.date.isleap(this.data); }, m: function() { return recurrence.string.rjust( String(this.data.getMonth() + 1), 2, '0'); }, M: function() { return recurrence.display.months_short[this.data.getMonth()]; }, n: function() { return this.data.getMonth() + 1; }, N: function() { return recurrence.display.months_ap[this.data.getMonth()]; }, O: function() { var seconds = this.Z(); return ( '+' + recurrence.string.rjust( String(Math.floor(seconds / 3600)), 2, '0') + recurrence.string.rjust( String(Math.floor((seconds / 60) % 60)), 2, '0')); }, r: function() { return recurrence.date.format(this, '%D, %j %M %Y %H:%i:%s %O'); }, S: function() { var day = this.data.getDate(); var ordinal_indicator = recurrence.display.ordinal_indicator; var language_code = recurrence.language_code || "en-us"; if (language_code in ordinal_indicator) { return ordinal_indicator[language_code](day); } else if (language_code.split("-")[0] in ordinal_indicator) { return ordinal_indicator[language_code.split("-")[0]](day); } return ""; }, t: function() { var month = this.data.getMonth() var ndays = recurrence.DateFormat.mdays[month] + (month == recurrence.FEBRUARY && this.L()); return recurrence.string.rjust(String(ndays), 2, '0'); }, T: function() { var tzname = String(this.data).match(/\([^\)]+\)/g).slice(1, -1); if (!tzname) tzname = recurrence.date.format(this, '%O'); return tzname; }, U: function() { return this.data.getTime(); }, w: function() { return recurrence.date.weekday(this.data.weekday); }, W: function() { var week_number = null; var jan1_weekday = new Date( this.data.getFullYear(), this.data.getMonth(), 1); var weekday = this.data.getDay(); var day_of_year = self.z(); var prev_year = new Date(this.data.getFullYear() - 1, 0, 1); if (day_of_year <= (8 - jan1_weekday) && jan1_weekday > 4) { if (jan1_weekday == 5 || (jan1_weekday == 6 && recurrence.date.isleap(prev_year))) week_number = 53; else week_number = 52; } else { if (recurrence.date.isleap(this.data)) var i = 366; else var i = 365; if ((i - day_of_year) < (4 - weekday)) { week_number = 1; } else { var j = day_of_year + (7 - weekday) + (jan1_weekday - 1); week_number = Math.floor(j / 7); if (jan1_weekday > 4) week_number = week_number - 1; } } return week_number; }, y: function() { return String(this.data.getFullYear()).slice(2); }, Y: function() { return this.data.getFullYear(); }, z: function() { var doy = recurrence.DateFormat.year_days[this.data.getMonth()] + this.data.getDate(); if (this.L() && this.data.getMonth() > 2) doy += 1; return doy; }, Z: function() { var offset = this.data.getTimezoneOffset(); return offset * 60; } }; recurrence.DateFormat.formatchars = RegExp( '%[aAbBdDfFgGhHiIjlLmMnNOPrsStTUwWyYzZ]', 'g'); recurrence.DateFormat.year_days = [ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334]; recurrence.DateFormat.mdays = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; recurrence.to_weekday = function(token) { if (token.number && token.index) { return new recurrence.Weekday(token.number, token.index); } else if (String(token).match(/[^0-9\-]/g)) { var token = String(token); var constant = token.slice(-2, token.length); var nth = token.slice(0, -2); if (nth.match(/[^0-9\-]/g)) throw Error('Invalid weekday token.'); var weekday = recurrence.weekdays.indexOf(constant); if (weekday < 0) throw Error('Invalid weekday token.'); else return new recurrence.Weekday(weekday, nth || null); } else { return new recurrence.Weekday(parseInt(token, 10)); } throw Error('Invalid weekday token.'); }; recurrence.serialize = function(rule_or_recurrence) { var serialize_dt = function(dt) { var pad = function(initial, length) { initial = String(initial) var offset = length - initial.length; if (offset < 0) { return initial; } else { while (initial.length < length) { initial = '0' + initial; } return initial; } }; return pad(dt.getUTCFullYear(), 4) + pad(dt.getUTCMonth() + 1, 2) + pad(dt.getUTCDate(), 2) + 'T' + pad(dt.getUTCHours(), 2) + pad(dt.getUTCMinutes(), 2) + pad(dt.getUTCSeconds(), 2) + 'Z'; }; var serialize_rule = function(rule) { var map_to_string = function(sequence) { var new_sequence = []; recurrence.array.foreach(sequence, function(item) { new_sequence.push(String(item)); }); return new_sequence; }; var map_to_param = function(sequence) { var new_sequence = []; recurrence.array.foreach(sequence, function(item) { new_sequence.push(item[0] + '=' + item[1].join(',')); }); return new_sequence; }; var values = []; values.push(['FREQ', [recurrence.frequencies[rule.freq]]]); if (rule.interval != 1) values.push(['INTERVAL', [String(rule.interval)]]); if (rule.wkst) values.push(['WKST', [recurrence.weekdays[rule.wkst]]]); if (rule.count != null) values.push(['COUNT', [String(rule.count)]]); else if (rule.until != null) values.push(['UNTIL', [serialize_dt(rule.until)]]); if (rule.byday.length) { var days = recurrence.array.foreach(rule.byday, function(item) { return recurrence.to_weekday(item).toString(); }); values.push(['BYDAY', days]); } recurrence.array.foreach(recurrence.byparams, function(param) { if (param != 'byday') { var value_list = rule[param] || []; if (value_list.length) values.push([param.toUpperCase(), map_to_string(value_list)]); } }); return map_to_param(values).join(';'); }; var map_to_property = function(sequence) { var new_sequence = recurrence.array.foreach( sequence, function(item) { return item.join(':'); }); return new_sequence; }; var obj = rule_or_recurrence; if (obj.freq) obj = new recurrence.Recurrence({'rrules': [obj]}); var items = []; if (obj.dtstart) items.push(['DTSTART', serialize_dt(obj.dtstart)]); if (obj.dtend) items.push(['DTEND', serialize_dt(obj.dtend)]); recurrence.array.foreach( obj.rrules, function(item) { items.push(['RRULE', serialize_rule(item)]); }); recurrence.array.foreach( obj.exrules, function(item) { items.push(['EXRULE', serialize_rule(item)]); }); recurrence.array.foreach( obj.rdates, function(item) { items.push(['RDATE', serialize_dt(item)]); }); recurrence.array.foreach( obj.exdates, function(item) { items.push(['EXDATE', serialize_dt(item)]); }); return map_to_property(items).join('\n'); }; recurrence.deserialize = function(text) { var deserialize_dt = function(text) { var year = parseInt(text.slice(0, 4), 10); var month = parseInt(text.slice(4, 6), 10); var day = parseInt(text.slice(6, 8), 10); if (text.indexOf('T') > 0) { var hour = parseInt(text.slice(9, 11), 10); var minute = parseInt(text.slice(11, 13), 10); var second = parseInt(text.slice(13, 15), 10); } else { var hour = 0; var minute = 0; var second = 0; } var dt = new Date(); if (text.indexOf('Z') > 0) { dt.setTime(Date.UTC(year, month - 1, day, hour, minute, second) / 1); } else { dt.setTime(new Date(year, month - 1, day, hour, minute, second).getTime()); } return dt; }; var dtstart = null; var dtend = null; var rrules = []; var exrules = []; var rdates = []; var exdates = []; var pattern = /(DTSTART|DTEND|RRULE|EXRULE|RDATE|EXDATE)[^:]*:(.*)/g; var tokens = text.match(pattern) || []; recurrence.array.foreach( tokens, function(token) { var label = token.split(':', 2)[0]; var param_text = token.split(':', 2)[1]; if (param_text.indexOf('=') < 0) { var params = param_text; } else { var param_tokens = param_text.split(';'); var params = recurrence.array.foreach( param_tokens, function(item) { var param_name = recurrence.string.strip( item.split('=', 2)[0]); var param_value = recurrence.string.strip( item.split('=', 2)[1]); var value_list = param_value.split(','); var value_list = recurrence.array.foreach( param_value.split(','), function(item) { return recurrence.string.strip(item); }); return [param_name, value_list]; }); } if (label == 'RRULE' || label == 'EXRULE') { var freq = 0; var options = {}; recurrence.array.foreach( params, function(item) { var key = item[0]; var param = key.toLowerCase(); var value = item[1]; if (key == 'FREQ') { if (recurrence.frequencies.indexOf(value[0]) != -1) { freq = recurrence.frequencies.indexOf(value[0]); } } else if (key == 'INTERVAL') { options[param] = parseInt(value[0], 10); } else if (key == 'WKST') { options[param] = recurrence.to_weekday(value[0]); } else if (key == 'COUNT') { options[param] = parseInt(value[0], 10); } else if (key == 'UNTIL') { options[param] = deserialize_dt(value[0]); } else if (key == 'BYDAY') { options[param] = recurrence.array.foreach( value, function(item) { return recurrence.to_weekday(item); }); } else { options[param] = recurrence.array.foreach( value, function(item) { return parseInt(item, 10); }); } }); if (label == 'RRULE') rrules.push(new recurrence.Rule(freq, options)); else exrules.push(new recurrence.Rule(freq, options)); } else if (label == 'DTSTART') { dtstart = deserialize_dt(params); } else if (label == 'DTEND') { dtend = deserialize_dt(params); } else if (label == 'RDATE') { rdates.push(deserialize_dt(params)); } else if (label == 'EXDATE') { exdates.push(deserialize_dt(params)); } }); return new recurrence.Recurrence({ 'dtstart': dtstart, 'dtend': dtend, 'rrules': rrules, 'exrules': exrules, 'rdates': rdates, 'exdates': exdates }); }; recurrence.log = function(message) { var dom = document.createElement('div'); dom.innerHTML = message; document.body.insertBefore(dom, document.body.firstChild); }; recurrence.string = { format: function(string, map) { for (var key in map) string = string.replace(RegExp('%' + key, 'g'), map[key]); return string }, capitalize: function(string) { return ( string.charAt(0).toUpperCase() + string.slice(1, string.length)); }, strip: function(string) { return string.replace( /^[ \t\n\r]*/, '').replace(/[ \t\n\r]*$/, ''); }, rjust: function(string, length, character) { var initial = String(string); var offset = length - initial.length; character = character || ' '; if (offset < 0) { return initial; } else { while (initial.length < length) { initial = character.charAt(0) + initial; } return initial; } }, ljust: function(string, length, character) { var initial = String(string); var offset = length - initial.length; character = character || ' '; if (offset < 0) { return initial; } else { while (initial.length < length) { initial = initial + character[0]; } return initial; } } }; recurrence.date = { format: function(date, format) { return new recurrence.DateFormat(date).format(format); }, isleap: function(date) { var year = date.getFullYear(); return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0); }, weekday: function(date) { var day = date.getDay() - 1; if (day < 0) day = day + 7; else if (day > 6) day = day - 7; return day; }, days_in_month: function(date) { var m = date.getMonth() + 1; var y = date.getFullYear(); if (m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12) return 31; else if (m == 4 || m == 6 || m == 9 || m == 11) return 30; else if (m == 2 && recurrence.date.isleap(date)) return 29; else return 28; } }; recurrence.array = { foreach: function(array, func, bindto) { if (bindto) func = recurrence.func.bind(func, bindto); array = recurrence.array.from(array); var return_values = []; for (var i=0; i < array.length; i++) return_values.push(func(array[i], i)); return return_values; }, from: function(iterable) { if (!iterable) return []; if (iterable.toArray) { return iterable.toArray(); } else { var results = []; for (var i=0, length=iterable.length; i < length; i++) results.push(iterable[i]); return results; } }, remove: function(array, item) { array.splice(array.indexOf(item), 1); } }; recurrence.func = { bind: function() { var args = recurrence.array.from(arguments); var func = args.shift(); var object = args.shift(); return function() { return func.apply( object, args.concat(recurrence.array.from(arguments))); } } }; if (!Array.indexOf) { // ie doesn't have indexOf on arrays Array.prototype.indexOf = function(obj) { for (var i=0; i < this.length; i++) if (this[i] == obj) return i; return -1; }; } // frequencies recurrence.YEARLY = 0; recurrence.MONTHLY = 1; recurrence.WEEKLY = 2; recurrence.DAILY = 3; recurrence.HOURLY = 4; recurrence.MINUTELY = 5; recurrence.SECONDLY = 6; // months recurrence.JANUARY = 1; recurrence.FEBRUARY = 2; recurrence.MARCH = 3; recurrence.APRIL = 4; recurrence.MAY = 5; recurrence.JUNE = 6; recurrence.JULY = 7; recurrence.AUGUST = 8; recurrence.SEPTEMBER = 9; recurrence.OCTOBER = 10; recurrence.NOVEMBER = 11; recurrence.DECEMBER = 12; // weekdays recurrence.MONDAY = recurrence.MO = new recurrence.Weekday(0, null); recurrence.TUEDSAY = recurrence.TU = new recurrence.Weekday(1, null); recurrence.WEDNESDAY = recurrence.WE = new recurrence.Weekday(2, null); recurrence.THURSDAY = recurrence.TH = new recurrence.Weekday(3, null); recurrence.FRIDAY = recurrence.FR = new recurrence.Weekday(4, null); recurrence.SATURDAY = recurrence.SA = new recurrence.Weekday(5, null); recurrence.SUNDAY = recurrence.SU = new recurrence.Weekday(6, null); // enumerations recurrence.byparams = [ 'bysetpos', 'bymonth', 'bymonthday', 'byyearday', 'byweekno', 'byday', 'byhour', 'byminute', 'bysecond' ]; recurrence.frequencies = [ 'YEARLY', 'MONTHLY', 'WEEKLY', 'DAILY', 'HOURLY', 'MINUTELY', 'SECONDLY' ]; recurrence.weekdays = [ 'MO', 'TU', 'WE', 'TH', 'FR', 'SA', 'SU' ]; // recurrence.firstweekday = 0; // i18n no-ops if jsi18n not loaded if (typeof(catalog) === 'undefined') { var catalog = []; } else { var catalog = catalog; } var gettext = gettext || function(msgid) { var value = catalog[msgid]; if (typeof(value) == 'undefined') { return msgid; } else { return (typeof(value) == 'string') ? value : value[0]; } }; var interpolate = interpolate || function(fmt, obj, named) { if (named) { return fmt.replace(/%\(\w+\)s/g, function(match) { return String(obj[match.slice(2,-2)]) }); } else { return fmt.replace(/%s/g, function(match) { return String(obj.shift()) }); } }; // display if (!recurrence.display) recurrence.display = {}; recurrence.display.tokens = { 'midnight': gettext('midnight'), 'noon': gettext('noon'), 'on_the_items': gettext('on the %(items)s'), 'every_number_freq': gettext('every %(number)s %(freq)s'), 'each': gettext('each %(items)s'), 'count': gettext('occuring %(number)s time'), 'count_plural': gettext('occuring %(number)s times'), 'until': gettext('until %(date)s') }; recurrence.display.timeintervals = [ gettext('year'), gettext('month'), gettext('week'), gettext('day'), gettext('hour'), gettext('minute'), gettext('second') ]; recurrence.display.timeintervals_plural = [ gettext('years'), gettext('months'), gettext('weeks'), gettext('days'), gettext('hours'), gettext('minutes'), gettext('seconds') ]; recurrence.display.frequencies = [ gettext('annually'), gettext('monthly'), gettext('weekly'), gettext('daily'), gettext('hourly'), gettext('minutely'), gettext('secondly') ]; recurrence.display.weekdays = [ gettext('Monday'), gettext('Tuesday'), gettext('Wednesday'), gettext('Thursday'), gettext('Friday'), gettext('Saturday'), gettext('Sunday') ]; recurrence.display.weekdays_short = [ gettext('Mon'), gettext('Tue'), gettext('Wed'), gettext('Thu'), gettext('Fri'), gettext('Sat'), gettext('Sun') ]; recurrence.display.weekdays_oneletter = [ pgettext('Monday first letter', 'M'), pgettext('Tuesday first letter', 'T'), pgettext('Wednesday first letter', 'W'), pgettext('Thursday first letter', 'T'), pgettext('Friday first letter', 'F'), pgettext('Saturday first letter', 'S'), pgettext('Sunday first letter', 'S') ]; recurrence.display.weekdays_position = { '1': gettext('first %(weekday)s'), '2': gettext('second %(weekday)s'), '3': gettext('third %(weekday)s'), '4': gettext('fourth %(weekday)s'), '-1': gettext('last %(weekday)s'), '-2': gettext('second last %(weekday)s'), '-3': gettext('third last %(weekday)s') }; recurrence.display.weekdays_position_short = { '1': gettext('1st %(weekday)s'), '2': gettext('2nd %(weekday)s'), '3': gettext('3rd %(weekday)s'), '4': gettext('4th %(weekday)s'), '-1': gettext('last %(weekday)s'), '-2': gettext('2nd last %(weekday)s'), '-3': gettext('3rd last %(weekday)s') }; recurrence.display.last_of_month = { '-1': gettext('last'), '-2': gettext('second last'), '-3': gettext('third last'), '-4': gettext('fourth last') } recurrence.display.last_of_month_short = { '-1': gettext('last'), '-2': gettext('2nd last'), '-3': gettext('3rd last'), '-4': gettext('4th last') } recurrence.display.months = [ gettext('January'), gettext('February'), gettext('March'), gettext('April'), pgettext('month name', 'May'), gettext('June'), gettext('July'), gettext('August'), gettext('September'), gettext('October'), gettext('November'), gettext('December') ]; recurrence.display.months_short = [ gettext('Jan'), gettext('Feb'), gettext('Mar'), gettext('Apr'), pgettext('month name', 'May'), gettext('Jun'), gettext('Jul'), gettext('Aug'), gettext('Sep'), gettext('Oct'), gettext('Nov'), gettext('Dec') ]; recurrence.display.months_ap = [ gettext('Jan.'), gettext('Feb.'), gettext('March'), gettext('April'), pgettext('month name', 'May'), gettext('June'), gettext('July'), gettext('Aug.'), gettext('Sept.'), gettext('Oct.'), gettext('Nov.'), gettext('Dec.') ]; recurrence.display.ampm = { 'am': gettext('a.m.'), 'pm': gettext('p.m.'), 'AM': gettext('AM'), 'PM': gettext('PM') }; recurrence.display.month_day = pgettext('Day of month', '%j%S'); recurrence.display.ordinal_indicator = { 'en': function(day) { if (day == 11 || day == 12 || day == 13) return 'th'; var last = day % 10; if (last == 1) return 'st'; if (last == 2) return 'nd'; if (last == 3) return 'rd'; return 'th'; }, 'fr': function(day) { if (day == 1) return 'er'; return ''; } }; ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642493095.0 django-recurrence-1.11.1/requirements.txt0000644000076500000240000000021100000000000017602 0ustar00aleksistaffflake8==4.0.1 pytest-cov==3.0.0 pytest-django==4.5.2 pytest-sugar==0.9.4 pytest==6.2.5 sphinx==4.3.2 sphinx_rtd_theme==1.0.0 tox==3.24.5 ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1643105481.308216 django-recurrence-1.11.1/setup.cfg0000644000076500000240000000004600000000000016145 0ustar00aleksistaff[egg_info] tag_build = tag_date = 0 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1643105375.0 django-recurrence-1.11.1/setup.py0000644000076500000240000000373300000000000016044 0ustar00aleksistaffimport os from setuptools import setup setup( name="django-recurrence", use_scm_version=True, license="BSD", description="Django utility wrapping dateutil.rrule", long_description="\n".join( [ open("README.rst", encoding="utf-8").read(), open("CHANGES.rst", encoding="utf-8").read(), ] ), author="Tamas Kemenczy", author_email="tamas.kemenczy@gmail.com", url="https://github.com/django-recurrence/django-recurrence", classifiers=[ "Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Environment :: Plugins", "Framework :: Django", "Framework :: Django", "Framework :: Django :: 2.2", "Framework :: Django :: 3.2", "Framework :: Django :: 4.0", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: Implementation", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", ], python_requires=">=3.7", install_requires=["django>=2.2", "python-dateutil"], setup_requires=["setuptools_scm"], packages=["recurrence", "recurrence.migrations"], package_dir={"recurrence": "recurrence"}, package_data={ "recurrence": [ os.path.join("static", "*.css"), os.path.join("static", "*.png"), os.path.join("static", "*.js"), os.path.join("locale", "*.po"), os.path.join("locale", "*.mo"), ] }, zip_safe=False, include_package_data=True, ) ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1643105481.307336 django-recurrence-1.11.1/tests/0000755000076500000240000000000000000000000015466 5ustar00aleksistaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/tests/__init__.py0000644000076500000240000000000000000000000017565 0ustar00aleksistaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/tests/models.py0000644000076500000240000000035200000000000017323 0ustar00aleksistafffrom django.db import models from recurrence.fields import RecurrenceField class EventWithNoNulls(models.Model): recurs = RecurrenceField(null=False) class EventWithNulls(models.Model): recurs = RecurrenceField(null=True) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/tests/settings.py0000644000076500000240000000275100000000000017705 0ustar00aleksistaffDATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': 'test_db.sqlite' } } MIDDLEWARE_CLASSES = ( 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ) TEMPLATE_CONTEXT_PROCESSORS = ( 'django.contrib.auth.context_processors.auth', 'django.core.context_processors.debug', 'django.core.context_processors.i18n', 'django.core.context_processors.media', 'django.core.context_processors.request', 'django.core.context_processors.static', 'django.core.context_processors.tz', ) INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'recurrence', 'tests', ) # ROOT_URLCONF = 'tests.urls' PASSWORD_HASHERS = ( 'django.contrib.auth.hashers.MD5PasswordHasher', 'django.contrib.auth.hashers.SHA1PasswordHasher', ) STATIC_URL = '/fakestatictrees/' MEDIA_ROOT = 'tests/testmedia/' TIME_ZONE = 'Europe/London' LANGUAGE_CODE = 'en-us' SITE_ID = 1 USE_I18N = True USE_L10N = True USE_TZ = True SECRET_KEY = 'thisbagismadefromrecycledmaterial' TEMPLATE_DEBUG = True RECURRENCE_USE_TZ = False ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/tests/test_exclusions.py0000644000076500000240000000322000000000000021270 0ustar00aleksistafffrom datetime import datetime from recurrence import Recurrence, Rule import recurrence def test_exclusion_date(): rule = Rule( recurrence.DAILY ) pattern = Recurrence( dtstart=datetime(2014, 1, 2, 0, 0, 0), dtend=datetime(2014, 1, 4, 0, 0, 0), rrules=[rule], exdates=[ datetime(2014, 1, 3, 0, 0, 0) ] ) occurrences = [ instance for instance in pattern.occurrences() ] assert occurrences == [ datetime(2014, 1, 2, 0, 0, 0), datetime(2014, 1, 4, 0, 0, 0), ] assert 2 == pattern.count() def test_exclusion_date_no_limits(): pattern = Recurrence( rdates=[ datetime(2014, 1, 1, 0, 0, 0), datetime(2014, 1, 2, 0, 0, 0), ], exdates=[ datetime(2014, 1, 2, 0, 0, 0) ] ) occurrences = [ instance for instance in pattern.occurrences() ] assert occurrences == [ datetime(2014, 1, 1, 0, 0, 0), ] assert 1 == pattern.count() def test_exclusion_rule(): inclusion_rule = Rule( recurrence.DAILY ) exclusion_rule = Rule( recurrence.WEEKLY, byday=recurrence.THURSDAY ) pattern = Recurrence( dtstart=datetime(2014, 1, 2, 0, 0, 0), dtend=datetime(2014, 1, 4, 0, 0, 0), rrules=[inclusion_rule], exrules=[exclusion_rule] ) occurrences = [ instance for instance in pattern.occurrences() ] assert occurrences == [ datetime(2014, 1, 3, 0, 0, 0), datetime(2014, 1, 4, 0, 0, 0), ] assert 2 == pattern.count() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/tests/test_fields.py0000644000076500000240000001501400000000000020346 0ustar00aleksistafffrom datetime import datetime import pytest from django import forms import recurrence from recurrence import Recurrence, Rule from recurrence.forms import RecurrenceField def test_clean_normal_value(): field = RecurrenceField() value = "RRULE:FREQ=WEEKLY;BYDAY=TU" obj = field.clean(value) assert len(obj.rrules) == 1 assert obj.rrules[0].to_text() == "weekly, each Tuesday" def test_clean_invalid_value(): field = RecurrenceField() value = "RRULE:FREQS=WEEKLY" with pytest.raises(forms.ValidationError) as e: field.clean(value) assert e.value.messages[0] == "bad parameter: FREQS" def test_strip_dtstart_and_dtend_if_required(): rule = Rule( recurrence.WEEKLY ) limits = Recurrence( dtstart=datetime(2014, 1, 1, 0, 0, 0), dtend=datetime(2014, 2, 3, 0, 0, 0), rrules=[rule] ) value = recurrence.serialize(limits) field = RecurrenceField() cleaned_value = field.clean(value) assert cleaned_value == limits assert cleaned_value.dtstart == datetime(2014, 1, 1, 0, 0, 0) assert cleaned_value.dtend == datetime(2014, 2, 3, 0, 0, 0) field = RecurrenceField(accept_dtstart=False, accept_dtend=False) cleaned_value = field.clean(value) assert cleaned_value != limits assert cleaned_value.dtstart is None assert cleaned_value.dtend is None def test_check_max_rrules(): rule = Rule( recurrence.WEEKLY ) limits = Recurrence( rrules=[rule] ) value = recurrence.serialize(limits) field = RecurrenceField(max_rrules=0) with pytest.raises(forms.ValidationError) as e: field.clean(value) assert e.value.messages[0] == "Max rules exceeded. The limit is 0" def test_check_max_exrules(): rule = Rule( recurrence.WEEKLY ) limits = Recurrence( exrules=[rule] ) value = recurrence.serialize(limits) field = RecurrenceField(max_exrules=0) with pytest.raises(forms.ValidationError) as e: field.clean(value) assert e.value.messages[0] == ("Max exclusion rules exceeded. " "The limit is 0") def test_check_max_rdates(): limits = Recurrence( rdates=[ datetime(2014, 1, 1, 0, 0, 0), datetime(2014, 1, 2, 0, 0, 0), ] ) value = recurrence.serialize(limits) field = RecurrenceField(max_rdates=2) field.clean(value) field = RecurrenceField(max_rdates=1) with pytest.raises(forms.ValidationError) as e: field.clean(value) assert e.value.messages[0] == "Max dates exceeded. The limit is 1" def test_check_max_exdates(): limits = Recurrence( exdates=[ datetime(2014, 1, 1, 0, 0, 0), datetime(2014, 1, 2, 0, 0, 0), ] ) value = recurrence.serialize(limits) field = RecurrenceField(max_exdates=2) field.clean(value) field = RecurrenceField(max_exdates=1) with pytest.raises(forms.ValidationError) as e: field.clean(value) assert e.value.messages[0] == ("Max exclusion dates exceeded. " "The limit is 1") def test_check_allowable_frequencies(): rule = Rule( recurrence.WEEKLY ) limits = Recurrence( rrules=[rule] ) value = recurrence.serialize(limits) field = RecurrenceField(frequencies=[ recurrence.WEEKLY ]) field.clean(value) field = RecurrenceField(frequencies=[ recurrence.YEARLY ]) with pytest.raises(forms.ValidationError) as e: field.clean(value) assert e.value.messages[0] == "Invalid frequency." limits = Recurrence( exrules=[rule] ) value = recurrence.serialize(limits) with pytest.raises(forms.ValidationError) as e: field.clean(value) assert e.value.messages[0] == "Invalid frequency." def test_include_dtstart_from_field(): rule = Rule( recurrence.WEEKLY, byday=recurrence.MONDAY ) limits = Recurrence( rrules=[rule] ) value = recurrence.serialize(limits) model_field = recurrence.fields.RecurrenceField() # Test with include_dtstart=True (default) rec_obj = model_field.to_python(value) assert rec_obj == limits # 2nd of August (dtstart) is expected but only for inc=True assert rec_obj.between(datetime(2015, 8, 2), datetime(2015, 8, 11), inc=True, dtstart=datetime(2015, 8, 2)) == [ datetime(2015, 8, 2, 0, 0), datetime(2015, 8, 3, 0, 0), datetime(2015, 8, 10, 0, 0)] assert rec_obj.between(datetime(2015, 8, 2), datetime(2015, 8, 11), inc=False, dtstart=datetime(2015, 8, 2)) == [ datetime(2015, 8, 3, 0, 0), datetime(2015, 8, 10, 0, 0)] model_field = recurrence.fields.RecurrenceField(include_dtstart=False) # Test with include_dtstart=False rec_obj = model_field.to_python(value) assert rec_obj == limits # 2nd of August (dtstart) is not expected regardless of inc assert rec_obj.between(datetime(2015, 8, 2), datetime(2015, 8, 11), inc=True, dtstart=datetime(2015, 8, 2)) == [ datetime(2015, 8, 3, 0, 0), datetime(2015, 8, 10, 0, 0)] assert rec_obj.between(datetime(2015, 8, 2), datetime(2015, 8, 11), inc=False, dtstart=datetime(2015, 8, 2)) == [ datetime(2015, 8, 3, 0, 0), datetime(2015, 8, 10, 0, 0)] def test_include_dtstart_from_object(): rule = Rule( recurrence.WEEKLY, byday=recurrence.MONDAY ) limits = Recurrence( # include_dtstart=True (default) rrules=[rule] ) assert limits.between(datetime(2015, 8, 2), datetime(2015, 8, 11), inc=True, dtstart=datetime(2015, 8, 2)) == [ datetime(2015, 8, 2, 0, 0), datetime(2015, 8, 3, 0, 0), datetime(2015, 8, 10, 0, 0)] assert limits.between(datetime(2015, 8, 2), datetime(2015, 8, 11), inc=False, dtstart=datetime(2015, 8, 2)) == [ datetime(2015, 8, 3, 0, 0), datetime(2015, 8, 10, 0, 0)] limits = Recurrence( # include_dtstart=False (dtstart is expected to not be included) include_dtstart=False, rrules=[rule] ) assert limits.between(datetime(2015, 8, 2), datetime(2015, 8, 11), inc=True, dtstart=datetime(2015, 8, 2)) == [ datetime(2015, 8, 3, 0, 0), datetime(2015, 8, 10, 0, 0)] assert limits.between(datetime(2015, 8, 2), datetime(2015, 8, 11), inc=False, dtstart=datetime(2015, 8, 2)) == [ datetime(2015, 8, 3, 0, 0), datetime(2015, 8, 10, 0, 0)] def test_none_fieldvalue(): field = RecurrenceField() value = None return_obj = field.clean(value) assert isinstance(return_obj, Recurrence) or return_obj is None ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/tests/test_magic_methods.py0000644000076500000240000000210700000000000021702 0ustar00aleksistafffrom datetime import datetime from recurrence import Recurrence, Rule import recurrence def test_truthiness_with_single_rrule(): rule = Rule( recurrence.DAILY ) object = Recurrence( rrules=[rule] ) assert bool(object) def test_truthiness_with_single_exrule(): rule = Rule( recurrence.DAILY ) object = Recurrence( exrules=[rule] ) assert bool(object) def test_truthiness_with_single_rdate(): object = Recurrence( rdates=[datetime(2014, 12, 31, 0, 0, 0)] ) assert bool(object) def test_truthiness_with_single_exdate(): object = Recurrence( exdates=[datetime(2014, 12, 31, 0, 0, 0)] ) assert bool(object) def test_truthiness_with_dtstart(): object = Recurrence( dtstart=datetime(2014, 12, 31, 0, 0, 0) ) assert bool(object) def test_truthiness_with_dtend(): object = Recurrence( dtend=datetime(2014, 12, 31, 0, 0, 0) ) assert bool(object) def test_falsiness_with_empty_recurrence_object(): assert not bool(Recurrence()) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642758238.0 django-recurrence-1.11.1/tests/test_managers_recurrence.py0000644000076500000240000001041200000000000023107 0ustar00aleksistafffrom datetime import datetime from django.utils.timezone import make_aware from recurrence import choices, deserialize from recurrence.models import Date, Recurrence, Rule import pytest import recurrence @pytest.mark.django_db def test_recurrence_to_recurrence_object(): limits = Recurrence.objects.create() Rule.objects.create( recurrence=limits, mode=choices.INCLUSION, freq=recurrence.WEEKLY ) object = limits.to_recurrence_object() assert [r.to_text() for r in object.rrules] == ['weekly'] assert object.exrules == [] assert object.rdates == [] assert object.exdates == [] @pytest.mark.django_db def test_recurrence_to_recurrence_object_complex(): limits = Recurrence.objects.create( dtstart=datetime(2014, 1, 1, 0, 0, 0), dtend=datetime(2014, 12, 31, 0, 0, 0), ) Rule.objects.create( recurrence=limits, mode=choices.INCLUSION, freq=recurrence.WEEKLY, until=make_aware(datetime(2014, 12, 31, 0, 0, 0)) ) Rule.objects.create( recurrence=limits, mode=choices.EXCLUSION, freq=recurrence.MONTHLY, until=make_aware(datetime(2013, 12, 31, 0, 0, 0)) ) Date.objects.create( recurrence=limits, mode=choices.INCLUSION, dt=make_aware(datetime(2012, 12, 31, 0, 0, 0)) ) Date.objects.create( recurrence=limits, mode=choices.EXCLUSION, dt=make_aware(datetime(2011, 12, 31, 0, 0, 0)) ) object = limits.to_recurrence_object() assert object.dtstart == make_aware(datetime(2014, 1, 1, 0, 0, 0)) assert object.dtend == make_aware(datetime(2014, 12, 31, 0, 0, 0)) assert len(object.rrules) == 1 output_rule = object.rrules[0] assert output_rule.freq == recurrence.WEEKLY assert output_rule.until == make_aware(datetime(2014, 12, 31, 0, 0, 0)) assert len(object.exrules) == 1 output_rule = object.exrules[0] assert output_rule.freq == recurrence.MONTHLY assert output_rule.until == make_aware(datetime(2013, 12, 31, 0, 0, 0)) @pytest.mark.django_db def test_recurrence_to_recurrence_object_non_naive_sd_ed(): limits = Recurrence.objects.create( dtstart=make_aware(datetime(2014, 1, 1, 0, 0, 0)), dtend=make_aware(datetime(2014, 12, 31, 0, 0, 0)), ) object = limits.to_recurrence_object() assert object.dtstart == make_aware(datetime(2014, 1, 1, 0, 0, 0)) assert object.dtend == make_aware(datetime(2014, 12, 31, 0, 0, 0)) @pytest.mark.django_db def test_create_from_recurrence_object(): inrule = recurrence.Rule( recurrence.WEEKLY ) exrule = recurrence.Rule( recurrence.MONTHLY ) limits = recurrence.Recurrence( dtstart=datetime(2014, 1, 1, 0, 0, 0), dtend=datetime(2014, 2, 3, 0, 0, 0), rrules=[inrule], exrules=[exrule], rdates=[datetime(2014, 2, 15, 0, 0, 0)], exdates=[make_aware(datetime(2014, 11, 29, 0, 0, 0))] ) object = Recurrence.objects.create_from_recurrence_object(limits) assert object.dtstart == make_aware(datetime(2014, 1, 1, 0, 0, 0)) assert object.dtend == make_aware(datetime(2014, 2, 3, 0, 0, 0)) rules = object.rules.all() assert len(rules) == 2 in_rules = [r for r in rules if r.mode == choices.INCLUSION] out_rules = [r for r in rules if r.mode == choices.EXCLUSION] assert len(in_rules) == 1 assert len(out_rules) == 1 assert in_rules[0].freq == recurrence.WEEKLY assert out_rules[0].freq == recurrence.MONTHLY dates = object.dates.all() assert len(dates) == 2 in_dates = [d for d in dates if d.mode == choices.INCLUSION] out_dates = [d for d in dates if d.mode == choices.EXCLUSION] assert len(in_dates) == 1 assert len(out_dates) == 1 assert in_dates[0].dt == make_aware(datetime(2014, 2, 15, 0, 0, 0)) assert out_dates[0].dt == make_aware(datetime(2014, 11, 29, 0, 0, 0)) @pytest.mark.django_db def test_deserialize_to_recurrence_regression(): """Regression test for checking weekday serialization works correctly: https://github.com/django-recurrence/django-recurrence/pull/176 """ obj = deserialize('DTSTART:20201015T000000\nRRULE:FREQ=WEEKLY;COUNT=30;INTERVAL=1;WKST=MO') Recurrence.objects.create_from_recurrence_object(obj) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642758229.0 django-recurrence-1.11.1/tests/test_managers_rule.py0000644000076500000240000000472600000000000021734 0ustar00aleksistafffrom datetime import datetime from dateutil import tz from django.utils.timezone import make_aware from recurrence import choices from recurrence.models import Param, Recurrence, Rule import pytest import recurrence @pytest.mark.django_db def test_create_from_rule_object(): limits = Recurrence.objects.create() rule = Rule.objects.create( recurrence=limits, mode=choices.INCLUSION, freq=recurrence.WEEKLY, until=make_aware(datetime(2014, 12, 31, 0, 0, 0), tz.UTC) ) object = Rule.objects.create_from_rule_object( choices.EXCLUSION, rule, limits ) assert rule.to_rule_object() == object.to_rule_object() assert rule.mode is True assert object.mode is False @pytest.mark.django_db def test_create_from_rule_object_byday(): limits = Recurrence.objects.create() rule = Rule.objects.create( recurrence=limits, mode=choices.INCLUSION, freq=recurrence.WEEKLY, until=make_aware(datetime(2014, 12, 31, 0, 0, 0), tz.UTC) ) Param.objects.create( rule=rule, param='byday', value=6, index=0 ) expected = 'RRULE:FREQ=WEEKLY;UNTIL=20141231T000000Z;BYDAY=SU' original = Rule.objects.to_rule_object(rule) serialized = recurrence.serialize(original) assert serialized == expected object = Rule.objects.create_from_rule_object( choices.INCLUSION, original, limits ) serialized = recurrence.serialize(object.to_rule_object()) assert serialized == expected @pytest.mark.django_db def test_create_from_rule_object_bymonth(): limits = Recurrence.objects.create() rule = Rule.objects.create( recurrence=limits, mode=choices.INCLUSION, freq=recurrence.WEEKLY, until=make_aware(datetime(2014, 12, 31, 0, 0, 0), tz.UTC) ) Param.objects.create( rule=rule, param='bymonth', value=6, index=0 ) Param.objects.create( rule=rule, param='bymonth', value=8, index=1 ) expected = 'RRULE:FREQ=WEEKLY;UNTIL=20141231T000000Z;BYMONTH=6,8' original = Rule.objects.to_rule_object(rule) serialized = recurrence.serialize(original) assert serialized == expected object = Rule.objects.create_from_rule_object( choices.INCLUSION, original, limits ) serialized = recurrence.serialize(object.to_rule_object()) assert serialized == expected ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/tests/test_nulls.py0000644000076500000240000000154200000000000020236 0ustar00aleksistafffrom django.db import IntegrityError from recurrence import Recurrence from tests.models import EventWithNulls, EventWithNoNulls import pytest @pytest.mark.django_db def test_recurs_can_be_explicitly_none_if_none_is_allowed(): # Check we can save None correctly event = EventWithNulls.objects.create(recurs=None) assert event.recurs is None # Check we can deserialize None correctly reloaded = EventWithNulls.objects.get(pk=event.pk) assert reloaded.recurs is None @pytest.mark.django_db def test_recurs_cannot_be_explicitly_none_if_none_is_disallowed(): with pytest.raises(IntegrityError): EventWithNoNulls.objects.create(recurs=None) @pytest.mark.django_db def test_recurs_can_be_empty_even_if_none_is_disallowed(): event = EventWithNoNulls.objects.create(recurs=Recurrence()) assert event.recurs == Recurrence() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/tests/test_occurrences.py0000644000076500000240000001200300000000000021406 0ustar00aleksistafffrom datetime import datetime from recurrence import Recurrence, Rule import recurrence RULE = Rule( recurrence.DAILY ) PATTERN = Recurrence( dtstart=datetime(2014, 1, 2, 0, 0, 0), dtend=datetime(2014, 1, 3, 0, 0, 0), rrules=[RULE] ) def test_occurrences_with_implicit_start_and_end(): occurrences = [ instance for instance in PATTERN.occurrences() ] assert occurrences == [ datetime(2014, 1, 2, 0, 0, 0), datetime(2014, 1, 3, 0, 0, 0), ] assert 2 == PATTERN.count() def test_occurrences_with_explicit_start(): occurrences = [ instance for instance in PATTERN.occurrences( dtstart=datetime(2014, 1, 1, 0, 0, 0), ) ] # If you specify dtstart, you get occurrences based on the rules # from the Recurrence object, which may be outside of the # Recurrence object's range. assert occurrences == [ datetime(2014, 1, 1, 0, 0, 0), datetime(2014, 1, 2, 0, 0, 0), datetime(2014, 1, 3, 0, 0, 0), ] assert 3 == PATTERN.count( dtstart=datetime(2014, 1, 1, 0, 0, 0), ) def test_occurrences_with_explicit_end(): occurrences = [ instance for instance in PATTERN.occurrences( dtend=datetime(2014, 1, 4, 0, 0, 0), ) ] # If you specify dtend, you get occurrences based on the rules # from the Recurrence object, which may be outside of the # Recurrence object's range. assert occurrences == [ datetime(2014, 1, 2, 0, 0, 0), datetime(2014, 1, 3, 0, 0, 0), datetime(2014, 1, 4, 0, 0, 0), ] assert 3 == PATTERN.count( dtend=datetime(2014, 1, 4, 0, 0, 0), ) def test_occurrences_with_explicit_start_and_end(): occurrences = [ instance for instance in PATTERN.occurrences( dtstart=datetime(2014, 1, 1, 0, 0, 0), dtend=datetime(2014, 1, 4, 0, 0, 0), ) ] # If you specify dtstart or dtend, you get occurrences based on # the rules from the Recurrence object, which may be outside of # the Recurrence object's range. assert occurrences == [ datetime(2014, 1, 1, 0, 0, 0), datetime(2014, 1, 2, 0, 0, 0), datetime(2014, 1, 3, 0, 0, 0), datetime(2014, 1, 4, 0, 0, 0), ] assert 4 == PATTERN.count( dtstart=datetime(2014, 1, 1, 0, 0, 0), dtend=datetime(2014, 1, 4, 0, 0, 0), ) def test_occurrences_with_specific_include_dates(): pattern = Recurrence( rdates=[ datetime(2014, 1, 1, 0, 0, 0), datetime(2014, 1, 2, 0, 0, 0), ] ) occurrences = [ instance for instance in pattern.occurrences( dtstart=datetime(2014, 1, 1, 0, 0, 0), dtend=datetime(2014, 1, 4, 0, 0, 0), ) ] assert occurrences == [ datetime(2014, 1, 1, 0, 0, 0), datetime(2014, 1, 2, 0, 0, 0), datetime(2014, 1, 4, 0, 0, 0), ] assert 3 == pattern.count( dtstart=datetime(2014, 1, 1, 0, 0, 0), dtend=datetime(2014, 1, 4, 0, 0, 0), ) all_occurrences = [ instance for instance in pattern.occurrences() ] assert all_occurrences == [ datetime(2014, 1, 1, 0, 0, 0), datetime(2014, 1, 2, 0, 0, 0), ] assert 2 == pattern.count() def test_occurrences_until(): rule = Rule( recurrence.DAILY, until=datetime(2014, 1, 3, 0, 0, 0) ) pattern = Recurrence( rrules=[ rule ] ) occurrences = [ instance for instance in pattern.occurrences( dtstart=datetime(2014, 1, 1, 0, 0, 0), dtend=datetime(2014, 1, 5, 0, 0, 0), ) ] assert occurrences == [ datetime(2014, 1, 1, 0, 0, 0), datetime(2014, 1, 2, 0, 0, 0), datetime(2014, 1, 3, 0, 0, 0), # We always get dtend, for reasons that aren't entirely clear datetime(2014, 1, 5, 0, 0, 0), ] assert 4 == pattern.count( dtstart=datetime(2014, 1, 1, 0, 0, 0), dtend=datetime(2014, 1, 5, 0, 0, 0), ) occurrences = [ instance for instance in pattern.occurrences( dtstart=datetime(2014, 1, 1, 0, 0, 0), dtend=datetime(2014, 1, 2, 0, 0, 0), ) ] assert occurrences == [ datetime(2014, 1, 1, 0, 0, 0), datetime(2014, 1, 2, 0, 0, 0), ] assert 2 == pattern.count( dtstart=datetime(2014, 1, 1, 0, 0, 0), dtend=datetime(2014, 1, 2, 0, 0, 0), ) def test_before(): assert PATTERN.before( datetime(2014, 1, 3, 0, 0, 0) ) == datetime(2014, 1, 2, 0, 0, 0) assert PATTERN.before( datetime(2014, 1, 3, 0, 0, 0), inc=True ) == datetime(2014, 1, 3, 0, 0, 0) def test_after(): assert PATTERN.after( datetime(2014, 1, 2, 0, 0, 0) ) == datetime(2014, 1, 3, 0, 0, 0) assert PATTERN.after( datetime(2014, 1, 2, 0, 0, 0), inc=True ) == datetime(2014, 1, 2, 0, 0, 0) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/tests/test_recurrences_without_limits.py0000644000076500000240000000734600000000000024575 0ustar00aleksistafffrom datetime import datetime from recurrence import Recurrence, Rule import recurrence RULE = Rule( recurrence.DAILY ) PATTERN = Recurrence( rrules=[RULE] ) def test_between_without_dtend_and_dtstart(): occurrences = [ instance for instance in PATTERN.between( datetime(2014, 1, 1, 0, 0, 0), datetime(2014, 1, 4, 0, 0, 0) ) ] # We get back nothing, since dtstart and dtend will have defaulted # to the current time, and January 2014 is in the past. assert occurrences == [] def test_between_with_dtend_and_dtstart_dtend_lower_than_end(): occurrences = [ instance for instance in PATTERN.between( datetime(2014, 1, 1, 0, 0, 0), datetime(2014, 1, 6, 0, 0, 0), dtstart=datetime(2014, 1, 1, 0, 0, 0), dtend=datetime(2014, 1, 4, 0, 0, 0), ) ] assert occurrences == [ datetime(2014, 1, 2, 0, 0, 0), datetime(2014, 1, 3, 0, 0, 0), datetime(2014, 1, 4, 0, 0, 0), ] def test_between_with_dtend_and_dtstart_dtend_higher_than_end(): occurrences = [ instance for instance in PATTERN.between( datetime(2014, 1, 1, 0, 0, 0), datetime(2014, 1, 6, 0, 0, 0), dtstart=datetime(2014, 1, 1, 0, 0, 0), dtend=datetime(2014, 1, 8, 0, 0, 0), ) ] assert occurrences == [ datetime(2014, 1, 2, 0, 0, 0), datetime(2014, 1, 3, 0, 0, 0), datetime(2014, 1, 4, 0, 0, 0), datetime(2014, 1, 5, 0, 0, 0), ] def test_between_with_dtend_and_dtstart_limits_equal_exclusive(): occurrences = [ instance for instance in PATTERN.between( datetime(2014, 1, 1, 0, 0, 0), datetime(2014, 1, 6, 0, 0, 0), dtstart=datetime(2014, 1, 2, 0, 0, 0), dtend=datetime(2014, 1, 6, 0, 0, 0), ) ] assert occurrences == [ datetime(2014, 1, 2, 0, 0, 0), datetime(2014, 1, 3, 0, 0, 0), datetime(2014, 1, 4, 0, 0, 0), datetime(2014, 1, 5, 0, 0, 0), ] def test_between_with_dtend_and_dtstart_limits_equal_inclusive(): occurrences = [ instance for instance in PATTERN.between( datetime(2014, 1, 1, 0, 0, 0), datetime(2014, 1, 6, 0, 0, 0), dtstart=datetime(2014, 1, 1, 0, 0, 0), dtend=datetime(2014, 1, 6, 0, 0, 0), inc=True ) ] assert occurrences == [ datetime(2014, 1, 1, 0, 0, 0), datetime(2014, 1, 2, 0, 0, 0), datetime(2014, 1, 3, 0, 0, 0), datetime(2014, 1, 4, 0, 0, 0), datetime(2014, 1, 5, 0, 0, 0), datetime(2014, 1, 6, 0, 0, 0), ] def test_between_with_dtend_and_dtstart_dtstart_lower_than_start(): occurrences = [ instance for instance in PATTERN.between( datetime(2014, 1, 2, 0, 0, 0), datetime(2014, 1, 6, 0, 0, 0), dtstart=datetime(2014, 1, 1, 0, 0, 0), dtend=datetime(2014, 1, 6, 0, 0, 0), ) ] assert occurrences == [ datetime(2014, 1, 3, 0, 0, 0), datetime(2014, 1, 4, 0, 0, 0), datetime(2014, 1, 5, 0, 0, 0), ] def test_between_with_dtend_and_dtstart_dtstart_higher_than_start(): occurrences = [ instance for instance in PATTERN.between( datetime(2014, 1, 1, 0, 0, 0), datetime(2014, 1, 6, 0, 0, 0), dtstart=datetime(2014, 1, 2, 0, 0, 0), dtend=datetime(2014, 1, 6, 0, 0, 0), ) ] assert occurrences == [ datetime(2014, 1, 2, 0, 0, 0), datetime(2014, 1, 3, 0, 0, 0), datetime(2014, 1, 4, 0, 0, 0), datetime(2014, 1, 5, 0, 0, 0), ] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/tests/test_saving.py0000644000076500000240000001213200000000000020365 0ustar00aleksistafffrom datetime import datetime from django.core.exceptions import ValidationError from recurrence import Recurrence, Rule from tests.models import EventWithNoNulls import pytest import recurrence @pytest.mark.django_db def test_recurrence_text_pattern_is_saved(): event = EventWithNoNulls.objects.create( recurs="RRULE:FREQ=WEEKLY;BYDAY=TU" ) assert len(event.recurs.rrules) == 1 assert event.recurs.rrules[0].to_text() == "weekly, each Tuesday" recurrence_info = event.recurs event = EventWithNoNulls.objects.get(pk=event.pk) assert recurrence_info == event.recurs @pytest.mark.django_db def test_recurrence_object_is_saved(): rule = Rule( recurrence.WEEKLY ) limits = Recurrence( dtstart=datetime(2014, 1, 1, 0, 0, 0), dtend=datetime(2014, 2, 3, 0, 0, 0), rrules=[rule] ) event = EventWithNoNulls.objects.create( recurs=limits ) instances = event.recurs.between( datetime(2010, 1, 1, 0, 0, 0), datetime(2020, 12, 31, 0, 0, 0) ) assert instances == [ datetime(2014, 1, 1, 0, 0), datetime(2014, 1, 8, 0, 0), datetime(2014, 1, 15, 0, 0), datetime(2014, 1, 22, 0, 0), datetime(2014, 1, 29, 0, 0), datetime(2014, 2, 3, 0, 0) # We always get dtend ] event = EventWithNoNulls.objects.get(pk=event.pk) assert event.recurs == limits assert event.recurs.between( datetime(2010, 1, 1, 0, 0, 0), datetime(2020, 12, 31, 0, 0, 0) ) == instances @pytest.mark.django_db @pytest.mark.parametrize('value', [ ' ', 'invalid', 'RRULE:', 'RRULE:FREQ=', 'RRULE:FREQ=invalid' ]) def test_recurrence_text_pattern_invalid(value): with pytest.raises(ValidationError): EventWithNoNulls.objects.create( recurs=value ) @pytest.mark.django_db def test_invalid_frequency_recurrence_object_raises(): with pytest.raises(ValidationError): EventWithNoNulls.objects.create( recurs=Recurrence( rrules=[Rule('fish')] ) ) with pytest.raises(ValidationError): EventWithNoNulls.objects.create( recurs=Recurrence( rrules=[Rule(42)] ) ) @pytest.mark.django_db def test_invalid_interval_recurrence_object_raises(): with pytest.raises(ValidationError): EventWithNoNulls.objects.create( recurs=Recurrence( rrules=[Rule(recurrence.DAILY, interval=0)] ) ) with pytest.raises(ValidationError): EventWithNoNulls.objects.create( recurs=Recurrence( rrules=[Rule(recurrence.DAILY, interval='cat')] ) ) @pytest.mark.django_db def test_invalid_wkst_recurrence_object_raises(): with pytest.raises(ValidationError): EventWithNoNulls.objects.create( recurs=Recurrence( rrules=[Rule(recurrence.DAILY, wkst=17)] ) ) @pytest.mark.django_db def test_invalid_until_recurrence_object_raises(): with pytest.raises(ValidationError): EventWithNoNulls.objects.create( recurs=Recurrence( rrules=[Rule(recurrence.DAILY, until=17)] ) ) @pytest.mark.django_db def test_invalid_count_recurrence_object_raises(): with pytest.raises(ValidationError): EventWithNoNulls.objects.create( recurs=Recurrence( rrules=[Rule(recurrence.DAILY, count='fish')] ) ) @pytest.mark.django_db def test_invalid_byday_recurrence_object_raises(): with pytest.raises(ValidationError): EventWithNoNulls.objects.create( recurs=Recurrence( rrules=[Rule(recurrence.DAILY, byday='house')] ) ) @pytest.mark.django_db def test_invalid_bymonth_too_high_recurrence_object_raises(): with pytest.raises(ValidationError): EventWithNoNulls.objects.create( recurs=Recurrence( rrules=[Rule(recurrence.DAILY, bymonth=[1, 32])] ) ) @pytest.mark.django_db def test_invalid_bymonth_toolow_recurrence_object_raises(): with pytest.raises(ValidationError): EventWithNoNulls.objects.create( recurs=Recurrence( rrules=[Rule(recurrence.DAILY, bymonth=[0, ])] ) ) @pytest.mark.django_db def test_invalid_exclusion_interval_recurrence_object_raises(): with pytest.raises(ValidationError): EventWithNoNulls.objects.create( recurs=Recurrence( exrules=[Rule(recurrence.DAILY, interval=0)] ) ) @pytest.mark.django_db def test_invalid_date_recurrence_object_raises(): with pytest.raises(ValidationError): EventWithNoNulls.objects.create( recurs=Recurrence( rdates=["fish"] ) ) @pytest.mark.django_db def test_invalid_exclusion_date_recurrence_object_raises(): with pytest.raises(ValidationError): EventWithNoNulls.objects.create( recurs=Recurrence( exdates=["fish"] ) ) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642758196.0 django-recurrence-1.11.1/tests/test_serialization.py0000644000076500000240000000611500000000000021757 0ustar00aleksistafffrom datetime import datetime from recurrence import Recurrence, Rule from recurrence.exceptions import DeserializationError import pytest import recurrence def test_rule_serialization(): rule = Rule( recurrence.WEEKLY ) serialized = recurrence.serialize(rule) assert 'RRULE:FREQ=WEEKLY' == serialized assert recurrence.deserialize(serialized) == Recurrence(rrules=[rule]) def test_no_equal_sign(): with pytest.raises(DeserializationError): recurrence.deserialize('RRULE:A') def test_no_value(): with pytest.raises(DeserializationError): recurrence.deserialize('RRULE:A=') def test_unknown_key(): with pytest.raises(DeserializationError): recurrence.deserialize('RRULE:A=X') def test_bad_freq(): with pytest.raises(DeserializationError): recurrence.deserialize('RRULE:FREQ=X') def test_bad_interval(): with pytest.raises(DeserializationError): recurrence.deserialize('RRULE:INTERVAL=X') def test_bad_wkst(): with pytest.raises(DeserializationError): recurrence.deserialize('RRULE:WKST=X') def test_bad_count(): with pytest.raises(DeserializationError): recurrence.deserialize('RRULE:COUNT=X') def test_bad_byday(): with pytest.raises(DeserializationError): recurrence.deserialize('RRULE:BYDAY=X') def test_bad_BYMONTH(): with pytest.raises(DeserializationError): recurrence.deserialize('RRULE:BYMONTH=X') def test_complex_rule_serialization(): rule = Rule( recurrence.WEEKLY, interval=17, wkst=1, count=7, byday=[ recurrence.to_weekday('-1MO'), recurrence.to_weekday('TU') ], bymonth=[1, 3] ) serialized = recurrence.serialize(rule) assert ('RRULE:FREQ=WEEKLY;INTERVAL=17;WKST=TU;' 'COUNT=7;BYDAY=-1MO,TU;BYMONTH=1,3') == serialized assert recurrence.deserialize(serialized) == Recurrence(rrules=[rule]) def test_complex_rule_serialization_with_weekday_instance(): rule = Rule( recurrence.WEEKLY, interval=17, wkst=recurrence.to_weekday(1), count=7, byday=[ recurrence.to_weekday('-1MO'), recurrence.to_weekday('TU') ], bymonth=[1, 3] ) serialized = recurrence.serialize(rule) assert ('RRULE:FREQ=WEEKLY;INTERVAL=17;WKST=TU;' 'COUNT=7;BYDAY=-1MO,TU;BYMONTH=1,3') == serialized assert recurrence.deserialize(serialized) == Recurrence(rrules=[rule]) def test_bug_in_count_and_until_rule_serialization(): # This tests a bug in the way we serialize rules with instance # counts and an until date. We should really raise a # ValidationError in validate if you specify both, but we # currently don't. Once we start doing this, this test can be # modified to check an exception is raised. rule = Rule( recurrence.WEEKLY, count=7, until=datetime(2014, 10, 31, 0, 0, 0) ) serialized = recurrence.serialize(rule) # Note that we've got no UNTIL value here assert 'RRULE:FREQ=WEEKLY;COUNT=7' == serialized ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/tests/test_settings.py0000644000076500000240000000234000000000000020736 0ustar00aleksistaff""" Test settings for django recurrence. DESERIALIZE_TZ determines if a datetime serialized as rfc2445 text is returned as a naive datetime or a datetime with timezone. If the he django setting RECURRENCE_USE_TZ is true then a timezone aware datetime is returned If the he django setting RECURRENCE_USE_TZ is false then a naive datetime is returned If this setting is not present the setting USE_TZ is used as a default. """ from django.conf import settings from django.test import TestCase from django.test import override_settings from recurrence import settings as r_settings class TestTimezoneSettings(TestCase): @override_settings(RECURRENCE_USE_TZ=True, USE_TZ=False) def test_recurrence_tz_true(self): assert r_settings.deserialize_tz() @override_settings(RECURRENCE_USE_TZ=False, USE_TZ=True) def test_recurrence_tz_false(self): assert not r_settings.deserialize_tz() @override_settings(USE_TZ=True) def test_fallback_to_use_tz_true(self): del settings.RECURRENCE_USE_TZ assert r_settings.deserialize_tz() @override_settings(USE_TZ=False) def test_fallback_to_use_tz_false(self): del settings.RECURRENCE_USE_TZ assert not r_settings.deserialize_tz() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/tests/test_to_text.py0000644000076500000240000000214300000000000020565 0ustar00aleksistafffrom recurrence import Rule import recurrence def test_rule_to_text_simple(): assert Rule( recurrence.WEEKLY ).to_text() == 'weekly' def test_rule_to_text_interval(): assert Rule( recurrence.WEEKLY, interval=3 ).to_text() == 'every 3 weeks' def test_rule_to_text_oneoff(): assert Rule( recurrence.WEEKLY, count=1 ).to_text() == 'weekly, occuring once' def test_rule_to_text_multiple(): assert Rule( recurrence.WEEKLY, count=5 ).to_text() == 'weekly, occuring 5 times' def test_rule_to_text_yearly_bymonth(): assert Rule( recurrence.YEARLY, bymonth=[1, 3], ).to_text() == 'annually, each January, March' assert Rule( recurrence.YEARLY, bymonth=[1, 3], ).to_text(True) == 'annually, each Jan, Mar' def test_rule_to_text_yearly_byday(): assert Rule( recurrence.YEARLY, byday=[1, 3], ).to_text() == 'annually, on the Tuesday, Thursday' assert Rule( recurrence.YEARLY, byday=[1, 3], ).to_text(True) == 'annually, on the Tue, Thu' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/tests/test_to_weekday.py0000644000076500000240000000251100000000000021231 0ustar00aleksistafffrom dateutil.rrule import weekday import pytest import recurrence def test_to_weekday_from_weekday(): day = recurrence.Weekday(4) assert recurrence.to_weekday(day) == day def test_to_weekday_from_dateutil_weekday(): day = weekday(1) assert recurrence.to_weekday(day) == recurrence.Weekday(1) def test_to_weekday_from_int(): assert recurrence.to_weekday(1) == recurrence.Weekday(1) with pytest.raises(ValueError): recurrence.to_weekday(7) def test_to_weekday_from_nonelike(): with pytest.raises(ValueError): recurrence.to_weekday(None) with pytest.raises(ValueError): recurrence.to_weekday("") def test_to_weekday_from_string(): assert recurrence.to_weekday("3") == recurrence.Weekday(3) with pytest.raises(ValueError): recurrence.to_weekday("7") assert recurrence.to_weekday("MO") == recurrence.Weekday(0) assert recurrence.to_weekday("mo") == recurrence.Weekday(0) assert recurrence.to_weekday("TU") == recurrence.Weekday(1) assert recurrence.to_weekday("Tu") == recurrence.Weekday(1) with pytest.raises(ValueError): recurrence.to_weekday("FOO") assert recurrence.to_weekday("-2TU") == recurrence.Weekday(1, -2) # We don't do any validation of the index assert recurrence.to_weekday("-7SU") == recurrence.Weekday(6, -7) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642758229.0 django-recurrence-1.11.1/tests/test_tz.py0000644000076500000240000001624500000000000017544 0ustar00aleksistaff"""Test timezone aware recurrence date times.""" from datetime import datetime from dateutil import tz from django.test import TestCase from django.test import override_settings import recurrence from recurrence import Recurrence, Rule from recurrence.forms import RecurrenceField from tests.models import EventWithNoNulls @override_settings(RECURRENCE_USE_TZ=True, USE_TZ=True) class FieldTest(TestCase): def test_strip_dtstart_and_dtend_if_required(self): """Test that naive datetimes will get converted to UTC and returned as UTC.""" rule = Rule( recurrence.WEEKLY ) limits = Recurrence( dtstart=datetime(2014, 1, 1, 0, 0, 0), dtend=datetime(2014, 2, 3, 0, 0, 0), rrules=[rule] ) value = recurrence.serialize(limits) field = RecurrenceField() cleaned_value = field.clean(value) assert cleaned_value.rrules == [rule] assert cleaned_value.dtstart == datetime(2014, 1, 1, 0, 0, 0, tzinfo=tz.UTC) assert cleaned_value.dtend == datetime(2014, 2, 3, 0, 0, 0, tzinfo=tz.UTC) field = RecurrenceField(accept_dtstart=False, accept_dtend=False) cleaned_value = field.clean(value) assert cleaned_value != limits assert cleaned_value.dtstart is None assert cleaned_value.dtend is None def test_dt_start_and_dtend_converts_to_utc(self): """Convert the values for dtstart and dtend to UTC.""" tz_adak = tz.gettz('America/Adak') limits = Recurrence( dtstart=datetime(2014, 1, 1, 0, 0, 0, tzinfo=tz_adak), dtend=datetime(2014, 2, 3, 0, 0, 0, tzinfo=tz_adak), ) value = recurrence.serialize(limits) field = RecurrenceField(required=False) cleaned_value = field.clean(value) assert cleaned_value.dtstart == datetime(2014, 1, 1, 0, 0, 0, tzinfo=tz_adak).astimezone(tz.UTC) assert cleaned_value.dtend == datetime(2014, 2, 3, 0, 0, 0, tzinfo=tz_adak).astimezone(tz.UTC) assert cleaned_value.dtstart.tzname() == 'UTC' assert cleaned_value.dtend.tzname() == 'UTC' def test_naive_rdates_converted_to_utc(self): limits = Recurrence( rdates=[ datetime(2014, 1, 1, 0, 0, 0), datetime(2014, 1, 2, 0, 0, 0), ], ) value = recurrence.serialize(limits) field = RecurrenceField() cleaned_value = field.clean(value) assert cleaned_value.rdates == [ datetime(2014, 1, 1, 0, 0, 0, tzinfo=tz.UTC), datetime(2014, 1, 2, 0, 0, 0, tzinfo=tz.UTC), ] for rdate in cleaned_value.rdates: assert rdate.tzname() == 'UTC' def test_aware_rdates_converted_to_utc(self): tz_adak = tz.gettz('America/Adak') limits = Recurrence( rdates=[ datetime(2014, 1, 1, 0, 0, 0, tzinfo=tz_adak), datetime(2014, 1, 2, 0, 0, 0, tzinfo=tz_adak), ], ) value = recurrence.serialize(limits) field = RecurrenceField() cleaned_value = field.clean(value) assert cleaned_value.rdates == [ datetime(2014, 1, 1, 0, 0, 0, tzinfo=tz_adak).astimezone(tz.UTC), datetime(2014, 1, 2, 0, 0, 0, tzinfo=tz_adak).astimezone(tz.UTC), ] for rdate in cleaned_value.rdates: assert rdate.tzname() == 'UTC' def test_naive_exdates_converted_to_utc(self): limits = Recurrence( exdates=[ datetime(2014, 1, 1, 0, 0, 0), datetime(2014, 1, 2, 0, 0, 0), ], ) value = recurrence.serialize(limits) field = RecurrenceField() cleaned_value = field.clean(value) assert cleaned_value.exdates == [ datetime(2014, 1, 1, 0, 0, 0, tzinfo=tz.UTC), datetime(2014, 1, 2, 0, 0, 0, tzinfo=tz.UTC), ] for rdate in cleaned_value.exdates: assert rdate.tzname() == 'UTC' def test_aware_exdates_converted_to_utc(self): tz_adak = tz.gettz('America/Adak') limits = Recurrence( exdates=[ datetime(2014, 1, 1, 0, 0, 0, tzinfo=tz_adak), datetime(2014, 1, 2, 0, 0, 0, tzinfo=tz_adak), ], ) value = recurrence.serialize(limits) field = RecurrenceField() cleaned_value = field.clean(value) assert cleaned_value.exdates == [ datetime(2014, 1, 1, 0, 0, 0, tzinfo=tz_adak).astimezone(tz.UTC), datetime(2014, 1, 2, 0, 0, 0, tzinfo=tz_adak).astimezone(tz.UTC), ] for rdate in cleaned_value.exdates: assert rdate.tzname() == 'UTC' def test_naive_until_gets_converted_to_utc(self): recurs = Recurrence( rrules=[Rule( recurrence.DAILY, until=datetime(2014, 1, 1, 0, 0, 0)) ], ) value = recurrence.serialize(recurs) field = RecurrenceField() cleaned_value = field.clean(value) assert cleaned_value.rrules[0].until == datetime(2014, 1, 1, 0, 0, 0, tzinfo=tz.UTC) def test_aware_until_gets_converted_to_utc(self): tz_adak = tz.gettz('America/Adak') until = datetime(2014, 1, 1, 0, 0, 0, tzinfo=tz_adak) recurs = Recurrence( rrules=[Rule( recurrence.DAILY, until=until) ], ) value = recurrence.serialize(recurs) field = RecurrenceField() cleaned_value = field.clean(value) assert cleaned_value.rrules[0].until == until.astimezone(tz.UTC) @override_settings(RECURRENCE_USE_TZ=True, USE_TZ=True) class SaveTest(TestCase): def test_recurrence_object_is_saved(self): """Test that naive datetimes will get converted to UTC and returned as UTC""" rule = Rule( recurrence.WEEKLY ) limits = Recurrence( dtstart=datetime(2014, 1, 1, 0, 0, 0), dtend=datetime(2014, 2, 3, 0, 0, 0), rrules=[rule] ) event = EventWithNoNulls.objects.create( recurs=limits ) event.refresh_from_db() instances = event.recurs.between( datetime(2010, 1, 1, 0, 0, 0, tzinfo=tz.UTC), datetime(2020, 12, 31, 0, 0, 0, tzinfo=tz.UTC) ) assert instances == [ datetime(2014, 1, 1, 0, 0, tzinfo=tz.UTC), datetime(2014, 1, 8, 0, 0, tzinfo=tz.UTC), datetime(2014, 1, 15, 0, 0, tzinfo=tz.UTC), datetime(2014, 1, 22, 0, 0, tzinfo=tz.UTC), datetime(2014, 1, 29, 0, 0, tzinfo=tz.UTC), datetime(2014, 2, 3, 0, 0, tzinfo=tz.UTC) # We always get dtend ] event = EventWithNoNulls.objects.get(pk=event.pk) expected_limits = Recurrence( dtstart=datetime(2014, 1, 1, 0, 0, 0, tzinfo=tz.UTC), dtend=datetime(2014, 2, 3, 0, 0, 0, tzinfo=tz.UTC), rrules=[rule] ) assert event.recurs == expected_limits assert event.recurs.between( datetime(2010, 1, 1, 0, 0, 0, tzinfo=tz.UTC), datetime(2020, 12, 31, 0, 0, 0, tzinfo=tz.UTC) ) == instances ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642408050.0 django-recurrence-1.11.1/tests/test_weekday.py0000644000076500000240000000104600000000000020531 0ustar00aleksistaffimport pytest from recurrence import Weekday def test_init(): assert repr(Weekday(3)) == 'TH' assert repr(Weekday(3, -2)) == '-2TH' assert repr(Weekday(3, 3)) == '3TH' with pytest.raises(ValueError): Weekday(8) with pytest.raises(ValueError): Weekday('fish') def test_call(): # I'm not sure why this functionality is useful, but this is what # calling a weekday currently does. day = Weekday(4, -3) assert day(2) == Weekday(4, 2) assert day(-3) is day assert day(None) == Weekday(4) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1642758229.0 django-recurrence-1.11.1/tox.ini0000644000076500000240000000172600000000000015645 0ustar00aleksistaff[tox] envlist = py37-djdocs py37-djqa py{37,38,39,310,py38}-dj22 py{37,38,39,310,py38}-dj32 py{38,39,310,py38}-dj40 py{38,39,310,py38}-djmain [gh-actions] python = 3.7: py37 3.8: py38 3.9: py39 3.10: py310 pypy-3.8: pypy38 [gh-actions:env] DJANGO = docs: djdocs qa: djqa 2.2: dj22 3.2: dj32 4.0: dj40 main: djmain [testenv] usedevelop = true setenv = PYTHONDONTWRITEBYTECODE=1 deps = -r requirements.txt dj22: django>=2.2,<2.3 dj32: django>=3.2,<3.3 dj40: django>=4.0,<4.1 djmain: https://github.com/django/django/archive/main.tar.gz commands = pytest [testenv:py37-djqa] basepython = python3.7 ignore_errors = true deps = -r requirements.txt commands = flake8 recurrence flake8 setup.py flake8 tests [testenv:py37-djdocs] basepython = python3.7 changedir = docs deps = -r requirements.txt commands = sphinx-build -W -b html -d {envtmpdir}/doctrees . {envtmpdir}/html [flake8] ignore = E122,E125,E129,E501,W503,W504