diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 00000000..9100ecde --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,40 @@ +name: Probleem melden / Bug report +description: Meldt een probleem om ons te helpen verbeteren / Create a report to help us improve +title: "Title here" +labels: ["bug", "triage"] +assignees: [] +body: + - type: input + id: product-version + attributes: + label: Product versie / Product version + description: Welke versie gebruikt u? / Which version do you use? + placeholder: "1.1.0" + validations: + required: true + - type: textarea + id: what-happened + attributes: + label: Omschrijf het probleem / Describe the bug + description: Een duidelijke omschrijving van het probleem (de "bug") / A clear and concise description of what the bug is. + validations: + required: true + - type: textarea + id: steps-to-reproduce + attributes: + label: Stappen om te reproduceren / Steps to reproduce + description: Stappen die leiden tot het probleem / Steps to reproduce the behavior + placeholder: | + 1. Go to '...' + 2. Click on '....' + 3. Scroll down to '....' + 4. See error + validations: + required: false + - type: textarea + id: expected-behaviour + attributes: + label: Verwacht gedrag / Expected behavior + description: Een duidelijke omschrijving van wat de verwachting is / A clear and concise description of what you expected to happen. + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 00000000..b269ba46 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,8 @@ +blank_issues_enabled: true +contact_links: + # - name: Meldt een veiligheidsprobleem / Report a security vulnerability + # url: https://github.com/maykinmedia/open-klant/security/policy + # about: Bekijk ons beveiligingsbeleid voor meer informatie / Please review our security policy for more details + - name: Ondersteuning met prioriteit / Priority support + url: https://opengem.nl/contact/ + about: Neem direct contact met ons op / Contact us directly to get priority support. diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 00000000..5bd683dd --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,27 @@ +name: Verzoek tot verbetering / Feature request +description: Stel een idee voor om het project beter te maken / Suggest an idea for this project +title: "Title here" +labels: ["enhancement", "triage"] +assignees: [] +body: + - type: textarea + id: description + attributes: + label: Omschrijving / Description + description: Omschrijf duidelijk het idee of de behoefte, eventueel aangevuld met een bepaalde oplossingsrichting / Clearly describe the idea or need, possibly supplemented with a specific solution direction + validations: + required: true + - type: textarea + id: added-value + attributes: + label: Added value / Toegevoegde waarde + description: Omschrijf de toegevoegde waarde voor de bedrijfsvoering of dienstverlening / Describe the added value for business operations or services + validations: + required: false + - type: textarea + id: remarks + attributes: + label: Aanvullende opmerkingen / Additional context + description: Voeg aanvullingen of mockups toe voor deze verbetering / Add any other context or screenshots about the feature request + validations: + required: false diff --git a/.readthedocs.yaml b/.readthedocs.yaml new file mode 100644 index 00000000..5a9e60fe --- /dev/null +++ b/.readthedocs.yaml @@ -0,0 +1,22 @@ +# .readthedocs.yaml +# Read the Docs configuration file +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +version: 2 + +sphinx: + configuration: docs/conf.py + +build: + os: 'ubuntu-20.04' + apt_packages: + - libxml2-dev + - libxmlsec1-dev + - libxmlsec1-openssl + - wget + tools: + python: '3.10' + +python: + install: + - requirements: requirements/ci.txt \ No newline at end of file diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 00000000..71e82fd7 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,26 @@ +The Open Klant project was initiated by Municipality of The Hague to store +a minimal set of data and metadata about clients and conversations with +clients, in compliance with privacy and security regulations. + +Open Klant is a registration component to re-use client data within the whole +municipality, following with the Common Ground principles. + +Here is an inevitably incomplete list of MUCH-APPRECIATED CONTRIBUTORS -- +people who laid the groundwork, have submitted patches, reported bugs, added +translations, helped answer questions, and generally made Open Forms that much +better: + + Steven Bal + Alex de Landgraaf + Nathanael Gey + Bart van der Schoor + ErhanCitil + Joeri Bekker + Bart Burgmans + +A big THANK YOU goes to: + + All municipalities who participated and risked implementing an API + specification that was not yet finalized by VNG. + + All people behind Common Ground for their enthusiasm and vision. diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 712c5319..c6673045 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -2,10 +2,46 @@ Change history ============== +0.6.0 +===== + +*tbd* + + +*VNG officially retired the Klanten and Contactmomenten API, which never had an +official release. These API's are replaced by the Klantinteractie API. In +cooperation with several municipalities and VNG, Open Klant will implement the +new API specification and might introduce backwards incompatible changes. Since +Open Klant never had an official 1.0 release, we will continue versioning on +the 0.x.x-scheme.* + +0.5.0-pre +========= + +*August 5, 2023* + +* [#51] Showing version & git hash on the home page + +0.3.0-pre +========= + +*July 24, 2023* + +* [#50] Added Notificatie API support + +0.2.0-pre +========= + +*June 14, 2023* + +* [#46] Fixed CI code-quality issues +* [#45] Updated docs and URLs to use new Github location +* [#44] Updated project dependencies +* [#48] Add missing auth to URLValidator for klantcontactmoment 0.1.0 -===== +========= -** +*February 13, 2023* * Initial release. diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..472c57ac --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,73 @@ +# Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to make participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or + advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies within all project spaces, and it also applies when +an individual is representing the project or its community in public spaces. +Examples of representing a project or community include using an official +project e-mail address, posting via an official social media account, or acting +as an appointed representative at an online or offline event. Representation of +a project may be further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at `helpdesk@maykinmedia.nl`. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..eacf629d --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,98 @@ +# Contribution guidelines + +If you want to contribute, we ask you to follow these guidelines. + +## Reporting bugs + +If you have encountered a bug in this project, please check if an issue already +exists in the list of existing [issues][issues]. If such an issue does not +exist, you can create a [new issue][new_issue]. When writing the bug report, +try to add a clear example that shows how to reproduce said bug. + +## Adding new features + +Before making making changes to the code, we advise you to first check the list +of existing [issues][issues] for this project to see if an issue for the +suggested changes already exists. If such an issue does not exist, you can +create a [new issue][new_issue]. Creating an issue gives an opportunity for +other developers to give tips even before you start coding. + +### Code style + +To keep the code clean and readable, this project uses: + +- [`isort`](https://github.com/timothycrosley/isort) to order the imports +- [`black`](https://github.com/psf/black) to format the code and keep diffs for + pull requests small +- [`flake8`](https://github.com/PyCQA/flake8) to clean up code (removing unused + imports, etc.) + +Whenever a branch is pushed or a pull request is made, the code will be checked +in CI by the tools mentioned above, so make sure to install these tools and run +them locally before pushing branches/making pull requests. + +This project aims to meet the criteria of the +[Standard for Public Code][Standard_for_Public_Code]. Please make sure that +your pull requests are compliant, that will make the reviews quicker. + +### Forking the repository + +In order to implement changes to this project when you do not have rights for +this [repository][repository], you must first fork the repository. Once the +repository is forked, you can clone it to your local machine. + +### Making the changes + +On your local machine, create a new branch, and name it like: +- `feature/some-new-feature`, if the changes implement a new feature +- `issue/some-issue`, if the changes fix an issue + +Once you have made changes or additions to the code, you can commit them (try +to keep the commit message descriptive but short). If an issue already exists +in the list of existing [issues][issues] for the changes you made, be sure to +format your commit message like +`:gitmoji: Fixes # -- description of changes made`, where +`` corresponds to the number of the issue on GitHub. To demonstrate +that the changes implement the new feature/fix the issue, make sure to also add +tests to the existing Django testsuite. + +#### Refactoring + +You can refactor existing code as part of any issue. For example when fixing a +bug or extending an existing feature. The refactored code should be about the +issue though. Please document in the commit why you refactored the code. +The part of the refactored code should typically be a separate commit before +the commit that tackles the actual issue, so they can be reviewed separately. + +#### Small textual changes + +For small textual changes like fixing incorrect spelling, hyperlinks, outdated +information, code documentation, etc. you don't need to create an issue. Simply +create a Pull Request (see below) that does the update. + +### Making a pull request + +If all changes have been committed, you can push the branch to your fork of the +repository and create a pull request to the `master` branch of this project's +repository. Your pull request will be reviewed, if applicable, feedback will be +given and if everything is approved, it will be merged. + +Pull requests should always be made to the `master` branch, even if they are +bugfixes for any of the `stable/*` branches. If they are relevant for older +versions, please add the *needs-backport* label to the pull request and/or +issue. Release managers will then ensure the fix also lands in the supported +older versions. + +### Reviews on releases + +Open Klant community support is provided by [Maykin][Maykin]. +The community support team is responsible for reviewing all pull requests +before they are merged to a release branch. + + +[issues]: https://github.com/maykinmedia/open-klant/issues +[new_issue]: https://github.com/maykinmedia/open-klant/issues/new/choose +[mailinglist]: t.b.d. +[Standard_for_Public_Code]: https://standard.publiccode.net +[repository]: https://github.com/maykinmedia/open-klant +[Maykin]: https://www.maykinmedia.nl diff --git a/INSTALL.rst b/INSTALL.rst index dbf7260b..4265a7f8 100644 --- a/INSTALL.rst +++ b/INSTALL.rst @@ -18,9 +18,9 @@ Prerequisites You need the following libraries and/or programs: -* `Python`_ 3.6 or above +* `Python`_ 3.11 or above * Python `Virtualenv`_ and `Pip`_ -* `PostgreSQL`_ 10 or above +* `PostgreSQL`_ 11 or above * `Node.js`_ * `npm`_ @@ -47,10 +47,7 @@ development machine. $ git clone git@github.com:maykinmedia/open-klant.git $ cd open-klant -3. Install all required (backend) libraries. - **Tip:** You can use the ``bootstrap.py`` script to install the requiments - and set the proper settings in ``manage.py``. Or, perform the steps - manually: +3. Install all required (backend) libraries: .. code-block:: bash diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 00000000..58225d62 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,308 @@ +# Licence + +Copyright © Maykin, 2023 + +Licensed under the EUPL + +**Table of Contents** + +- [Licence](#licence) + - [EUPL text in English](#eupl-text-in-english) + - [EUPL text in Dutch](#eupl-text-in-dutch) + +## EUPL text in English + +``` +EUROPEAN UNION PUBLIC LICENCE v. 1.2 +EUPL © the European Union 2007, 2016 + +This European Union Public Licence (the ‘EUPL’) applies to the Work (as defined below) which is provided under the +terms of this Licence. Any use of the Work, other than as authorised under this Licence is prohibited (to the extent such +use is covered by a right of the copyright holder of the Work). +The Work is provided under the terms of this Licence when the Licensor (as defined below) has placed the following +notice immediately following the copyright notice for the Work: + Licensed under the EUPL +or has expressed by any other means his willingness to license under the EUPL. + +1.Definitions +In this Licence, the following terms have the following meaning: +— ‘The Licence’:this Licence. +— ‘The Original Work’:the work or software distributed or communicated by the Licensor under this Licence, available +as Source Code and also as Executable Code as the case may be. +— ‘Derivative Works’:the works or software that could be created by the Licensee, based upon the Original Work or +modifications thereof. This Licence does not define the extent of modification or dependence on the Original Work +required in order to classify a work as a Derivative Work; this extent is determined by copyright law applicable in +the country mentioned in Article 15. +— ‘The Work’:the Original Work or its Derivative Works. +— ‘The Source Code’:the human-readable form of the Work which is the most convenient for people to study and +modify. +— ‘The Executable Code’:any code which has generally been compiled and which is meant to be interpreted by +a computer as a program. +— ‘The Licensor’:the natural or legal person that distributes or communicates the Work under the Licence. +— ‘Contributor(s)’:any natural or legal person who modifies the Work under the Licence, or otherwise contributes to +the creation of a Derivative Work. +— ‘The Licensee’ or ‘You’:any natural or legal person who makes any usage of the Work under the terms of the +Licence. +— ‘Distribution’ or ‘Communication’:any act of selling, giving, lending, renting, distributing, communicating, +transmitting, or otherwise making available, online or offline, copies of the Work or providing access to its essential +functionalities at the disposal of any other natural or legal person. + +2.Scope of the rights granted by the Licence +The Licensor hereby grants You a worldwide, royalty-free, non-exclusive, sublicensable licence to do the following, for +the duration of copyright vested in the Original Work: +— use the Work in any circumstance and for all usage, +— reproduce the Work, +— modify the Work, and make Derivative Works based upon the Work, +— communicate to the public, including the right to make available or display the Work or copies thereof to the public +and perform publicly, as the case may be, the Work, +— distribute the Work or copies thereof, +— lend and rent the Work or copies thereof, +— sublicense rights in the Work or copies thereof. +Those rights can be exercised on any media, supports and formats, whether now known or later invented, as far as the +applicable law permits so. +In the countries where moral rights apply, the Licensor waives his right to exercise his moral right to the extent allowed +by law in order to make effective the licence of the economic rights here above listed. +The Licensor grants to the Licensee royalty-free, non-exclusive usage rights to any patents held by the Licensor, to the +extent necessary to make use of the rights granted on the Work under this Licence. + +3.Communication of the Source Code +The Licensor may provide the Work either in its Source Code form, or as Executable Code. If the Work is provided as +Executable Code, the Licensor provides in addition a machine-readable copy of the Source Code of the Work along with +each copy of the Work that the Licensor distributes or indicates, in a notice following the copyright notice attached to +the Work, a repository where the Source Code is easily and freely accessible for as long as the Licensor continues to +distribute or communicate the Work. + +4.Limitations on copyright +Nothing in this Licence is intended to deprive the Licensee of the benefits from any exception or limitation to the +exclusive rights of the rights owners in the Work, of the exhaustion of those rights or of other applicable limitations +thereto. + +5.Obligations of the Licensee +The grant of the rights mentioned above is subject to some restrictions and obligations imposed on the Licensee. Those +obligations are the following: + +Attribution right: The Licensee shall keep intact all copyright, patent or trademarks notices and all notices that refer to +the Licence and to the disclaimer of warranties. The Licensee must include a copy of such notices and a copy of the +Licence with every copy of the Work he/she distributes or communicates. The Licensee must cause any Derivative Work +to carry prominent notices stating that the Work has been modified and the date of modification. + +Copyleft clause: If the Licensee distributes or communicates copies of the Original Works or Derivative Works, this +Distribution or Communication will be done under the terms of this Licence or of a later version of this Licence unless +the Original Work is expressly distributed only under this version of the Licence — for example by communicating +‘EUPL v. 1.2 only’. The Licensee (becoming Licensor) cannot offer or impose any additional terms or conditions on the +Work or Derivative Work that alter or restrict the terms of the Licence. + +Compatibility clause: If the Licensee Distributes or Communicates Derivative Works or copies thereof based upon both +the Work and another work licensed under a Compatible Licence, this Distribution or Communication can be done +under the terms of this Compatible Licence. For the sake of this clause, ‘Compatible Licence’ refers to the licences listed +in the appendix attached to this Licence. Should the Licensee's obligations under the Compatible Licence conflict with +his/her obligations under this Licence, the obligations of the Compatible Licence shall prevail. + +Provision of Source Code: When distributing or communicating copies of the Work, the Licensee will provide +a machine-readable copy of the Source Code or indicate a repository where this Source will be easily and freely available +for as long as the Licensee continues to distribute or communicate the Work. +Legal Protection: This Licence does not grant permission to use the trade names, trademarks, service marks, or names +of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and +reproducing the content of the copyright notice. + +6.Chain of Authorship +The original Licensor warrants that the copyright in the Original Work granted hereunder is owned by him/her or +licensed to him/her and that he/she has the power and authority to grant the Licence. +Each Contributor warrants that the copyright in the modifications he/she brings to the Work are owned by him/her or +licensed to him/her and that he/she has the power and authority to grant the Licence. +Each time You accept the Licence, the original Licensor and subsequent Contributors grant You a licence to their contributions +to the Work, under the terms of this Licence. + +7.Disclaimer of Warranty +The Work is a work in progress, which is continuously improved by numerous Contributors. It is not a finished work +and may therefore contain defects or ‘bugs’ inherent to this type of development. +For the above reason, the Work is provided under the Licence on an ‘as is’ basis and without warranties of any kind +concerning the Work, including without limitation merchantability, fitness for a particular purpose, absence of defects or +errors, accuracy, non-infringement of intellectual property rights other than copyright as stated in Article 6 of this +Licence. +This disclaimer of warranty is an essential part of the Licence and a condition for the grant of any rights to the Work. + +8.Disclaimer of Liability +Except in the cases of wilful misconduct or damages directly caused to natural persons, the Licensor will in no event be +liable for any direct or indirect, material or moral, damages of any kind, arising out of the Licence or of the use of the +Work, including without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, loss +of data or any commercial damage, even if the Licensor has been advised of the possibility of such damage. However, +the Licensor will be liable under statutory product liability laws as far such laws apply to the Work. + +9.Additional agreements +While distributing the Work, You may choose to conclude an additional agreement, defining obligations or services +consistent with this Licence. However, if accepting obligations, You may act only on your own behalf and on your sole +responsibility, not on behalf of the original Licensor or any other Contributor, and only if You agree to indemnify, +defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against such Contributor by +the fact You have accepted any warranty or additional liability. + +10.Acceptance of the Licence +The provisions of this Licence can be accepted by clicking on an icon ‘I agree’ placed under the bottom of a window +displaying the text of this Licence or by affirming consent in any other similar way, in accordance with the rules of +applicable law. Clicking on that icon indicates your clear and irrevocable acceptance of this Licence and all of its terms +and conditions. +Similarly, you irrevocably accept this Licence and all of its terms and conditions by exercising any rights granted to You +by Article 2 of this Licence, such as the use of the Work, the creation by You of a Derivative Work or the Distribution +or Communication by You of the Work or copies thereof. + +11.Information to the public +In case of any Distribution or Communication of the Work by means of electronic communication by You (for example, +by offering to download the Work from a remote location) the distribution channel or media (for example, a website) +must at least provide to the public the information requested by the applicable law regarding the Licensor, the Licence +and the way it may be accessible, concluded, stored and reproduced by the Licensee. + +12.Termination of the Licence +The Licence and the rights granted hereunder will terminate automatically upon any breach by the Licensee of the terms +of the Licence. +Such a termination will not terminate the licences of any person who has received the Work from the Licensee under +the Licence, provided such persons remain in full compliance with the Licence. + +13.Miscellaneous +Without prejudice of Article 9 above, the Licence represents the complete agreement between the Parties as to the +Work. +If any provision of the Licence is invalid or unenforceable under applicable law, this will not affect the validity or +enforceability of the Licence as a whole. Such provision will be construed or reformed so as necessary to make it valid +and enforceable. +The European Commission may publish other linguistic versions or new versions of this Licence or updated versions of +the Appendix, so far this is required and reasonable, without reducing the scope of the rights granted by the Licence. +New versions of the Licence will be published with a unique version number. +All linguistic versions of this Licence, approved by the European Commission, have identical value. Parties can take +advantage of the linguistic version of their choice. + +14.Jurisdiction +Without prejudice to specific agreement between parties, +— any litigation resulting from the interpretation of this License, arising between the European Union institutions, +bodies, offices or agencies, as a Licensor, and any Licensee, will be subject to the jurisdiction of the Court of Justice +of the European Union, as laid down in article 272 of the Treaty on the Functioning of the European Union, +— any litigation arising between other parties and resulting from the interpretation of this License, will be subject to +the exclusive jurisdiction of the competent court where the Licensor resides or conducts its primary business. + +15.Applicable Law +Without prejudice to specific agreement between parties, +— this Licence shall be governed by the law of the European Union Member State where the Licensor has his seat, +resides or has his registered office, +— this licence shall be governed by Belgian law if the Licensor has no seat, residence or registered office inside +a European Union Member State. + + + Appendix + +‘Compatible Licences’ according to Article 5 EUPL are: +— GNU General Public License (GPL) v. 2, v. 3 +— GNU Affero General Public License (AGPL) v. 3 +— Open Software License (OSL) v. 2.1, v. 3.0 +— Eclipse Public License (EPL) v. 1.0 +— CeCILL v. 2.0, v. 2.1 +— Mozilla Public Licence (MPL) v. 2 +— GNU Lesser General Public Licence (LGPL) v. 2.1, v. 3 +— Creative Commons Attribution-ShareAlike v. 3.0 Unported (CC BY-SA 3.0) for works other than software +— European Union Public Licence (EUPL) v. 1.1, v. 1.2 +— Québec Free and Open-Source Licence — Reciprocity (LiLiQ-R) or Strong Reciprocity (LiLiQ-R+). + +The European Commission may update this Appendix to later versions of the above licences without producing +a new version of the EUPL, as long as they provide the rights granted in Article 2 of this Licence and protect the +covered Source Code from exclusive appropriation. +All other changes or additions to this Appendix require the production of a new EUPL version. +``` + +## EUPL text in Dutch + +``` +OPENBARE LICENTIE VAN DE EUROPESE UNIE v. 1.2. +EUPL © Europese Unie 2007, 2016 +Deze openbare licentie van de Europese Unie („EUPL”) is van toepassing op het werk (zoals hieronder gedefinieerd) dat onder de voorwaarden van deze licentie wordt verstrekt. Elk gebruik van het werk dat niet door deze licentie is toegestaan, is verboden (voor zover dit gebruik valt onder een recht van de houder van het auteursrecht op het werk). Het werk wordt verstrekt onder de voorwaarden van deze licentie wanneer de licentiegever (zoals hieronder gedefinieerd), direct volgend op de kennisgeving inzake het auteursrecht op het werk, de volgende kennisgeving opneemt: + In licentie gegeven krachtens de EUPL +of op een andere wijze zijn bereidheid te kennen heeft gegeven krachtens de EUPL in licentie te geven. + +1.Definities +In deze licentie wordt verstaan onder: +— „de licentie”:de onderhavige licentie; +— „het oorspronkelijke werk”:het werk dat of de software die door de licentiegever krachtens deze licentie wordt verspreid of medegedeeld, en dat/die beschikbaar is als broncode en, in voorkomend geval, ook als uitvoerbare code; +— „bewerkingen”:de werken of software die de licentiehouder kan creëren op grond van het oorspronkelijke werk of wijzigingen ervan. In deze licentie wordt niet gedefinieerd welke mate van wijziging of afhankelijkheid van het oorspronkelijke werk vereist is om een werk als een bewerking te kunnen aanmerken; dat wordt bepaald conform het auteursrecht dat van toepassing is in de in artikel 15 bedoelde staat; +— „het werk”:het oorspronkelijke werk of de bewerkingen ervan; +— „de broncode”:de voor mensen leesbare vorm van het werk, die het gemakkelijkste door mensen kan worden bestudeerd en gewijzigd; +— „de uitvoerbare code”:elke code die over het algemeen is gecompileerd en is bedoeld om door een computer als een programma te worden uitgevoerd; +— „de licentiegever”:de natuurlijke of rechtspersoon die het werk krachtens de licentie verspreidt of mededeelt; +— „bewerker(s)”:elke natuurlijke of rechtspersoon die het werk krachtens de licentie wijzigt of op een andere wijze bijdraagt tot de totstandkoming van een bewerking; +— „de licentiehouder” of „u”:elke natuurlijke of rechtspersoon die het werk onder de voorwaarden van de licentie gebruikt; — „verspreiding” of „mededeling”:het verkopen, geven, uitlenen, verhuren, verspreiden, mededelen, doorgeven, of op een andere wijze online of offline beschikbaar stellen van kopieën van het werk of het verlenen van toegang tot de essentiële functies ervan ten behoeve van andere natuurlijke of rechtspersonen. + +2.Draagwijdte van de uit hoofde van de licentie verleende rechten +De licentiegever verleent u hierbij een wereldwijde, royaltyvrije, niet-exclusieve, voor een sublicentie in aanmerking komende licentie, om voor de duur van het aan het oorspronkelijke werk verbonden auteursrecht, het volgende te doen: +— het werk in alle omstandigheden en voor ongeacht welk doel te gebruiken; +— het werk te verveelvoudigen; +— het werk te wijzigen en op grond van het werk bewerkingen te ontwikkelen; +— het werk aan het publiek mede te delen, waaronder het recht om het werk of kopieën ervan aan het publiek ter beschikking te stellen of te vertonen, en het werk, in voorkomend geval, in het openbaar uit te voeren; +— het werk of kopieën ervan te verspreiden; +— het werk of kopieën ervan uit te lenen en te verhuren; +— de rechten op het werk of op kopieën ervan in sublicentie te geven. +Deze rechten kunnen worden uitgeoefend met gebruikmaking van alle thans bekende of nog uit te vinden media, dragers en formaten, voor zover het toepasselijke recht dit toestaat. In de landen waar immateriële rechten van toepassing zijn, doet de licentiegever afstand van zijn recht op uitoefening van zijn immateriële rechten in de mate die door het toepasselijke recht wordt toegestaan teneinde een doeltreffende uitoefening van de bovenvermelde in licentie gegeven economische rechten mogelijk te maken. De licentiegever verleent de licentiehouder een royaltyvrij, niet-exclusief gebruiksrecht op alle octrooien van de licentiegever, voor zover dit noodzakelijk is om de uit hoofde van deze licentie verleende rechten op het werk te gebruiken. + +3.Mededeling van de broncode +De licentiegever kan het werk verstrekken in zijn broncode of als uitvoerbare code. Indien het werk als uitvoerbare code wordt verstrekt, verstrekt de licentiegever bij elke door hem verspreide kopie van het werk tevens een machinaal leesbare kopie van de broncode van het werk of geeft hij in een mededeling, volgende op de bij het werk gevoegde auteursrechtelijke kennisgeving, de plaats aan waar de broncode gemakkelijk en vrij toegankelijk is, zolang de licentiegever het werk blijft verspreiden of mededelen. + +4.Beperkingen van het auteursrecht +Geen enkele bepaling in deze licentie heeft ten doel de licentiehouder het recht te ontnemen een beroep te doen op een uitzondering op of een beperking van de exclusieve rechten van de rechthebbenden op het werk, of op de uitputting van die rechten of andere toepasselijke beperkingen daarvan. + +5.Verplichtingen van de licentiehouder +De verlening van de bovenvermelde rechten is onderworpen aan een aantal aan de licentiehouder opgelegde beperkingen en verplichtingen. Het gaat om de onderstaande verplichtingen. + +Attributierecht: de licentiehouder moet alle auteurs-, octrooi- of merkenrechtelijke kennisgevingen onverlet laten alsook alle kennisgevingen die naar de licentie en de afwijzing van garanties verwijzen. De licentiehouder moet een afschrift van deze kennisgevingen en een afschrift van de licentie bij elke kopie van het werk voegen die hij verspreidt of mededeelt. De licentiehouder moet in elke bewerking duidelijk aangeven dat het werk is gewijzigd, en eveneens de datum van wijziging vermelden. + +Copyleftclausule: wanneer de licentiehouder kopieën van het oorspronkelijke werk of bewerkingen verspreidt of mededeelt, geschiedt die verspreiding of mededeling onder de voorwaarden van deze licentie of van een latere versie van deze licentie, tenzij het oorspronkelijke werk uitdrukkelijk alleen onder deze versie van de licentie wordt verspreid — bijvoorbeeld door de mededeling „alleen EUPL v. 1.2”. De licentiehouder (die licentiegever wordt) kan met betrekking tot het werk of de bewerkingen geen aanvullende bepalingen of voorwaarden opleggen of stellen die de voorwaarden van de licentie wijzigen of beperken. + +Verenigbaarheidsclausule: wanneer de licentiehouder bewerkingen of kopieën ervan verspreidt of mededeelt die zijn gebaseerd op het werk en op een ander werk dat uit hoofde van een verenigbare licentie in licentie is gegeven, kan die verspreiding of mededeling geschieden onder de voorwaarden van deze verenigbare licentie. Voor de toepassing van deze clausule wordt onder „verenigbare licentie” verstaan, de licenties die in het aanhangsel bij deze licentie zijn opgesomd. Indien de verplichtingen van de licentiehouder uit hoofde van de verenigbare licentie in strijd zijn met diens verplichtingen uit hoofde van deze licentie, hebben de verplichtingen van de verenigbare licentie voorrang. + +Verstrekking van de broncode: bij de verspreiding of mededeling van kopieën van het werk verstrekt de licentiehouder een machinaal leesbare kopie van de broncode of geeft hij aan waar deze broncode gemakkelijk en vrij toegankelijk is, zolang de licentiehouder het werk blijft verspreiden of mededelen. + +Juridische bescherming: deze licentie verleent geen toestemming om handelsnamen, handelsmerken, dienstmerken of namen van de licentiegever te gebruiken, behalve wanneer dit op grond van een redelijk en normaal gebruik noodzakelijk is om de oorsprong van het werk te beschrijven en de inhoud van de auteursrechtelijke kennisgeving te herhalen. + +6.Auteursketen +De oorspronkelijke licentiegever garandeert dat hij houder is van het hierbij verleende auteursrecht op het oorspronkelijke werk dan wel dat dit hem in licentie is gegeven en dat hij de bevoegdheid heeft de licentie te verlenen. Elke bewerker garandeert dat hij houder is van het auteursrecht op de door hem aan het werk aangebrachte wijzigingen dan wel dat dit hem in licentie is gegeven en dat hij de bevoegdheid heeft de licentie te verlenen. Telkens wanneer u de licentie aanvaardt, verlenen de oorspronkelijke licentiegever en de opeenvolgende bewerkers u een licentie op hun bijdragen aan het werk onder de voorwaarden van deze licentie. + +7.Uitsluiting van garantie +Het werk is een werk in ontwikkeling, dat voortdurend door vele bewerkers wordt verbeterd. Het is een onvoltooid werk, dat bijgevolg nog tekortkomingen of programmeerfouten („bugs”) kan vertonen, die onlosmakelijk verbonden zijn met dit soort ontwikkeling. Om die reden wordt het werk op grond van de licentie verstrekt „zoals het is” en zonder enige garantie met betrekking tot het werk te geven, met inbegrip van, maar niet beperkt tot garanties met betrekking tot de verhandelbaarheid, de geschiktheid voor een specifiek doel, de afwezigheid van tekortkomingen of fouten, de nauwkeurigheid, de eerbiediging van andere intellectuele-eigendomsrechten dan het in artikel 6 van deze licentie bedoelde auteursrecht. Deze uitsluiting van garantie is een essentieel onderdeel van de licentie en een voorwaarde voor de verlening van rechten op het werk. + +8.Uitsluiting van aansprakelijkheid +Behoudens in het geval van een opzettelijke fout of directe schade aan natuurlijke personen, is de licentiegever in geen enkel geval aansprakelijk voor ongeacht welke directe of indirecte, materiële of immateriële schade die voortvloeit uit de licentie of het gebruik van het werk, met inbegrip van, maar niet beperkt tot schade als gevolg van het verlies van goodwill, verloren werkuren, een computerdefect of computerfout, het verlies van gegevens, of enige andere commerciële schade, zelfs indien de licentiegever werd gewezen op de mogelijkheid van dergelijke schade. De licentiegever is echter aansprakelijk op grond van de wetgeving inzake productaansprakelijkheid, voor zover deze wetgeving op het werk van toepassing is. + +9.Aanvullende overeenkomsten +Bij de verspreiding van het werk kunt u ervoor kiezen een aanvullende overeenkomst te sluiten, waarin de verplichtingen of diensten overeenkomstig deze licentie worden omschreven. Indien deze verplichtingen worden aanvaard, kunt u echter alleen in eigen naam en onder eigen verantwoordelijkheid handelen, en dus niet in naam van de oorspronkelijke licentiegever of een bewerker, en kunt u voorts alleen handelen indien u ermee instemt alle bewerkers schadeloos te stellen, te verdedigen of te vrijwaren met betrekking tot de aansprakelijkheid van of vorderingen tegen deze bewerkers op grond van het feit dat u een garantie of aanvullende aansprakelijkheid hebt aanvaard. + +10.Aanvaarding van de licentie +De bepalingen van deze licentie kunnen worden aanvaard door te klikken op het pictogram „Ik ga akkoord”, dat zich bevindt onderaan het venster waarin de tekst van deze licentie is weergegeven, of door overeenkomstig de toepasselijke wetsbepalingen op een soortgelijke wijze met de licentie in te stemmen. Door op dat pictogram te klikken geeft u aan dat u deze licentie en alle voorwaarden ervan ondubbelzinnig en onherroepelijk aanvaardt. Evenzo aanvaardt u onherroepelijk deze licentie en alle voorwaarden ervan door uitoefening van de rechten die u in artikel 2 van deze licentie zijn verleend, zoals het gebruik van het werk, het creëren door u van een bewerking of de verspreiding of mededeling door u van het werk of kopieën ervan. + +11.Voorlichting van het publiek +Indien u het werk verspreidt of mededeelt door middel van elektronische communicatiemiddelen (bijvoorbeeld door voor te stellen het werk op afstand te downloaden), moet het distributiekanaal of het medium (bijvoorbeeld een website) het publiek ten minste de gegevens verschaffen die door het toepasselijke recht zijn voorgeschreven met betrekking tot de licentiegever, de licentie en de wijze waarop deze kan worden geraadpleegd, gesloten, opgeslagen en gereproduceerd door de licentiehouder. + +12.Einde van de licentie +De licentie en de uit hoofde daarvan verleende rechten eindigen automatisch bij elke inbreuk door de licentiehouder op de voorwaarden van de licentie. Dit einde beëindigt niet de licenties van personen die het werk van de licentiehouder krachtens de licentie hebben ontvangen, mits deze personen zich volledig aan de licentie houden. + +13.Overige +Onverminderd artikel 9 vormt de licentie de gehele overeenkomst tussen de partijen met betrekking tot het werk. Indien een bepaling van de licentie volgens het toepasselijke recht ongeldig is of niet uitvoerbaar is, doet dit geen afbreuk aan de geldigheid of uitvoerbaarheid van de licentie in haar geheel. Deze bepaling dient zodanig te worden uitgelegd of gewijzigd dat zij geldig en uitvoerbaar wordt. De Europese Commissie kan, voor zover dit noodzakelijk en redelijk is, versies in andere talen of nieuwe versies van deze licentie of geactualiseerde versies van dit aanhangsel publiceren, zonder de draagwijdte van de uit hoofde van de licentie verleende rechten te beperken. Nieuwe versies van de licentie zullen worden gepubliceerd met een uniek versienummer. Alle door de Europese Commissie goedgekeurde taalversies van deze licentie hebben dezelfde waarde. De partijen kunnen zich beroepen op de taalversie van hun keuze. + +14.Bevoegd gerecht +Onverminderd specifieke overeenkomsten tussen de partijen, +— vallen alle geschillen tussen de instellingen, organen en instanties van de Europese Unie, als licentiegeefster, en een licentiehouder in verband met de uitlegging van deze licentie onder de bevoegdheid van het Hof van Justitie van de Europese Unie, conform artikel 272 van het Verdrag betreffende de werking van de Europese Unie, +— vallen alle geschillen tussen andere partijen in verband met de uitlegging van deze licentie onder de uitsluitende bevoegdheid van het bevoegde gerecht van de plaats waar de licentiegever is gevestigd of zijn voornaamste activiteit uitoefent. + +15.Toepasselijk recht +Onverminderd specifieke overeenkomsten tussen de partijen, +— wordt deze licentie beheerst door het recht van de lidstaat van de Europese Unie waar de licentiegever zijn statutaire zetel, verblijfplaats of hoofdkantoor heeft, +— wordt deze licentie beheerst door het Belgische recht indien de licentiegever geen statutaire zetel, verblijfplaats of hoofdkantoor heeft in een lidstaat van de Europese Unie. + + +Aanhangsel +„Verenigbare licenties” in de zin van artikel 5 EUPL zijn: +— GNU General Public License (GPL) v. 2, v. 3 +— GNU Affero General Public License (AGPL) v. 3 +— Open Software License (OSL) v. 2.1, v. 3.0 +— Eclipse Public License (EPL) v. 1.0 +— CeCILL v. 2.0, v. 2.1 +— Mozilla Public Licence (MPL) v. 2 +— GNU Lesser General Public Licence (LGPL) v. 2.1, v. 3 +— Creative Commons Attribution-ShareAlike v. 3.0 Unported (CC BY-SA 3.0) voor andere werken dan software +— European Union Public Licence (EUPL) v. 1.1, v. 1.2 +— Québec Free and Open-Source Licence — Reciprocity (LiLiQ-R) of Strong Reciprocity (LiLiQ-R+). +De Europese Commissie kan dit aanhangsel actualiseren in geval van latere versies van de bovengenoemde licenties zonder dat er een nieuwe EUPL-versie wordt ontwikkeld, zolang die versies de uit hoofde van artikel 2 van deze licentie verleende rechten verlenen en ze de betrokken broncode beschermen tegen exclusieve toe-eigening. +Voor alle andere wijzigingen van of aanvullingen op dit aanhangsel is de ontwikkeling van een nieuwe EUPL-versie vereist. +``` diff --git a/README.rst b/README.rst index df7b6b2b..5b9915a1 100644 --- a/README.rst +++ b/README.rst @@ -2,60 +2,141 @@ Open Klant ========== -:Version: 0.1.0 +:Version: 0.5.0-pre :Source: https://github.com/maykinmedia/open-klant -:Keywords: ``klanten``, ``contactmomenten``, ``API``, ``Common Ground`` +:Keywords: klanten, klantinteracties, contactmomenten, api, common ground :License: EUPL -:PythonVersion: 3.11 |build-status| |requirements| -Project dat de `Klanten API` | https://klanten-api.vng.cloud en `Contactmomenten API` | https://contactmomenten-api.vng.cloud/ in een enkel component combineert. +Registratiecomponent voor de opslag en ontsluiting van klantgegevens volgens de +Klantinteracties API-specificatie. (`English version`_) -Ontwikkeld door `Maykin Media B.V.`_ voor de gemeente Den Haag +Ontwikkeld door `Maykin B.V.`_ in opdracht van de gemeente Den Haag. Introductie -============ +=========== -Open Klant biedt de volgende APIs aan: +Open Klant implementeert de (concept) `Klantinteracties API`_ specificatie van +`VNG`_ welke een beperkte set aan gegevens over klanten en hun interactie met +de gemeente kan opslaan en ontsluiten. - * Klanten API - * Contactmomenten API +Samen met gemeenten, die volop bezig zijn met de implementatie van Common +Ground, en VNG, wordt gewerkt aan standaardisatie van de API en realisatie van +Open Klant als beproeving van de toekomstige API standaard. -Deze APIs zijn door de VNG grotendeels gestandaardiseerd in het kader van de Zaakgericht Werken APIs, echter zijn niet opgenomen in de definitieve ZGW API scope ( https://vng.nl/projecten/zaakgericht-werken-api ) en zijn dus aangrenzende APIs die naast de ZGW APIs kunnen worden ingezet. -Doel en functionaliteiten +API specificatie +================ + +|lint-oas| |generate-sdks| |generate-postman-collection| + +============== ============== ============================= +Versie Release datum API specificatie +============== ============== ============================= +latest n/a t.b.d. + +0.5-pre 2023-08-05 Klanten: + `ReDoc `_, + `Swagger `_ + Contactmomenten: + `ReDoc `_, + `Swagger `_ +============== ============== ============================= + +Vorige versies worden nog 6 maanden ondersteund nadat de volgende versie is +uitgebracht. Versie 0.5-pre bevat nog de Klanten en Contactmomenten +API-specificatie die door VNG is geschrapt en beschouwd moet worden als legacy. + +Zie: `Alle versies en wijzigingen `_ + + +Ready-to-go implementatie ========================= -Doel van Open Klant is het bieden van 1 centrale registratieplaats van klantgegevens (inwoner/bedrijf) en contactmomenten van een gemeente. Hiermee worden verdubbelingen qua registratie voorkomen en kan er vanuit andere applicaties inzicht gegeven in welke berichten naar welke klanten zijn gestuurd. +|build-status| |coverage| |black| |docker| |python-versions| -Open Klant heeft vergeleken met de referentiecomponenten een aantal uitbreidingen gekregen, zoals het inloggen via SSO/OIDC en integratie met Open Notificaties. +Deze implementatie is bedoeld als referentie implementatie van de API +specificaties maar tevens een productiewaardig component dat ingezet kan worden +in het gemeentelijke ICT landschap. -Open Klant biedt momenteel nog geen automatische BRP (Haal Centraal) integratie: de aanroepende applicaties zijn verantwoordelijk voor het invoeren en waar nodig bijwerken van de klantgegevens. +Quickstart +---------- -Open Klant biedt momenteel geen eigen klantnotificatie functionaliteit: de Contactmomenten API is voor het registreren door een vakapplicatie van bijvoorbeeld een emailbericht wat naar een bepaalde klant is gestuurd. +1. Download en start Open Klant: -Open Klant biedt momenteel geen integratie met Open Zaak. Een aanroepende applicatie is verantwoordelijk voor het leggen van de juiste verwijzingen in Open Zaak naar de Open Klant APIs en het onderhouden van de verwijzingen. + .. code:: bash -Relatie met de VNG Klanten API en Contactmomenten API -===================================================== + $ wget https://raw.githubusercontent.com/maykinmedia/open-klant/master/docker-compose-quickstart.yml -O docker-compose.yml + $ docker-compose -f docker-compose-qs.yml up -d + $ docker-compose exec web src/manage.py loaddata demodata + $ docker-compose exec web src/manage.py createsuperuser -Open Klant is een 'friendly fork' van beide referentiecomponenten. De API is op enkele punten uitgebreid met additionele velden, die expliciet als 'AFWIJKING' zijn gemarkeerd in de OAS. Bij de inzet van Open Klant wordt zoveel mogelijk vastgehouden aan de specificatie en werking van de VNG APIs. +2. In de browser, navigeer naar ``http://localhost:8000/`` om de beheerinterface + en de API te benaderen. -Ondersteuning en ontwikkeling -============================= -Dit component wordt momenteel alleen ingezet en doorontwikkeld voor gemeente Den Haag. Inzet door derden is conform de licentie toegestaan echter as-is en zonder ondersteuning, voor vragen over doorontwikkelingen en/of een supportovereenkomst kan contact opgenomen worden met Maykin. Beantwoording van issues in Github wordt overgelaten aan de community. +Links +===== -Documentatie -============= +* `Documentatie `_ +* `Docker image `_ +* `Issues `_ +* `Code `_ +* `Community `_ -See ``INSTALL.rst`` for installation instructions, available settings and -commands. +Licentie +======== -References -========== +Copyright © Maykin B.V., 2023 + +Licensed under the EUPL_ + + +.. _`English version`: README.EN.rst + +.. _`Maykin B.V.`: https://www.maykinmedia.nl + +.. _`Klantinteracties API`: https://vng-realisatie.github.io/klantinteracties/ + +.. _`VNG`: https://vng.nl/ + +.. _`EUPL`: LICENSE.md + +.. |build-status| image:: https://github.com/maykinmedia/open-klant/workflows/ci/badge.svg?branch=master + :alt: Build status + :target: https://github.com/maykinmedia/open-klant/actions?query=workflow%3Aci + +.. |docs| image:: https://readthedocs.org/projects/objects-and-objecttypes-api/badge/?version=latest + :target: https://objects-and-objecttypes-api.readthedocs.io/ + :alt: Documentation Status + +.. |coverage| image:: https://codecov.io/github/maykinmedia/open-klant/branch/master/graphs/badge.svg?branch=master + :alt: Coverage + :target: https://codecov.io/gh/maykinmedia/open-klant + +.. |black| image:: https://img.shields.io/badge/code%20style-black-000000.svg + :alt: Code style + :target: https://github.com/psf/black + +.. |docker| image:: https://images.microbadger.com/badges/image/maykinmedia/open-klant.svg + :alt: Docker image + :target: https://hub.docker.com/r/maykinmedia/open-klant + +.. |python-versions| image:: https://img.shields.io/badge/python-3.7%2B-blue.svg + :alt: Supported Python version + +.. |lint-oas| image:: https://github.com/maykinmedia/open-klant/workflows/lint-oas/badge.svg + :alt: Lint OAS + :target: https://github.com/maykinmedia/open-klant/actions?query=workflow%3Alint-oas + +.. |generate-sdks| image:: https://github.com/maykinmedia/open-klant/workflows/generate-sdks/badge.svg + :alt: Generate SDKs + :target: https://github.com/maykinmedia/open-klant/actions?query=workflow%3Agenerate-sdks + +.. |generate-postman-collection| image:: https://github.com/maykinmedia/open-klant/workflows/generate-postman-collection/badge.svg + :alt: Generate Postman collection + :target: https://github.com/maykinmedia/open-klant/actions?query=workflow%3Agenerate-postman-collection -.. _Maykin Media B.V.: https://www.maykinmedia.nl diff --git a/SECURITY.rst b/SECURITY.rst new file mode 100644 index 00000000..168780a6 --- /dev/null +++ b/SECURITY.rst @@ -0,0 +1,66 @@ +.. _security: + +Security policy +=============== + +The development team is strongly committed to responsible reporting and +disclosure of security-related issues. As such, we've adopted and follow a set +of policies which conform to that ideal and are geared toward allowing us to +deliver timely security updates to the official distribution of Open Klant. + +Reporting security issues +------------------------- + +**Short version: please report security issues by emailing +security@maykinmedia.nl.** + +If you discover security issues in Open Klant or related projects under the +same organization, we request you to disclose these in a *responsible* way by +mailing to security@maykinmedia.nl. + +It is extremely useful if you have a reproducible test case and/or clear steps +on how to reproduce the vulnerability. + +Please do not report security issues on the public Github issue tracker, as +this makes it visible which exploits exist before a fix is available, +potentially comprising a lot of unprotected instances. + +Once you've submitted an issue via email, you should receive an acknowledgment +from a member of the security team as soon as possible, and depending on the +action to be taken, you may receive further followup emails. + +Timeline of the process +----------------------- + +Open Klant community support is provided by `Maykin`_. The community +support team is responsible for the handling of security issues. + +1. The recipients of the report first validate if there is indeed a (possible) + issue. + +2. After validation, we confirm that we received the report and if it is indeed + a valid issue. + +3. We have a private Github repository accessible only to the community support + team. In this repository, an issue is created for the vulnerability where + the impact and possible solutions are discussed. + +4. The next step is to create a (draft) Github security advisory, which is only + visible to the repository administrators and community support team. + Severity and impact will be established here. + +5. If appropriate, we request a `CVE identifier`_ from Github. + +6. A patch is implemented, reviewed and tested in a private fork. + +7. When the fix is tested and release coordination is done, the fix is merged + into the primary repository. The security advisory and release are + published. All managed instances should be updated. + +8. The release and security vulnerability are communicated to the community. + This includes an announcement on `commonground.nl`_. + + +.. _`CVE identifier`: https://cve.mitre.org/cve/identifiers/ +.. _`commonground.nl`: https://commonground.nl +.. _`Maykin`: https://www.maykinmedia.nl \ No newline at end of file diff --git a/bin/bumpversion.sh b/bin/bumpversion.sh new file mode 100644 index 00000000..40fcb6aa --- /dev/null +++ b/bin/bumpversion.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash +# +# Script to bump the version. Arguments are forwarded to bumpversion. +# +# Usage: +# +# ./bin/bumpversion.sh minor|patch|pre|build +# + +set -eu -o pipefail + +toplevel=$(git rev-parse --show-toplevel) +cd $toplevel + +# Ensure a virtualenv is active. +if [ -z $VIRTUAL_ENV ]; then + echo "VIRTUAL_ENV envvar is not set, you must activate your virtualenv before running this script." + exit 1 +fi + +# Forward all arguments to bumpversion binary +bumpversion "$@" + +# Run npm install to update the package-lock.json version number +npm i \ No newline at end of file diff --git a/bin/compile_dependencies.bat b/bin/compile_dependencies.bat deleted file mode 100644 index 2f525669..00000000 --- a/bin/compile_dependencies.bat +++ /dev/null @@ -1,33 +0,0 @@ -@echo off - -for /F "tokens=1" %%i in ('git rev-parse --show-toplevel') do set toplevel=%%i - -cd %toplevel% - -REM we are echo'ing the Linux variant here, simply because we have more Linux users -set CUSTOM_COMPILE_COMMAND="./bin/compile_dependencies.sh" - -REM Base deps -pip-compile^ - --no-emit-index-url^ - --resolver=backtracking^ - %*^ - requirements/base.in - -REM Dependencies for testing -pip-compile^ - --no-emit-index-url^ - --resolver=backtracking^ - --output-file requirements/ci.txt^ - %*^ - requirements/base.txt^ - requirements/test-tools.in - -REM Dev depedencies - exact same set as CI + some extra tooling -pip-compile^ - --no-emit-index-url^ - --resolver=backtracking^ - --output-file requirements/dev.txt^ - %*^ - requirements/ci.txt^ - requirements/dev.in diff --git a/bin/compile_dependencies.sh b/bin/compile_dependencies.sh index 8d103b45..0859d26f 100755 --- a/bin/compile_dependencies.sh +++ b/bin/compile_dependencies.sh @@ -23,24 +23,25 @@ export CUSTOM_COMPILE_COMMAND="./bin/compile_dependencies.sh" # Base (& prod) deps pip-compile \ --no-emit-index-url \ - --resolver=backtracking \ + --allow-unsafe \ "$@" \ requirements/base.in # Dependencies for testing pip-compile \ --no-emit-index-url \ - --resolver=backtracking \ --output-file requirements/ci.txt \ + --allow-unsafe \ "$@" \ requirements/base.txt \ - requirements/test-tools.in + requirements/test-tools.in \ + requirements/docs.in -# Dev depedencies - exact same set as CI + some extra tooling +# Dev dependencies - exact same set as CI + some extra tooling pip-compile \ --no-emit-index-url \ - --resolver=backtracking \ --output-file requirements/dev.txt \ + --allow-unsafe \ "$@" \ requirements/ci.txt \ requirements/dev.in diff --git a/bin/generate_schema_for_component.cmd b/bin/generate_schema_for_component.cmd deleted file mode 100644 index a6f51498..00000000 --- a/bin/generate_schema_for_component.cmd +++ /dev/null @@ -1,42 +0,0 @@ -@echo off -SETLOCAL - -REM Run this script from the root of the repository - -if "%VIRTUAL_ENV%"=="" ( - echo You need to activate your virtual env before running this script - goto :eof -) - -if "%1"=="" ( - echo You need to pass the component name in the first argument - goto :eof -) - -set SUBPATH=/%1/api -set SCHEMA_PATH=src/openklant/components/%1 - -echo Generating Swagger schema for %1... -python src\manage.py generate_swagger_component^ - %SCHEMA_PATH%\swagger2.0.json^ - --overwrite^ - --format=json^ - --mock-request^ - --url https://example.com/api/v1^ - --component=%1 - -echo Converting Swagger to OpenAPI 3.0... -call .\node_modules\.bin\swagger2openapi %SCHEMA_PATH%\swagger2.0.json -o %SCHEMA_PATH%\openapi.yaml -REM call npm run convert -python src\manage.py patch_error_contenttypes %SCHEMA_PATH%\openapi.yaml - -echo Generating resources document... -python src\manage.py generate_swagger_component^ - %SCHEMA_PATH%\resources.md^ - --overwrite^ - --mock-request^ - --url https://example.com/api/v1^ - --to-markdown-table^ - --component=%1 - -echo Done. diff --git a/bin/live2staging.sh b/bin/live2staging.sh deleted file mode 100644 index 10cc52e1..00000000 --- a/bin/live2staging.sh +++ /dev/null @@ -1,70 +0,0 @@ -#!/bin/bash - -# This script should be run on staging. -source live2staging_settings.sh - -# Script starts here -TMP_FILE="$PGSQL_PROD_DB_NAME-livedb.sql" -TMP_MEDIA_FILE="$PGSQL_PROD_DB_NAME-media.tgz" - -if [ -f $TMP_FILE ]; then - echo -n "Create new dump? [y/n] " - read -n 1 yesno -else - yesno="y" -fi -echo - -if [ "$yesno" == "y" ]; then - echo "Creating dump of production database, please wait..." - - PGSQLDUMP_PROD_CMD_ARGS="--dbname=postgresql://$PGSQL_PROD_USERNAME:$PGSQL_PROD_PASSWORD@127.0.0.1:5432/$PGSQL_PROD_DB_NAME " - PGSQLDUMP_PROD_CMD="pg_dump $PGSQLDUMP_PROD_CMD_ARGS > /srv/sites/$TMP_FILE" - - ssh $PGSQL_PROD_HOST "$PGSQLDUMP_PROD_CMD" - scp $PGSQL_PROD_HOST:/srv/sites/$TMP_FILE $TMP_FILE -fi - -echo -n "Continue loading database? [y/n] " -read -n 1 cont -if [ "$cont" == "n" ]; then - echo - exit -fi -echo - -sudo supervisorctl stop $SUPERVISOR_GROUP:* -sudo service cron stop - -echo "Loading dump of production database into staging, please wait..." -sudo su postgres --command="dropdb $PGSQL_STAGING_DB_NAME" -sudo su postgres --command="createdb $PGSQL_STAGING_DB_NAME --owner=$PGSQL_STAGING_USERNAME" -PGSQL_STAGING_CMD="psql -q --dbname=postgresql://$PGSQL_STAGING_USERNAME:$PGSQL_STAGING_PASSWORD@127.0.0.1:5432/$PGSQL_STAGING_DB_NAME " -$PGSQL_STAGING_CMD < $TMP_FILE - -echo "Modifying data on staging to work with production data..." -$PGSQL_STAGING_CMD < $PWD/live2staging_postimport.sql - -echo "Copying media files from production to staging..." -rsync -au $PGSQL_PROD_HOST:$PROD_MEDIA_PATH/ $STAGING_MEDIA_PATH/ - -sudo chmod -R g+rw $STAGING_PROJECT_PATH - -cd $STAGING_PROJECT_PATH -source env/bin/activate - -env/bin/python src/manage.py migrate -env/bin/python src/manage.py locate_translation_files -sudo service cron start -sudo supervisorctl start $SUPERVISOR_GROUP:* - -cd $PWD - -NOW=$(date +"%Y-%m-%d") -FILE="$PGSQL_PROD_DB_NAME-live2staging-$NOW.sql" - -if [ "$yesno" == "y" ]; then - echo "Storing dump as $FILE..." - cp "$PWD/$TMP_FILE" "$FILE" - gzip $FILE -fi diff --git a/bin/live2staging_postimport.sql b/bin/live2staging_postimport.sql deleted file mode 100644 index 84d23301..00000000 --- a/bin/live2staging_postimport.sql +++ /dev/null @@ -1 +0,0 @@ -UPDATE accounts_user SET email=CONCAT('notify+', REPLACE(email,'@','__at__'), '@maykin.nl'), password='pbkdf2_sha256$12000$pZphUuHkCDke$x8KlvmVInqS1ru9sGZ1tkDStNkMh1xYU1VaG6SHtHMw='; diff --git a/bin/live2staging_settings.sh b/bin/live2staging_settings.sh deleted file mode 100644 index 6d2d092a..00000000 --- a/bin/live2staging_settings.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env bash - -# Settings for live2staging.sh -PGSQL_STAGING_DB_NAME="" -PGSQL_STAGING_USERNAME="" -PGSQL_STAGING_PASSWORD="" - -PGSQL_PROD_DB_NAME="" -PGSQL_PROD_USERNAME="" -PGSQL_PROD_PASSWORD="" - -PGSQL_PROD_HOST="" # Example: john@server.nl - -# No trailing slash -PROD_MEDIA_PATH="" -STAGING_PROJECT_PATH="" -STAGING_MEDIA_PATH="$STAGING_PROJECT_PATH/media" - -SUPERVISOR_GROUP="" diff --git a/bootstrap.py b/bootstrap.py deleted file mode 100755 index 38f11e13..00000000 --- a/bootstrap.py +++ /dev/null @@ -1,169 +0,0 @@ -#!/usr/bin/env python3 -# bootstrap.py -# Bootstrap and setup a virtualenv with the specified requirements.txt -import argparse -import os -import stat -import sys -from shutil import move -from subprocess import call -from tempfile import mkstemp - -description = """ -Set up my development environment for me! -""" - -project_name = "openklant" - -parser = argparse.ArgumentParser(description=description) -parser.add_argument( - "target", - choices=["production", "staging", "test", "jenkins", "dev"], - help="production/staging/test/jenkins/dev", -) -parser.add_argument( - "--project", - default=project_name, - help='Name of the project in your src directory, "%s" by default' % project_name, -) -parser.add_argument( - "--init", - action="store_true", - help='Initialize a fresh "startproject" by pinning the requirements using pip-tools compile. ' - "Automatically done if requirements/base.txt does not yet exist.", -) -parser.add_argument( - "--env", default="env", help='Directory name for virtualenv, "env" by default' -) - -args = parser.parse_args() - - -def replace_or_append(file_path, search_val, replace_val): - file_handle, abs_path = mkstemp() - new_file = open(abs_path, "w") - old_file = open(file_path, "r") - found = False - for line in old_file: - if line.startswith(search_val): - new_file.write(replace_val) - found = True - else: - new_file.write(line) - if not found: - new_file.write("\n" + replace_val) - new_file.close() - os.close(file_handle) - old_file.close() - os.remove(file_path) - move(abs_path, file_path) - os.chmod(file_path, 436) - - -def replace_wsgi_settings(target): - path = os.path.join("src", project_name, "wsgi.py") - replace_or_append( - path, - "os.environ.setdefault", - 'os.environ.setdefault("DJANGO_SETTINGS_MODULE", "%s.conf.%s")\n' - % (project_name, target), - ) - - -def replace_manage_settings(target): - path = os.path.join("src", project_name, "manage.py") - replace_or_append( - path, - " os.environ.setdefault", - ' os.environ.setdefault("DJANGO_SETTINGS_MODULE", "%s.conf.%s")\n' - % (project_name, target), - ) - - -def append_settings_activate(project, target, env): - if os.name == "posix": - path = "%s/bin/activate" % env - replace_or_append( - path, - "export DJANGO_SETTINGS_MODULE=", - "export DJANGO_SETTINGS_MODULE='%s.conf.%s'\n" % (project, target), - ) - elif os.name == "nt": - path = "%s\\Scripts\\activate.bat" % env - replace_or_append( - path, - "set DJANGO_SETTINGS_MODULE=", - "set DJANGO_SETTINGS_MODULE=%s.conf.%s\n" % (project, target), - ) - path = "%s\\Scripts\\deactivate.bat" % env - replace_or_append( - path, "set DJANGO_SETTINGS_MODULE=", "set DJANGO_SETTINGS_MODULE=\n" - ) - - -def pip_compile_pin_requirements(virtualenv): - print("\n== Compiling base requirements ==\n") - if os.name == "posix": - pip_path = os.path.join(virtualenv, "bin", "pip") - elif os.name == "nt": - pip_path = os.path.join(virtualenv, "Scripts", "pip") - cmd_tpl = "{pip} install pip-tools".format(pip=pip_path) - call(cmd_tpl, shell=True) - print( - "Error: Run `. env/bin/activate && ./bin/compile_dependencies.sh` to ensure you have requirements/base.txt and requirements/dev.txt" - ) - print("After that rerun bootstrap.py") - sys.exit(1) - - -def main(): - virtualenv = args.env - if not hasattr(sys, "real_prefix"): - print("\n== Creating virtual environment ==\n") - call( - 'virtualenv {0} --python=python3 --prompt="({1}-{2}) "'.format( - virtualenv, args.project, args.target - ), - shell=True, - ) - print( - '\n== Set "%s.conf.%s" as default settings ==\n' % (args.project, args.target) - ) - append_settings_activate(args.project, args.target, args.env) - - if os.name == "posix": - # Make manage.py executable - st = os.stat("src/manage.py") - os.chmod("src/manage.py", st.st_mode | stat.S_IEXEC) - django_admin_symlink = os.path.join(virtualenv, "bin", "django") - if not os.path.exists(django_admin_symlink): - os.symlink("../../src/manage.py", django_admin_symlink) - - print("\n== Upgrading Pip ==\n") - if os.name == "posix": - pip_path = os.path.join(virtualenv, "bin", "pip") - elif os.name == "nt": - pip_path = os.path.join(virtualenv, "Scripts", "pip") - cmd_tpl = "{pip} install --upgrade pip".format(pip=pip_path) - call(cmd_tpl, shell=True) - - if ( - args.init - or not os.path.exists(os.path.join("requirements", "base.txt")) - or not os.path.exists(os.path.join("requirements", "dev.txt")) - ): - pip_compile_pin_requirements(virtualenv) - - print("\n== Installing %s requirements ==\n" % args.target) - if os.name == "posix": - os.environ["TMPDIR"] = "/var/tmp/" - pip_path = os.path.join(virtualenv, "bin", "pip") - cmd_tpl = "{pip} install -r requirements/{target}.txt" - elif os.name == "nt": - pip_path = os.path.join(virtualenv, "Scripts", "pip") - cmd_tpl = "{pip} install -r requirements\\{target}.txt" - return call(cmd_tpl.format(pip=pip_path, target=args.target), shell=True) - - -if __name__ == "__main__": - sys.exit(main()) diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 00000000..d4bb2cbb --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/_static/theme_overrides.css b/docs/_static/theme_overrides.css new file mode 100644 index 00000000..c6fc7a69 --- /dev/null +++ b/docs/_static/theme_overrides.css @@ -0,0 +1,32 @@ +/* override table width restrictions */ +@media screen and (min-width: 767px) { + + .wy-table-responsive table td { + /* !important prevents the common CSS stylesheets from overriding + this as on RTD they are loaded after this stylesheet */ + white-space: normal !important; + } + .wy-table-responsive table td:first-child { + white-space: nowrap !important; + } + .wy-table-responsive table { + background-color: white; + } + .wy-table-responsive { + overflow: visible !important; + } + } + + /* Depends on logo but default seems ok for this. + .wy-side-nav-search { + background-color: #04A5BB; + } + */ + + .rst-content a:link, .rst-content a:visited { + color: #017092; + } + + .rst-content a:focus, .rst-content a:hover { + color: #051F31; + } \ No newline at end of file diff --git a/docs/check_sphinx.py b/docs/check_sphinx.py new file mode 100644 index 00000000..cc1003a1 --- /dev/null +++ b/docs/check_sphinx.py @@ -0,0 +1,17 @@ +import subprocess + + +def test_linkcheck(tmpdir): + doctrees = tmpdir.join("doctrees") + htmldir = tmpdir.join("html") + subprocess.check_call( + ["sphinx-build", "-W", "-blinkcheck", "-d", str(doctrees), ".", str(htmldir)], + ) + + +def test_build_docs(tmpdir): + doctrees = tmpdir.join("doctrees") + htmldir = tmpdir.join("html") + subprocess.check_call( + ["sphinx-build", "-W", "-bhtml", "-d", str(doctrees), ".", str(htmldir)], + ) diff --git a/docs/coding_style/backend.rst b/docs/coding_style/backend.rst deleted file mode 100644 index 511b861d..00000000 --- a/docs/coding_style/backend.rst +++ /dev/null @@ -1,66 +0,0 @@ -.. _coding_style_backend: - -===================== -Backend coding style -===================== - -The `django coding style`_ is the basis for this styleguide. Some sections dive -a bit deeper or put extra emphasis. - -Imports -======= - -In short: use `isort`_ to check your import ordering. The config file is in -``.isort.cfg``. - -Order and group your imports - -* Use relative imports for your django app -* Ordering: - - future - - standard libraries - - Django components - - third party libraries - - project imports - - local (app) imports - -Example: - -.. code-block:: - - from __future__ import absolute_import, unicode_literals - - import datetime - from datetime import timedelta - - import django.contrib.admin - - import openklant.other_app.models - - from .models import SomeModel - -Naming -====== - -* Use plural form for apps. E.g.: ``accounts``, not ``account``. - -* Use singular form for model, view and form class - -Example: - -.. code-block:: - - from openklant.accounts.models import Account - - class Idea(models.Model): - pass - - class IdeaForm(forms.ModelForm): - pass - - class IdeaDetailView(views.DetailView): - pass - - -.. _django coding style: https://docs.djangoproject.com/en/stable/internals/contributing/writing-code/coding-style/ -.. _isort: https://pypi.python.org/pypi/isort diff --git a/docs/coding_style/frontend.rst b/docs/coding_style/frontend.rst deleted file mode 100644 index 4d11a26f..00000000 --- a/docs/coding_style/frontend.rst +++ /dev/null @@ -1,530 +0,0 @@ -.. _coding_style_frontend: - -===================== -Frontend coding style -===================== - -Shortcuts: - -* :ref:`html` -* :ref:`sass` -* :ref:`javascript` - - -.. _html: - -HTML -==== - -Common ------- - -* Inline style is evil - - .. code-block:: html - -

- Inline style cannot be cached.
- Inline style is difficult to overwrite.
- Inline style makes HTML less readable.
- Inline style is harder to spot.
-

- -* Inline script is evil (except Google Analytics) - - .. code-block:: html - - - -* Style your HTML, don't HTML your style (avoid adding divs for style) - - .. code-block:: html - -
-
-
-

... - -* Variables should be passed using data-attributes as well. They are no excuse for inline script. - - .. code-block:: html - -

...
- - -Elements --------- - -* Avoid the ``id`` attribute, unless there's a good reason. - - .. code-block:: html - -
-
- - -
...
- -* Use `semantic tags`_ like ``
``, ``