Compare commits
195 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 59abf35a12 | |||
| a40eb64245 | |||
| acae1517cb | |||
| 9a9decde6e | |||
| a1ae962c73 | |||
| 0404aa0973 | |||
| effe01dedf | |||
| aaa70039d2 | |||
| 7dc5f09545 | |||
| 91e7f373ec | |||
| c7768ea8f1 | |||
| c2fab377d5 | |||
| d7cdf38cda | |||
| 85f0084b7b | |||
| 712dc5a7f8 | |||
| 84b94fd882 | |||
| 442f1ded27 | |||
| e4dcc19e8b | |||
| 0b828c3d67 | |||
| bc930bf6c9 | |||
| 070e8c98b9 | |||
| 7c157d9d71 | |||
| 79d11b326e | |||
| 51c023a803 | |||
| 819f2e315f | |||
| 928f75f504 | |||
| 1d21cbb69d | |||
| ee2bae190d | |||
| ad6005259e | |||
| f01a991f4f | |||
| a44e1a37cb | |||
| 502f652791 | |||
| fdb38b3b9b | |||
| 4394f38e35 | |||
| ce9d23100d | |||
| 70c5b91e6d | |||
| 4895bfc5ac | |||
| d9db156626 | |||
| d00efcd500 | |||
| 41df3f6d8e | |||
| 0db814710b | |||
| c1955ac807 | |||
| 4081b369d9 | |||
| 8a63f72bee | |||
| cc05ac0d99 | |||
| 8d236ab8dc | |||
| 0e20b0012f | |||
| 5122bb7f3a | |||
| 4b8565dcf2 | |||
| 98b8699afb | |||
| 1c5868d75f | |||
| bfa181cefd | |||
| 944f207d9b | |||
| 8f335a52ea | |||
| e88992a470 | |||
| 9e5673c28f | |||
| 2fe92d8a14 | |||
| b88d1c9f93 | |||
| 59321fc80a | |||
| df04286a4a | |||
| 2fc319d1bc | |||
| 29428a8706 | |||
| dbc80ad94e | |||
| ec877669d4 | |||
| a41b70d5af | |||
| e41dbe772c | |||
| 5a3770027f | |||
| 5c90b5f350 | |||
| dd229a212f | |||
| 8bcf57ce83 | |||
| 0fea49109a | |||
| 8337f7cbf1 | |||
| 159d409237 | |||
| 1586f9b7e4 | |||
| 46dfc23d42 | |||
| 8c3642e5d6 | |||
| 0c99f037b5 | |||
| 929b836cb0 | |||
| 73a10e20a6 | |||
| 48da8cde5c | |||
| 36ea24278f | |||
| 000e4e89db | |||
| 3396986b2d | |||
| f3305d42cd | |||
| f56f5bfc94 | |||
| 5a9b585b44 | |||
| 89a419a8d2 | |||
| 90af1f6eb4 | |||
| e9db143f45 | |||
| 6a5b4aa2aa | |||
| 56b7a8a0a1 | |||
| 5bd519f9e5 | |||
| 5ca5fc300f | |||
| b93b290f97 | |||
| e8eba9ba66 | |||
| 41d3ca7539 | |||
| 636e0b059d | |||
| 87d657abf8 | |||
| 5a89f70d4c | |||
| 6e37e59c4c | |||
| 3f931313a6 | |||
| 815d25519f | |||
| cd45c364e6 | |||
| b423c01068 | |||
| 0729ebb23e | |||
| c682f16c40 | |||
| 94f9192760 | |||
| f490e099ea | |||
| 8a9f135662 | |||
| b12a5b72c2 | |||
| c2ab1f49de | |||
| 81526ae2b4 | |||
| e41351dfc1 | |||
| b854d77d2f | |||
| 3db5b804e4 | |||
| 89b0666e70 | |||
| 95bc323d63 | |||
| 8376295464 | |||
| 1e194f52a6 | |||
| ff1402d427 | |||
| 1ab5c639f0 | |||
| 637c35522f | |||
| 83744cea65 | |||
| 23932c8dd3 | |||
| 8e216124f1 | |||
| b0e440595a | |||
| 88f37c199a | |||
| 68b3072aa3 | |||
| 9f74aaea69 | |||
| 89f95904b8 | |||
| 8e7048490e | |||
| 59fb9e7b3a | |||
| 01e714dba5 | |||
| 859506c4aa | |||
| 4c6f38f41e | |||
| 1171708d9e | |||
| c66bf97572 | |||
| 804f6e7883 | |||
| 12d01bb3e0 | |||
| 9d37e0c59b | |||
| 5cd540a8d0 | |||
| 1717c118ab | |||
| 87f336a457 | |||
| 0e9597de54 | |||
| 972d7f55b2 | |||
| 17df388035 | |||
| 21f0be3265 | |||
| c8b2cc3683 | |||
| ad19744a47 | |||
| 59fe1df1e7 | |||
| 313a7ba230 | |||
| 5c9fd6b4ef | |||
| 74b122e75c | |||
| a9b37c1907 | |||
| 8ad69b4bae | |||
| 10ec2c6649 | |||
| fadb4b1930 | |||
| e595128c13 | |||
| f9b46eea36 | |||
| 5ed704a497 | |||
| 64001959c3 | |||
| ec8b109258 | |||
| cd25673a5f | |||
| 459984bcbf | |||
| a2f9b2dca0 | |||
| cd208ee57b | |||
| 5ec550373d | |||
| d1da7c321c | |||
| e4a670948d | |||
| 5563ff49f8 | |||
| 3b1f3c8c65 | |||
| 67ee8628da | |||
| c8cae37ff1 | |||
| 7082041853 | |||
| 60d204b061 | |||
| 75e09b0bc6 | |||
| 578041cb7f | |||
| 918236212c | |||
| 34c129bd18 | |||
| 55dca61a96 | |||
| fd0dc4643d | |||
| 2687705f29 | |||
| ddcb8df904 | |||
| 8b389515c4 | |||
| 2b17f64904 | |||
| a1aebfff4f | |||
| 2034577eb2 | |||
| 0f13869c20 | |||
| 388d2993cc | |||
| 8e91737a4b | |||
| d9420468ba | |||
| 950fb7865a | |||
| 98bb73a7aa | |||
| 282b30f515 | |||
| e9f4f50d51 |
@@ -0,0 +1,14 @@
|
||||
# These are supported funding model platforms
|
||||
|
||||
github: [ColinMaudry] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
|
||||
patreon: # Replace with a single Patreon username
|
||||
open_collective: # Replace with a single Open Collective username
|
||||
ko_fi: # Replace with a single Ko-fi username
|
||||
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
|
||||
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
|
||||
liberapay: # Replace with a single Liberapay username
|
||||
issuehunt: # Replace with a single IssueHunt username
|
||||
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
|
||||
polar: # Replace with a single Polar username
|
||||
buy_me_a_coffee: # Replace with a single Buy Me a Coffee username
|
||||
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
|
||||
@@ -0,0 +1,51 @@
|
||||
name: Déploiement
|
||||
on:
|
||||
workflow_dispatch:
|
||||
pull_request:
|
||||
types:
|
||||
- closed
|
||||
push:
|
||||
branches:
|
||||
- dev
|
||||
jobs:
|
||||
deploy:
|
||||
# Trigger deploy workflow if
|
||||
# ...I clicked on "Run workflow" in Github actions, thus deploy main to production env (main)
|
||||
# or
|
||||
# ...I merged a PR or pushed on the dev branch, thus deploy to the test env (dev)
|
||||
if: |
|
||||
(github.event_name == 'workflow_dispatch' && github.ref_name == 'main') ||
|
||||
((github.event_name == 'pull_request' || github.event_name == 'push') && github.ref_name == 'dev')
|
||||
runs-on: ubuntu-latest
|
||||
environment: ${{ github.ref_name }}
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Set up SSH key
|
||||
run: |
|
||||
env
|
||||
mkdir -p ~/.ssh
|
||||
echo "${{ secrets.ARTIFACT_SSH_KEY }}" > /home/runner/.ssh/id_rsa
|
||||
chmod 600 ~/.ssh/id_rsa
|
||||
ssh-keyscan -p ${{ secrets.ARTIFACT_PORT }} ${{ secrets.ARTIFACT_HOST }} >> ~/.ssh/known_hosts
|
||||
sudo apt-get install sshpass python3 python3-pip
|
||||
|
||||
- name: Deploy to server
|
||||
uses: appleboy/ssh-action@master
|
||||
with:
|
||||
host: ${{ secrets.ARTIFACT_HOST }}
|
||||
username: ${{ secrets.USER }}
|
||||
port: ${{ secrets.ARTIFACT_PORT }}
|
||||
key: ${{ secrets.ARTIFACT_SSH_KEY }}
|
||||
passphrase: ${{ secrets.SSH_PSWD }}
|
||||
command_timeout: 5m
|
||||
script: |
|
||||
systemctl stop ${{ vars.APP_NAME }}
|
||||
cd /var/www/${{ vars.APP_NAME }}
|
||||
git pull
|
||||
source .venv/bin/activate
|
||||
pip install .
|
||||
deactivate
|
||||
chown -R ${{ vars.APP_NAME }}:www-data *
|
||||
systemctl start ${{ vars.APP_NAME }}
|
||||
@@ -0,0 +1,29 @@
|
||||
on:
|
||||
push:
|
||||
# Sequence of patterns matched against refs/tags
|
||||
tags:
|
||||
- 'v*' # Push events to matching v*, i.e. v1.0, v20.15.10
|
||||
|
||||
name: Create Release
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Auto-release d'un tag
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@master
|
||||
- name: Get tag message
|
||||
run: echo "TAG_MESSAGE=`git show ${{ github.ref_name }} | grep '^\- '`" >> "$GITHUB_ENV"
|
||||
- name: Create Release
|
||||
id: create_release
|
||||
uses: actions/create-release@latest
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token
|
||||
TAG_MESSAGE: ${{ env.TAG_MESSAGE }}
|
||||
with:
|
||||
tag_name: ${{ github.ref }}
|
||||
release_name: ${{ github.ref_name }}
|
||||
body: ${{ env.TAG_MESSAGE }}
|
||||
draft: false
|
||||
prerelease: false
|
||||
@@ -1 +1,7 @@
|
||||
*.db
|
||||
*.db
|
||||
*.egg-info
|
||||
__pycache__
|
||||
.idea
|
||||
.venv
|
||||
build
|
||||
.env
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
repos:
|
||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||
rev: v5.0.0
|
||||
hooks:
|
||||
- id: check-case-conflict
|
||||
- id: check-yaml
|
||||
- id: end-of-file-fixer
|
||||
- id: trailing-whitespace
|
||||
- repo: https://github.com/pre-commit/mirrors-prettier
|
||||
rev: v2.5.1
|
||||
hooks:
|
||||
- id: prettier
|
||||
files: \.(js|css|html|json|md)$
|
||||
- repo: https://github.com/astral-sh/ruff-pre-commit
|
||||
rev: v0.11.12
|
||||
hooks:
|
||||
- id: ruff
|
||||
args: [ "--fix" ]
|
||||
- id: ruff
|
||||
args: [ "check", "--select", "I", "--fix" ]
|
||||
- id: ruff-format
|
||||
@@ -0,0 +1,14 @@
|
||||
DATA_FILE_PARQUET_PATH=https://www.data.gouv.fr/fr/datasets/r/11cea8e8-df3e-4ed1-932b-781e2635e432
|
||||
PORT=8050
|
||||
DEVELOPMENT=True
|
||||
SOURCE_STATS_CSV_PATH="https://www.data.gouv.fr/api/1/datasets/r/8ded94de-3b80-4840-a5bb-7faad1c9c234"
|
||||
|
||||
# Chemin vers le schéma de données
|
||||
DATA_SCHEMA_PATH=https://www.data.gouv.fr/api/1/datasets/r/9a4144c0-ee44-4dec-bee5-bbef38191d9a
|
||||
|
||||
# Formulaire de contact
|
||||
SENDER_SERVER_DOMAIN="mail.example.com" # serveur SMTP
|
||||
LOGIN_PASSWORD="" # mot de passe du serveur
|
||||
LOGIN_EMAIL="connect@example.fr" # adresse utilisée pour se connecter au serveur SMTP
|
||||
FROM_EMAIL="from@example.com" # adresse d'envoi des emails (From)
|
||||
TO_EMAIL="to@example.com" # adresse de destination des emails (To)
|
||||
@@ -1,201 +1,16 @@
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
decp.info is a web application that enable analysis and download of
|
||||
French public procurement data.
|
||||
Copyright (C) 2025 Colin Maudry
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
1. Definitions.
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product 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 NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of 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 reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
@@ -1,16 +1,93 @@
|
||||
# decp.info
|
||||
|
||||
> v2.1.4
|
||||
|
||||
Outil d'exploration et de téléchargement des données essentielles de la commande publique.
|
||||
|
||||
=> https://decp.info
|
||||
=> [decp.info](https://decp.info)
|
||||
|
||||
Dépôts de code connexes :
|
||||
## Installation et lancement
|
||||
|
||||
- [decp-table-schema-utils](https://github.com/ColinMaudry/decp-table-schema-utils) (traitement et publication des données)
|
||||
- [decp-table-schema](https://github.com/ColinMaudry/decp-table-schema) (schéma de données tabulaire)
|
||||
```shell
|
||||
python -m venv .venv
|
||||
source .venv/bin/activate
|
||||
pip install .
|
||||
|
||||
# Copie et personnalisation du .env
|
||||
cp template.env .env
|
||||
nano .env
|
||||
|
||||
# Pour la production
|
||||
gunicorn app:server
|
||||
|
||||
# Pour avoir le debuggage et le hot reload
|
||||
python run.py
|
||||
```
|
||||
|
||||
## Déploiement
|
||||
|
||||
- **Production** (branche `main`, [decp.info](https://decp.info)) : déploiement manuel via un déclenchement de la Github Action [Déploiement](https://github.com/ColinMaudry/decp.info/actions/workflows/deploy.yaml)
|
||||
- **Test** (branche `dev`, [test.decp.info](https://test.decp.info)) : déploiement automatique à chaque push sur la branche `dev`, via la même Github Action.
|
||||
|
||||
Ne pas oublier de mettre à jour les fichier .env.
|
||||
|
||||
## Liens connexes
|
||||
|
||||
- [decp-processing](https://github.com/ColinMaudry/decp-processing) (traitement et publication des données)
|
||||
- [colin.maudry.com](https://colin.maudry.com) (blog)
|
||||
|
||||
## Notes de version
|
||||
|
||||
##### 2.1.4 (8 octobre 2025)
|
||||
|
||||
- possibilité de filtrer sur le champ "Source"
|
||||
- création automatique d'une release Github quand je push un tag
|
||||
|
||||
##### 2.1.3 (4 octobre 2025)
|
||||
|
||||
- tentative d'auto-release à chaque création de tag git
|
||||
- adaptation au format TableSchema
|
||||
|
||||
##### 2.1.2 (3 octobre 2025)
|
||||
|
||||
- dataframe global plutôt que lazyframe, pour plus de résilience et charger toutes les données en mémoire
|
||||
|
||||
##### 2.1.1 (1er octobre 2025)
|
||||
|
||||
- ajout d'une section dans À propos sur la qualité et l'exhaustivité des données ([#43](https://github.com/ColinMaudry/decp.info/issues/43))
|
||||
- ajout du nombre de marchés en plus du nombre de lignes dans la vue Tableau
|
||||
|
||||
#### 2.1.0 (30 septembre 2025)
|
||||
|
||||
- Ajout des vues [acheteur](https://decp.info/acheteurs/24350013900189) ([#28](https://github.com/ColinMaudry/decp.info/issues/28)), [titulaire](https://decp.info/titulaires/51903758414786) ([#35](https://github.com/ColinMaudry/decp.info/issues/35)) et [marché](https://decp.info/marches/532239472000482025S00004) ([#40](https://github.com/ColinMaudry/decp.info/issues/40)) 🔎
|
||||
- Ajout des balises HTML meta Open Graph et Twitter ([#39](https://github.com/ColinMaudry/decp.info/issues/39)) pour de beaux aperçus de liens 🖼️
|
||||
- Formulaire de contact ([#48](https://github.com/ColinMaudry/decp.info/issues/48)) 📨
|
||||
- Nom de colonnes plus_agréables ([#33](https://github.com/ColinMaudry/decp.info/issues/33)) 💅
|
||||
- Définition des colonnes quand vous passez votre souris sur les en-têtes ([#33](https://github.com/ColinMaudry/decp.info/issues/33)) 📖
|
||||
- Affichage du numéro de version près du logo et lien vers ici 🤓
|
||||
- Variables globales uniquement en lecture (😁)
|
||||
|
||||
##### 2.0.1 (23 septembre 2025)
|
||||
|
||||
- Bloquage du bouton de téléchargement si trop de lignes (+ 65000) [#38](https://github.com/ColinMaudry/decp.info/issues/38)
|
||||
- Amélioration du script de déploiement (deploy.sh)
|
||||
- Meilleures instructions d'installation et lancement
|
||||
- Coquilles 🐚
|
||||
|
||||
### 2.0.0 (23 septembre 2025)
|
||||
|
||||
- détails des sources de données
|
||||
- section "À propos" plus développée
|
||||
- correction de bugs dans les filtres de la data table
|
||||
|
||||
#### 2.0.0-alpha
|
||||
|
||||
- Data table fonctionnelle
|
||||
|
||||
### 1.5.0 (28/01/2023
|
||||
|
||||
- fixation des dépendances Python pour plus de stabilité en cas de réinstallation (Pipfile)
|
||||
|
||||
#### 1.4.1 (14/06/2021)
|
||||
|
||||
- ajout des traductions des opérations de filtrage à toutes les vues, pas seulement /db/decp
|
||||
|
||||
@@ -0,0 +1,398 @@
|
||||
{
|
||||
"01": {
|
||||
"departement": "Ain",
|
||||
"region": "Auvergne-Rhône-Alpes"
|
||||
},
|
||||
"02": {
|
||||
"departement": "Aisne",
|
||||
"region": "Hauts-de-France"
|
||||
},
|
||||
"03": {
|
||||
"departement": "Allier",
|
||||
"region": "Auvergne-Rhône-Alpes"
|
||||
},
|
||||
"04": {
|
||||
"departement": "Alpes-de-Haute-Provence",
|
||||
"region": "Provence-Alpes-Côte d'Azur"
|
||||
},
|
||||
"05": {
|
||||
"departement": "Hautes-Alpes",
|
||||
"region": "Provence-Alpes-Côte d'Azur"
|
||||
},
|
||||
"06": {
|
||||
"departement": "Alpes-Maritimes",
|
||||
"region": "Provence-Alpes-Côte d'Azur"
|
||||
},
|
||||
"07": {
|
||||
"departement": "Ardèche",
|
||||
"region": "Auvergne-Rhône-Alpes"
|
||||
},
|
||||
"08": {
|
||||
"departement": "Ardennes",
|
||||
"region": "Grand Est"
|
||||
},
|
||||
"09": {
|
||||
"departement": "Ariège",
|
||||
"region": "Occitanie"
|
||||
},
|
||||
"10": {
|
||||
"departement": "Aube",
|
||||
"region": "Grand Est"
|
||||
},
|
||||
"11": {
|
||||
"departement": "Aude",
|
||||
"region": "Occitanie"
|
||||
},
|
||||
"12": {
|
||||
"departement": "Aveyron",
|
||||
"region": "Occitanie"
|
||||
},
|
||||
"13": {
|
||||
"departement": "Bouches-du-Rhône",
|
||||
"region": "Provence-Alpes-Côte d'Azur"
|
||||
},
|
||||
"14": {
|
||||
"departement": "Calvados",
|
||||
"region": "Normandie"
|
||||
},
|
||||
"15": {
|
||||
"departement": "Cantal",
|
||||
"region": "Auvergne-Rhône-Alpes"
|
||||
},
|
||||
"16": {
|
||||
"departement": "Charente",
|
||||
"region": "Nouvelle-Aquitaine"
|
||||
},
|
||||
"17": {
|
||||
"departement": "Charente-Maritime",
|
||||
"region": "Nouvelle-Aquitaine"
|
||||
},
|
||||
"18": {
|
||||
"departement": "Cher",
|
||||
"region": "Centre-Val de Loire"
|
||||
},
|
||||
"19": {
|
||||
"departement": "Corrèze",
|
||||
"region": "Nouvelle-Aquitaine"
|
||||
},
|
||||
"21": {
|
||||
"departement": "Côte-d'Or",
|
||||
"region": "Bourgogne-Franche-Comté"
|
||||
},
|
||||
"22": {
|
||||
"departement": "Côtes-d'Armor",
|
||||
"region": "Bretagne"
|
||||
},
|
||||
"23": {
|
||||
"departement": "Creuse",
|
||||
"region": "Nouvelle-Aquitaine"
|
||||
},
|
||||
"24": {
|
||||
"departement": "Dordogne",
|
||||
"region": "Nouvelle-Aquitaine"
|
||||
},
|
||||
"25": {
|
||||
"departement": "Doubs",
|
||||
"region": "Bourgogne-Franche-Comté"
|
||||
},
|
||||
"26": {
|
||||
"departement": "Drôme",
|
||||
"region": "Auvergne-Rhône-Alpes"
|
||||
},
|
||||
"27": {
|
||||
"departement": "Eure",
|
||||
"region": "Normandie"
|
||||
},
|
||||
"28": {
|
||||
"departement": "Eure-et-Loir",
|
||||
"region": "Centre-Val de Loire"
|
||||
},
|
||||
"29": {
|
||||
"departement": "Finistère",
|
||||
"region": "Bretagne"
|
||||
},
|
||||
"30": {
|
||||
"departement": "Gard",
|
||||
"region": "Occitanie"
|
||||
},
|
||||
"31": {
|
||||
"departement": "Haute-Garonne",
|
||||
"region": "Occitanie"
|
||||
},
|
||||
"32": {
|
||||
"departement": "Gers",
|
||||
"region": "Occitanie"
|
||||
},
|
||||
"33": {
|
||||
"departement": "Gironde",
|
||||
"region": "Nouvelle-Aquitaine"
|
||||
},
|
||||
"34": {
|
||||
"departement": "Hérault",
|
||||
"region": "Occitanie"
|
||||
},
|
||||
"35": {
|
||||
"departement": "Ille-et-Vilaine",
|
||||
"region": "Bretagne"
|
||||
},
|
||||
"36": {
|
||||
"departement": "Indre",
|
||||
"region": "Centre-Val de Loire"
|
||||
},
|
||||
"37": {
|
||||
"departement": "Indre-et-Loire",
|
||||
"region": "Centre-Val de Loire"
|
||||
},
|
||||
"38": {
|
||||
"departement": "Isère",
|
||||
"region": "Auvergne-Rhône-Alpes"
|
||||
},
|
||||
"39": {
|
||||
"departement": "Jura",
|
||||
"region": "Bourgogne-Franche-Comté"
|
||||
},
|
||||
"40": {
|
||||
"departement": "Landes",
|
||||
"region": "Nouvelle-Aquitaine"
|
||||
},
|
||||
"41": {
|
||||
"departement": "Loir-et-Cher",
|
||||
"region": "Centre-Val de Loire"
|
||||
},
|
||||
"42": {
|
||||
"departement": "Loire",
|
||||
"region": "Auvergne-Rhône-Alpes"
|
||||
},
|
||||
"43": {
|
||||
"departement": "Haute-Loire",
|
||||
"region": "Auvergne-Rhône-Alpes"
|
||||
},
|
||||
"44": {
|
||||
"departement": "Loire-Atlantique",
|
||||
"region": "Pays de la Loire"
|
||||
},
|
||||
"45": {
|
||||
"departement": "Loiret",
|
||||
"region": "Centre-Val de Loire"
|
||||
},
|
||||
"46": {
|
||||
"departement": "Lot",
|
||||
"region": "Occitanie"
|
||||
},
|
||||
"47": {
|
||||
"departement": "Lot-et-Garonne",
|
||||
"region": "Nouvelle-Aquitaine"
|
||||
},
|
||||
"48": {
|
||||
"departement": "Lozère",
|
||||
"region": "Occitanie"
|
||||
},
|
||||
"49": {
|
||||
"departement": "Maine-et-Loire",
|
||||
"region": "Pays de la Loire"
|
||||
},
|
||||
"50": {
|
||||
"departement": "Manche",
|
||||
"region": "Normandie"
|
||||
},
|
||||
"51": {
|
||||
"departement": "Marne",
|
||||
"region": "Grand Est"
|
||||
},
|
||||
"52": {
|
||||
"departement": "Haute-Marne",
|
||||
"region": "Grand Est"
|
||||
},
|
||||
"53": {
|
||||
"departement": "Mayenne",
|
||||
"region": "Pays de la Loire"
|
||||
},
|
||||
"54": {
|
||||
"departement": "Meurthe-et-Moselle",
|
||||
"region": "Grand Est"
|
||||
},
|
||||
"55": {
|
||||
"departement": "Meuse",
|
||||
"region": "Grand Est"
|
||||
},
|
||||
"56": {
|
||||
"departement": "Morbihan",
|
||||
"region": "Bretagne"
|
||||
},
|
||||
"57": {
|
||||
"departement": "Moselle",
|
||||
"region": "Grand Est"
|
||||
},
|
||||
"58": {
|
||||
"departement": "Nièvre",
|
||||
"region": "Bourgogne-Franche-Comté"
|
||||
},
|
||||
"59": {
|
||||
"departement": "Nord",
|
||||
"region": "Hauts-de-France"
|
||||
},
|
||||
"60": {
|
||||
"departement": "Oise",
|
||||
"region": "Hauts-de-France"
|
||||
},
|
||||
"61": {
|
||||
"departement": "Orne",
|
||||
"region": "Normandie"
|
||||
},
|
||||
"62": {
|
||||
"departement": "Pas-de-Calais",
|
||||
"region": "Hauts-de-France"
|
||||
},
|
||||
"63": {
|
||||
"departement": "Puy-de-Dôme",
|
||||
"region": "Auvergne-Rhône-Alpes"
|
||||
},
|
||||
"64": {
|
||||
"departement": "Pyrénées-Atlantiques",
|
||||
"region": "Nouvelle-Aquitaine"
|
||||
},
|
||||
"65": {
|
||||
"departement": "Hautes-Pyrénées",
|
||||
"region": "Occitanie"
|
||||
},
|
||||
"66": {
|
||||
"departement": "Pyrénées-Orientales",
|
||||
"region": "Occitanie"
|
||||
},
|
||||
"67": {
|
||||
"departement": "Bas-Rhin",
|
||||
"region": "Grand Est"
|
||||
},
|
||||
"68": {
|
||||
"departement": "Haut-Rhin",
|
||||
"region": "Grand Est"
|
||||
},
|
||||
"69": {
|
||||
"departement": "Rhône",
|
||||
"region": "Auvergne-Rhône-Alpes"
|
||||
},
|
||||
"70": {
|
||||
"departement": "Haute-Saône",
|
||||
"region": "Bourgogne-Franche-Comté"
|
||||
},
|
||||
"71": {
|
||||
"departement": "Saône-et-Loire",
|
||||
"region": "Bourgogne-Franche-Comté"
|
||||
},
|
||||
"72": {
|
||||
"departement": "Sarthe",
|
||||
"region": "Pays de la Loire"
|
||||
},
|
||||
"73": {
|
||||
"departement": "Savoie",
|
||||
"region": "Auvergne-Rhône-Alpes"
|
||||
},
|
||||
"74": {
|
||||
"departement": "Haute-Savoie",
|
||||
"region": "Auvergne-Rhône-Alpes"
|
||||
},
|
||||
"75": {
|
||||
"departement": "Paris",
|
||||
"region": "Île-de-France"
|
||||
},
|
||||
"76": {
|
||||
"departement": "Seine-Maritime",
|
||||
"region": "Normandie"
|
||||
},
|
||||
"77": {
|
||||
"departement": "Seine-et-Marne",
|
||||
"region": "Île-de-France"
|
||||
},
|
||||
"78": {
|
||||
"departement": "Yvelines",
|
||||
"region": "Île-de-France"
|
||||
},
|
||||
"79": {
|
||||
"departement": "Deux-Sèvres",
|
||||
"region": "Nouvelle-Aquitaine"
|
||||
},
|
||||
"80": {
|
||||
"departement": "Somme",
|
||||
"region": "Hauts-de-France"
|
||||
},
|
||||
"81": {
|
||||
"departement": "Tarn",
|
||||
"region": "Occitanie"
|
||||
},
|
||||
"82": {
|
||||
"departement": "Tarn-et-Garonne",
|
||||
"region": "Occitanie"
|
||||
},
|
||||
"83": {
|
||||
"departement": "Var",
|
||||
"region": "Provence-Alpes-Côte d'Azur"
|
||||
},
|
||||
"84": {
|
||||
"departement": "Vaucluse",
|
||||
"region": "Provence-Alpes-Côte d'Azur"
|
||||
},
|
||||
"85": {
|
||||
"departement": "Vendée",
|
||||
"region": "Pays de la Loire"
|
||||
},
|
||||
"86": {
|
||||
"departement": "Vienne",
|
||||
"region": "Nouvelle-Aquitaine"
|
||||
},
|
||||
"87": {
|
||||
"departement": "Haute-Vienne",
|
||||
"region": "Nouvelle-Aquitaine"
|
||||
},
|
||||
"88": {
|
||||
"departement": "Vosges",
|
||||
"region": "Grand Est"
|
||||
},
|
||||
"89": {
|
||||
"departement": "Yonne",
|
||||
"region": "Bourgogne-Franche-Comté"
|
||||
},
|
||||
"90": {
|
||||
"departement": "Territoire de Belfort",
|
||||
"region": "Bourgogne-Franche-Comté"
|
||||
},
|
||||
"91": {
|
||||
"departement": "Essonne",
|
||||
"region": "Île-de-France"
|
||||
},
|
||||
"92": {
|
||||
"departement": "Hauts-de-Seine",
|
||||
"region": "Île-de-France"
|
||||
},
|
||||
"93": {
|
||||
"departement": "Seine-Saint-Denis",
|
||||
"region": "Île-de-France"
|
||||
},
|
||||
"94": {
|
||||
"departement": "Val-de-Marne",
|
||||
"region": "Île-de-France"
|
||||
},
|
||||
"95": {
|
||||
"departement": "Val-d'Oise",
|
||||
"region": "Île-de-France"
|
||||
},
|
||||
"971": {
|
||||
"departement": "Guadeloupe",
|
||||
"region": "Guadeloupe"
|
||||
},
|
||||
"972": {
|
||||
"departement": "Martinique",
|
||||
"region": "Martinique"
|
||||
},
|
||||
"973": {
|
||||
"departement": "Guyane",
|
||||
"region": "Guyane"
|
||||
},
|
||||
"974": {
|
||||
"departement": "La Réunion",
|
||||
"region": "La Réunion"
|
||||
},
|
||||
"976": {
|
||||
"departement": "Mayotte",
|
||||
"region": "Mayotte"
|
||||
}
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"db": {
|
||||
"hash": "e7781c4da0df3983d9e8bfc09d513162302d787bff766e3cfee2dd5dcd272b85",
|
||||
"size": 121118720,
|
||||
"file": "datasette/db.db",
|
||||
"tables": {
|
||||
"decp": {
|
||||
"count": 292374
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,146 +0,0 @@
|
||||
---
|
||||
extra_css_urls:
|
||||
- "/static/custom.css"
|
||||
title: Exploration et téléchargement des données essentielles de la commande publique
|
||||
(format tabulaire)
|
||||
description: Ce site vous permet de filtrer et trier les données sur les marchés publics,
|
||||
et de télécharger le résultat sous la forme d'un fichier que vous pourrez ouvrir
|
||||
dans un logiciel de tableur (MS Excel, LibreOffice, OpenOffice).
|
||||
source: Données essentielles de la commande publique
|
||||
source_url: https://www.data.gouv.fr/fr/datasets/608c055b35eb4e6ee20eb325/
|
||||
license: Licence ouverte
|
||||
license_url: https://www.etalab.gouv.fr/wp-content/uploads/2014/05/Licence_Ouverte.pdf
|
||||
databases:
|
||||
db:
|
||||
tables:
|
||||
decp:
|
||||
title: Marchés et titulaires (= DECP)
|
||||
description_html: |-
|
||||
Marché publics et leurs titulaires, données équivalentes au <a href="https://139bercy.github.io/decp-docs/schemas/">format réglementaire</a>. Une ligne = un titulaire de marché, donc ces données ne sont pas adaptées pour travailler avec les montants de marché ou compter les marchés.
|
||||
size: 40
|
||||
download: https://www.data.gouv.fr/fr/datasets/r/8587fe77-fb31-4155-8753-f6a3c5e0f5c9
|
||||
column_labels:
|
||||
id: Identifiant
|
||||
uid: Identifiant unique
|
||||
acheteur.id: SIRET acheteur
|
||||
acheteur.nom: Nom de l'acheteur
|
||||
procedure: Procédure d'achat
|
||||
nature: Nature
|
||||
dureeMois: Durée du marché (mois)
|
||||
dateNotification: Date de notification
|
||||
datePublicationDonnees: Date de publication des données
|
||||
montant: Montant
|
||||
objet: Objet
|
||||
codeCPV: Code CPV
|
||||
formePrix: Forme du prix
|
||||
lieuExecution.code: Code du lieu d'exécution
|
||||
lieuExecution.typeCode: Code du lieu d'exécution (type)
|
||||
lieuExecution.nom: Nom du lieu d'exécution
|
||||
titulaire.id: Identifiant du titulaire
|
||||
titulaire.typeIdentifiant: Identifiant du titulaire (type)
|
||||
titulaire.denominationSociale: Nom du titulaire
|
||||
objetModification: Objet de la modification
|
||||
source: Source des données
|
||||
donneesActuelles: Données actuelles ?
|
||||
anomalies: Anomalies
|
||||
operation_labels:
|
||||
exact: est égal à
|
||||
not: est différent de
|
||||
contains: contient
|
||||
endswith: finit par
|
||||
startswith: commence par
|
||||
gt: est supérieur à (>)
|
||||
lt: est inférieur à (<)
|
||||
lte: est inférieur ou égal à (<=)
|
||||
gte: est supérieur ou égal à (>=)
|
||||
isnull__1: est vide
|
||||
notnull__1: n'est pas vide
|
||||
decp-sans-titulaires:
|
||||
title: Marchés publics sans leurs titulaires
|
||||
description_html: Marchés publics sans les titulaires (pas de colonnes titulaire). Une ligne = un marché, donc ces données sont adaptées pour travailler avec les montants de marchés et compter les marchés.
|
||||
size: 40
|
||||
download: https://www.data.gouv.fr/fr/datasets/r/834c14dd-037c-4825-958d-0a841c4777ae
|
||||
column_labels:
|
||||
id: Identifiant
|
||||
uid: Identifiant unique
|
||||
acheteur.id: SIRET acheteur
|
||||
acheteur.nom: Nom de l'acheteur
|
||||
procedure: Procédure d'achat
|
||||
nature: Nature
|
||||
dureeMois: Durée du marché (mois)
|
||||
dateNotification: Date de notification
|
||||
datePublicationDonnees: Date de publication des données
|
||||
montant: Montant
|
||||
objet: Objet
|
||||
codeCPV: Code CPV
|
||||
formePrix: Forme du prix
|
||||
lieuExecution.code: Code du lieu d'exécution
|
||||
lieuExecution.typeCode: Code du lieu d'exécution (type)
|
||||
lieuExecution.nom: Nom du lieu d'exécution
|
||||
objetModification: Objet de la modification
|
||||
source: Source des données
|
||||
donneesActuelles: Données actuelles ?
|
||||
anomalies: Anomalies
|
||||
operation_labels:
|
||||
exact: est égal à
|
||||
not: est différent de
|
||||
contains: contient
|
||||
endswith: finit par
|
||||
startswith: commence par
|
||||
gt: est supérieur à (>)
|
||||
lt: est inférieur à (<)
|
||||
lte: est inférieur ou égal à (<=)
|
||||
gte: est supérieur ou égal à (>=)
|
||||
isnull__1: est vide
|
||||
notnull__1: n'est pas vide
|
||||
decp-titulaires:
|
||||
title: Données sur les titulaires et géolocalisation
|
||||
description_html: Données détaillées sur les titulaires ayant un numéro SIRET, dont leur géolocalisation. Les colonnes <tt>formePrix</tt>, <tt>procedure</tt>, <tt>objetModification</tt> et <tt>datePublicationDonnees</tt> sont absentes. Une ligne = un titulaire de marché, donc ces données ne sont pas adaptées pour travailler avec les montants de marché ou compter les marchés.
|
||||
size: 40
|
||||
download: https://www.data.gouv.fr/fr/datasets/r/25fcd9e6-ce5a-41a7-b6c0-f140abb2a060
|
||||
column_labels:
|
||||
id: Identifiant
|
||||
uid: Identifiant unique
|
||||
acheteur.id: SIRET acheteur
|
||||
acheteur.nom: Nom de l'acheteur
|
||||
procedure: Procédure d'achat
|
||||
nature: Nature
|
||||
dureeMois: Durée du marché (mois)
|
||||
dateNotification: Date de notification
|
||||
datePublicationDonnees: Date de publication des données
|
||||
montant: Montant
|
||||
objet: Objet
|
||||
codeCPV: Code CPV
|
||||
formePrix: Forme du prix
|
||||
lieuExecution.code: Code du lieu d'exécution
|
||||
lieuExecution.typeCode: Code du lieu d'exécution (type)
|
||||
lieuExecution.nom: Nom du lieu d'exécution
|
||||
objetModification: Objet de la modification
|
||||
source: Source des données
|
||||
donneesActuelles: Données actuelles ?
|
||||
anomalies: Anomalies
|
||||
codeAPE: Code APE
|
||||
departement: Département
|
||||
categorie: Catégorie
|
||||
categorieJuridique: Catégorie juridique
|
||||
categorieJuridiqueLibelle1: Catégorie juridique niveau 1
|
||||
categorieJuridiqueLibelle2: Catégorie juridique niveau 2
|
||||
etatEtablissement: État établissement
|
||||
etatEntreprise: État entreprise
|
||||
longitude: Longitude
|
||||
latitude: Latitude
|
||||
titulaire.id: Identifiant du titulaire
|
||||
titulaire.typeIdentifiant: Identifiant du titulaire (type)
|
||||
titulaire.denominationSociale: Nom du titulaire
|
||||
operation_labels:
|
||||
exact: est égal à
|
||||
not: est différent de
|
||||
contains: contient
|
||||
endswith: finit par
|
||||
startswith: commence par
|
||||
gt: est supérieur à (>)
|
||||
lt: est inférieur à (<)
|
||||
lte: est inférieur ou égal à (<=)
|
||||
gte: est supérieur ou égal à (>=)
|
||||
isnull__1: est vide
|
||||
notnull__1: n'est pas vide
|
||||
@@ -1,12 +0,0 @@
|
||||
from datasette import hookimpl
|
||||
|
||||
@hookimpl
|
||||
def menu_links(datasette, actor):
|
||||
return [
|
||||
{"href": "https://teamopendata.org/t/decp-info-les-donnees-de-la-commande-publique-pour-tous-questions-reponses-discussions/2948", "label": "Présentation / FAQ"},
|
||||
{"href": "https://github.com/ColinMaudry/decp-table-schema/#documentation-du-sch%C3%A9ma", "label": "Documentation des champs"},
|
||||
{"href": "https://github.com/ColinMaudry/decp.info", "label": "Code source"},
|
||||
{"href": "/versions", "label": "Notes de version"},
|
||||
{"href": "/inscription", "label": "Lettre d'information"},
|
||||
{"href": "/mentions-legales", "label": "Mentions légales"}
|
||||
]
|
||||
@@ -1,75 +0,0 @@
|
||||
from datasette import hookimpl
|
||||
from datasette.utils.asgi import Response
|
||||
from openpyxl import Workbook
|
||||
from openpyxl.writer.excel import save_virtual_workbook
|
||||
from openpyxl.cell import WriteOnlyCell
|
||||
from openpyxl.styles import Alignment, Font, PatternFill
|
||||
from tempfile import NamedTemporaryFile
|
||||
|
||||
|
||||
def render_spreadsheet(rows):
|
||||
wb = Workbook(write_only=True)
|
||||
ws = wb.create_sheet()
|
||||
ws = wb.active
|
||||
ws.title = "decp"
|
||||
|
||||
columnSpecs = {
|
||||
'acheteur.nom': {
|
||||
'width': 7,
|
||||
'wrapText': True
|
||||
},
|
||||
'objet': {
|
||||
'width': 7,
|
||||
'wrapText': True
|
||||
},
|
||||
'titulaire.denominationSociale': {
|
||||
'width': 7,
|
||||
'wrapText': True
|
||||
},
|
||||
}
|
||||
|
||||
columns = rows[0].keys()
|
||||
if columns[0] == "rowid":
|
||||
columns = columns[1:]
|
||||
|
||||
letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
|
||||
|
||||
headers = []
|
||||
index = 0
|
||||
for col in columns :
|
||||
c = WriteOnlyCell(ws, col)
|
||||
c.fill = PatternFill("solid", fgColor="DDEFFF")
|
||||
headers.append(c)
|
||||
if col in columnSpecs:
|
||||
ws.column_dimensions[letters[index]].width = columnSpecs[col]['width'] * 5
|
||||
else:
|
||||
ws.column_dimensions[letters[index]].bestFit = True
|
||||
index = index + 1
|
||||
ws.append(headers)
|
||||
|
||||
for row in rows:
|
||||
wsRow = []
|
||||
for col in columns:
|
||||
c = WriteOnlyCell(ws, row[col])
|
||||
if col in columnSpecs :
|
||||
c.alignment = Alignment(wrapText = columnSpecs[col]['wrapText'])
|
||||
wsRow.append(c)
|
||||
ws.append(wsRow)
|
||||
|
||||
with NamedTemporaryFile() as tmp:
|
||||
wb.save(tmp.name)
|
||||
tmp.seek(0)
|
||||
return Response(
|
||||
tmp.read(),
|
||||
headers={
|
||||
'Content-Disposition': 'attachment; filename=decp.xlsx',
|
||||
'Content-type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
@hookimpl
|
||||
def register_output_renderer():
|
||||
return {"extension": "xlsx",
|
||||
"render": render_spreadsheet,
|
||||
"can_render": lambda: False}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"sql_time_limit_ms": 10000,
|
||||
"max_returned_rows": 50000,
|
||||
"num_sql_threads": 6,
|
||||
"default_cache_ttl": 3600,
|
||||
"max_csv_mb": 0,
|
||||
"force_https_urls": 1,
|
||||
"allow_facet": "off",
|
||||
"suggest_facets": "off",
|
||||
"template_debug": 1,
|
||||
"hash_urls": 1
|
||||
}
|
||||
@@ -1,178 +0,0 @@
|
||||
section.content > div.table-wrapper {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
a, a:visited, a:focus, a:active {
|
||||
color: #276890;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color: #0c286d;
|
||||
}
|
||||
|
||||
a.explore {
|
||||
font-size: 1.6em;
|
||||
}
|
||||
|
||||
a.nodec {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
nav ul {
|
||||
list-style-type: none;
|
||||
}
|
||||
|
||||
nav li {
|
||||
padding: 10px;
|
||||
border-top: solid 1px #fff;
|
||||
}
|
||||
|
||||
nav summary {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
nav .nav-menu-inner {
|
||||
padding: 10px 0;
|
||||
}
|
||||
|
||||
table.rows-and-columns td > div {
|
||||
max-height: 100px;
|
||||
font-size: 0.8em;
|
||||
overflow-y: auto;
|
||||
overflow-x: hidden;
|
||||
}
|
||||
|
||||
table.rows-and-columns tr:nth-child(even) {
|
||||
background-color: #DDEFFF;
|
||||
}
|
||||
|
||||
h4,.header4 {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
table.rows-and-columns td.col-objet > div {
|
||||
min-width: 140px;
|
||||
}
|
||||
|
||||
table.rows-and-columns td.col-procedure > div {
|
||||
min-width: 140px;
|
||||
}
|
||||
|
||||
td.col-longitude,th.col-longitude,td.col-latitude,th.col-latitude {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#sib-container form label {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.db-table .columns {
|
||||
font-size: 0.9em;
|
||||
color: #555;
|
||||
}
|
||||
|
||||
.db-presentation {
|
||||
border-left: 10px solid #276890;
|
||||
padding-left: 10px;
|
||||
max-width: 1000px;
|
||||
margin-top: 30px;
|
||||
font-size: 1.2em;
|
||||
}
|
||||
|
||||
|
||||
.versions ul ul {
|
||||
margin-left: 22px;
|
||||
}
|
||||
|
||||
div.select-wrapper {
|
||||
width: 160px;
|
||||
}
|
||||
|
||||
div.select-wrapper.filter-op {
|
||||
width: 160px;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Flaticon icon font: Flaticon
|
||||
Creation date: 22/06/2016 15:35
|
||||
*/
|
||||
|
||||
@font-face {
|
||||
font-family: "Flaticon";
|
||||
src: url("./font/Flaticon.eot");
|
||||
src: url("./font/Flaticon.eot?#iefix") format("embedded-opentype"),
|
||||
url("./font/Flaticon.woff") format("woff"),
|
||||
url("./font/Flaticon.ttf") format("truetype"),
|
||||
url("./font/Flaticon.svg#Flaticon") format("svg");
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
@media screen and (-webkit-min-device-pixel-ratio:0) {
|
||||
@font-face {
|
||||
font-family: "Flaticon";
|
||||
src: url("./font/Flaticon.svg#Flaticon") format("svg");
|
||||
}
|
||||
}
|
||||
|
||||
[class^="flaticon-"]:before, [class*=" flaticon-"]:before,
|
||||
[class^="flaticon-"]:after, [class*=" flaticon-"]:after {
|
||||
font-family: Flaticon;
|
||||
font-size: 20px;
|
||||
font-style: normal;
|
||||
font-weight: bold;
|
||||
margin-left: 20px;
|
||||
}
|
||||
|
||||
.flaticon-avatar:before { content: "\f100"; }
|
||||
.flaticon-avatar-1:before { content: "\f101"; }
|
||||
.flaticon-back:before { content: "\f102"; }
|
||||
.flaticon-book:before { content: "\f103"; }
|
||||
.flaticon-cancel:before { content: "\f104"; }
|
||||
.flaticon-chat:before { content: "\f105"; }
|
||||
.flaticon-chat-1:before { content: "\f106"; }
|
||||
.flaticon-chat-2:before { content: "\f107"; }
|
||||
.flaticon-copy:before { content: "\f108"; }
|
||||
.flaticon-dislike:before { content: "\f109"; }
|
||||
.flaticon-download:before { content: "\f10a"; }
|
||||
.flaticon-download-1:before { content: "\f10b"; }
|
||||
.flaticon-edit:before { content: "\f10c"; }
|
||||
.flaticon-envelope:before { content: "\f10d"; }
|
||||
.flaticon-folder:before { content: "\f10e"; }
|
||||
.flaticon-garbage:before { content: "\f10f"; }
|
||||
.flaticon-glasses:before { content: "\f110"; }
|
||||
.flaticon-hand:before { content: "\f111"; }
|
||||
.flaticon-headphones:before { content: "\f112"; }
|
||||
.flaticon-heart:before { content: "\f113"; }
|
||||
.flaticon-house:before { content: "\f114"; }
|
||||
.flaticon-like:before { content: "\f115"; }
|
||||
.flaticon-link:before { content: "\f116"; }
|
||||
.flaticon-logout:before { content: "\f117"; }
|
||||
.flaticon-magnifying-glass:before { content: "\f118"; }
|
||||
.flaticon-monitor:before { content: "\f119"; }
|
||||
.flaticon-musical-note:before { content: "\f11a"; }
|
||||
.flaticon-next:before { content: "\f11b"; }
|
||||
.flaticon-next-1:before { content: "\f11c"; }
|
||||
.flaticon-padlock:before { content: "\f11d"; }
|
||||
.flaticon-paper-plane:before { content: "\f11e"; }
|
||||
.flaticon-phone-call:before { content: "\f11f"; }
|
||||
.flaticon-photo-camera:before { content: "\f120"; }
|
||||
.flaticon-pie-chart:before { content: "\f121"; }
|
||||
.flaticon-piggy-bank:before { content: "\f122"; }
|
||||
.flaticon-placeholder:before { content: "\f123"; }
|
||||
.flaticon-printer:before { content: "\f124"; }
|
||||
.flaticon-reload:before { content: "\f125"; }
|
||||
.flaticon-settings:before { content: "\f126"; }
|
||||
.flaticon-settings-1:before { content: "\f127"; }
|
||||
.flaticon-share:before { content: "\f128"; }
|
||||
.flaticon-shopping-bag:before { content: "\f129"; }
|
||||
.flaticon-shopping-cart:before { content: "\f12a"; }
|
||||
.flaticon-shuffle:before { content: "\f12b"; }
|
||||
.flaticon-speaker:before { content: "\f12c"; }
|
||||
.flaticon-star:before { content: "\f12d"; }
|
||||
.flaticon-tag:before { content: "\f12e"; }
|
||||
.flaticon-upload:before { content: "\f12f"; }
|
||||
.flaticon-upload-1:before { content: "\f130"; }
|
||||
.flaticon-vector:before { content: "\f131"; }
|
||||
@@ -1,445 +0,0 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||
<!--
|
||||
2016-6-22: Created.
|
||||
-->
|
||||
<svg xmlns="http://www.w3.org/2000/svg">
|
||||
<metadata>
|
||||
Created by FontForge 20120731 at Wed Jun 22 15:35:07 2016
|
||||
By root
|
||||
Created by root with FontForge 2.0 (http://fontforge.sf.net)
|
||||
</metadata>
|
||||
<defs>
|
||||
<font id="Flaticon" horiz-adv-x="512" >
|
||||
<font-face
|
||||
font-family="Flaticon"
|
||||
font-weight="500"
|
||||
font-stretch="normal"
|
||||
units-per-em="512"
|
||||
panose-1="2 0 6 3 0 0 0 0 0 0"
|
||||
ascent="448"
|
||||
descent="-64"
|
||||
bbox="0 -64 512.001 448"
|
||||
underline-thickness="25.6"
|
||||
underline-position="-51.2"
|
||||
unicode-range="U+0020-F131"
|
||||
/>
|
||||
<missing-glyph />
|
||||
<glyph glyph-name="space" unicode=" " horiz-adv-x="200"
|
||||
/>
|
||||
<glyph glyph-name="uniF113" unicode=""
|
||||
d="M470.645 375.274c26.8105 -26.8096 41.4639 -62.4121 41.3555 -100.294c0 -37.8809 -14.7617 -73.4834 -41.5723 -100.294l-204.278 -203.519c-2.82227 -2.82227 -6.62109 -4.2334 -10.3115 -4.2334s-7.48926 1.51953 -10.3115 4.3418l-203.845 203.845
|
||||
c-26.8105 26.8105 -41.6807 62.3037 -41.6807 100.186c-0.108398 37.8818 14.6533 73.4834 41.4639 100.294c26.7012 26.7012 62.3037 41.4639 100.077 41.4639c37.8809 0 73.5918 -14.8711 100.402 -41.6807l14.2188 -14.2197l14.002 14.002
|
||||
c26.8105 26.8105 62.4131 41.5723 100.295 41.5723c37.8809 0 73.375 -14.6533 100.185 -41.4639zM449.805 195.419c21.2744 21.2744 32.9971 49.4951 32.8887 79.5615c0 30.0664 -11.6143 58.2881 -32.8887 79.5625c-21.2744 21.166 -49.4961 32.8887 -79.4541 32.8887
|
||||
s-58.2871 -11.7227 -79.5615 -32.9971l-24.3145 -24.3135c-5.75195 -5.75293 -14.9785 -5.75293 -20.7314 0l-24.5303 24.5303c-21.2754 21.2744 -49.6045 32.9971 -79.6709 32.9971c-29.958 0 -58.1797 -11.7227 -79.3457 -32.8887
|
||||
c-21.2744 -21.166 -32.8887 -49.3867 -32.8887 -79.4531s11.7227 -58.2881 32.9971 -79.5625l193.533 -193.532z" />
|
||||
<glyph glyph-name="uniF131" unicode=""
|
||||
d="M504.751 279.223c9.02734 -9.02637 9.02734 -23.5117 0.105469 -32.3281l-25.6104 -25.6104c-4.30371 -4.30371 -10.0762 -6.71777 -16.1641 -6.71777s-11.8604 2.41406 -16.1641 6.71777l-25.6104 25.6104c-8.92188 8.92188 -8.92188 23.5117 0 32.4326l1.57422 1.5752
|
||||
c-59.7227 36.9463 -136.975 35.2666 -195.123 -4.93359c3.14941 -8.18652 1.46973 -17.8438 -5.14258 -24.4561l-25.6104 -25.6104c-4.30371 -4.30371 -10.0762 -6.71777 -16.1641 -6.71777c-2.93945 0 -5.66797 0.525391 -8.29199 1.5752
|
||||
c-40.2002 -58.1484 -41.7744 -135.4 -4.93359 -195.123l0.735352 0.734375c4.30273 4.30371 10.0762 6.71777 16.1641 6.71777c6.08691 0 11.8604 -2.41406 16.1641 -6.71777l25.6104 -25.6104c8.9209 -8.92188 8.9209 -23.5107 0 -32.4326l-25.6104 -25.6104
|
||||
c-4.30371 -4.30371 -10.0771 -6.71777 -16.1641 -6.71777c-6.08789 0 -11.8613 2.41406 -16.1641 6.71777l-25.6104 25.6104c-8.92188 8.92188 -8.92188 23.5107 0 32.4326l4.30273 4.30371c-22.4619 33.6924 -34.3223 72.8428 -34.4268 113.883
|
||||
c-0.105469 25.6104 4.5127 50.4863 13.3301 73.7871l-44.7139 -44.7129c7.55762 -15.7441 4.72363 -35.2676 -8.29199 -48.2822c-7.97656 -8.08203 -18.6826 -12.4902 -30.0186 -12.4902s-22.042 4.5127 -30.0186 12.4902c-16.584 16.4785 -16.584 43.4541 0 60.0381
|
||||
c7.97656 8.08203 18.6826 12.4902 30.0186 12.4902c6.40234 0 12.5957 -1.36523 18.2627 -4.09375l80.5059 80.5049l-2.72949 2.72949c-4.30273 4.30273 -6.71777 10.0762 -6.71777 16.1641s2.41504 11.8604 6.71777 16.1641l25.8203 25.7148
|
||||
c4.30371 4.30371 10.0762 6.71777 16.1641 6.71777s11.8604 -2.41406 16.1641 -6.71777l2.72949 -2.72852l80.5049 80.5049c-2.62402 5.5625 -4.09375 11.8604 -4.09375 18.2637c0 11.335 4.51367 21.9365 12.4902 30.0186c7.97754 8.08203 18.6836 12.4902 30.0195 12.4902
|
||||
c11.335 0 21.9365 -4.51367 30.0186 -12.4902c8.08203 -7.97754 12.4902 -18.6836 12.4902 -30.0186c0 -11.3359 -4.5127 -22.042 -12.4902 -30.0195c-7.97656 -8.08203 -18.6826 -12.4902 -30.0186 -12.4902c-6.40332 0 -12.5957 1.36426 -18.2637 4.09375
|
||||
l-44.7129 -44.7139c23.1963 8.81738 47.8623 13.3301 73.3672 13.3301h0.419922c41.04 -0.104492 80.1904 -11.9648 113.883 -34.4268l3.46387 3.46387c4.30371 4.30273 10.0762 6.7168 16.1641 6.7168s11.8604 -2.41406 16.1641 -6.7168zM202.358 -15.6133
|
||||
l-17.9482 17.9482l-17.9482 -17.9482l17.9482 -17.9482zM308.579 415.357c-2.62402 -2.72949 -4.09375 -6.19336 -4.09375 -9.97168s1.46973 -7.34766 4.09375 -9.97168v0v0c2.62402 -2.62402 6.19238 -4.09277 9.97168 -4.09277c3.77832 0 7.34668 1.46875 9.9707 4.09277
|
||||
s4.09375 6.19336 4.09375 9.97168s-1.46973 7.34766 -4.09375 9.97168s-6.19238 4.09277 -9.9707 4.09277c-3.7793 0 -7.34766 -1.46875 -9.97168 -4.09277zM52.8945 119.682c5.5625 5.45801 5.5625 14.4844 0 19.9424c-2.62402 2.62402 -6.19336 4.09375 -9.97168 4.09375
|
||||
s-7.34766 -1.46973 -9.97168 -4.09375c-5.5625 -5.45801 -5.5625 -14.3789 0 -19.9424c2.62402 -2.62402 6.19336 -4.09375 9.97168 -4.09375s7.34766 1.46973 9.97168 4.09375zM180.736 249.624l17.8438 18.0527l-8.92188 8.92188v0v0l-8.92188 8.92188l-17.9482 -17.9482z
|
||||
M462.977 245.11l17.9482 17.9482l-17.9482 17.9482l-17.9482 -17.9482z" />
|
||||
<glyph glyph-name="uniF12B" unicode=""
|
||||
d="M195.743 89.7715c6.51562 -4.8877 7.70996 -14.1182 2.93164 -20.5254c-14.334 -19.1123 -33.1211 -34.8584 -54.2969 -45.6094c-22.1543 -11.2939 -46.1533 -17.0498 -71.2393 -17.0498h-40.5059c-8.14453 0 -14.6602 6.51562 -14.6602 14.6602
|
||||
s6.51562 14.6611 14.6602 14.6611h40.3975c40.5059 0 77.7549 18.5693 102.188 50.9307c4.88672 6.51562 14.0088 7.81934 20.5244 2.93262zM237.118 295.885c-6.40723 4.99609 -7.49316 14.1172 -2.71484 20.6338c30.0811 38.7686 75.3652 60.9219 124.232 60.9219h85.248
|
||||
l-45.502 45.501c-5.75488 5.75586 -5.75488 14.9863 0 20.7422c5.75586 5.75488 14.9863 5.75488 20.7422 0l70.5869 -70.5869c5.75586 -5.75586 5.75586 -14.9863 0 -20.7422l-70.5869 -70.5869c-2.82324 -2.93164 -6.62402 -4.34375 -10.3164 -4.34375
|
||||
s-7.49316 1.52051 -10.3174 4.34375c-5.75488 5.75586 -5.75488 14.9863 0 20.7422l45.502 45.501h-85.2471c-39.7461 0 -76.5596 -18.0264 -100.994 -49.5195c-2.93164 -3.69238 -7.27539 -5.64648 -11.6191 -5.64648c-3.14941 0 -6.29883 0.976562 -9.01367 3.04004z
|
||||
M419.232 102.15l70.4785 -70.4775c5.75586 -5.75586 5.75586 -14.9863 0 -20.7422l-70.5869 -70.5869c-2.82324 -2.93164 -6.625 -4.34375 -10.3164 -4.34375c-3.69238 0 -7.49316 1.52051 -10.3174 4.34375c-5.75488 5.75586 -5.75488 14.9863 0 20.7422l45.502 45.501
|
||||
h-85.2471c-86.6592 0 -157.138 70.4785 -157.138 157.138v56.4697c0 70.4785 -57.3389 127.816 -127.816 127.816h-40.5068c-8.14453 0 -14.6602 6.51562 -14.6602 14.6602s6.51562 14.6611 14.6602 14.6611h40.5068c86.6582 0 157.137 -70.4785 157.137 -157.138v-56.4697
|
||||
c0 -70.4785 57.3389 -127.816 127.817 -127.816h85.2471l-45.502 45.501c-5.75488 5.75586 -5.75488 14.9863 0 20.7412c5.75586 5.75586 14.9863 5.75586 20.7422 0z" />
|
||||
<glyph glyph-name="uniF10F" unicode=""
|
||||
d="M469.474 374.315c7.89453 0 14.2109 -6.31543 14.2109 -14.21s-6.31641 -14.2109 -14.2109 -14.2109h-25.6846v-333.895c0 -41.8945 -34.1045 -76 -76 -76h-223.578c-41.8955 0 -76 34.1055 -76 76v333.895h-25.6846c-7.89453 0 -14.2109 6.31641 -14.2109 14.2109
|
||||
s6.31641 14.21 14.2109 14.21h106.526v17.3691c0 31.0527 25.2627 56.3154 56.3154 56.3154h101.264c31.0527 0 56.3154 -25.2627 56.3154 -56.3154v-17.3691h106.526zM177.474 391.685v-17.3691h157.053v17.3691c0 15.3682 -12.5264 27.8945 -27.8945 27.8945h-101.264
|
||||
c-15.3682 0 -27.8945 -12.5264 -27.8945 -27.8945zM415.368 12h0.105469v333.895h-318.842v-333.895c0 -26.2109 21.3682 -47.5791 47.5791 -47.5791h223.578c26.2109 0 47.5791 21.3682 47.5791 47.5791zM256 15.3682c-7.89453 0 -14.2109 6.4209 -14.2109 14.3164v251.053
|
||||
c0 7.89453 6.31641 14.21 14.2109 14.21s14.2109 -6.31543 14.2109 -14.21v-251.158c0 -7.89453 -6.31641 -14.2109 -14.2109 -14.2109zM163.263 31.0527c-7.78906 0 -14.21 6.31543 -14.21 14.21v219.896c0 7.89453 6.31543 14.21 14.21 14.21
|
||||
c7.89551 0 14.2109 -6.31543 14.2109 -14.21v-219.896c0 -7.89453 -6.31543 -14.21 -14.2109 -14.21zM348.737 31.0527c-7.89551 0 -14.2109 6.31543 -14.2109 14.21v219.896c0 7.89453 6.31543 14.21 14.2109 14.21c7.89453 0 14.21 -6.31543 14.21 -14.21v-219.896
|
||||
c0 -7.89453 -6.31543 -14.21 -14.21 -14.21z" />
|
||||
<glyph glyph-name="uniF114" unicode=""
|
||||
d="M507.273 215.844c5.79199 -5.26562 6.31836 -14.2168 1.26367 -20.1133c-2.84277 -3.16016 -6.73926 -4.73926 -10.6357 -4.73926c-3.37012 0 -6.73926 1.1582 -9.47754 3.58008l-43.3867 38.8584v-87.9316v-35.8037v-117.103
|
||||
c0 -25.168 -15.7959 -44.8604 -35.8047 -44.8604h-76.0312c-18.5342 0 -33.5938 15.0586 -33.5938 33.5928v127.738c0 2.84277 -2.31641 5.15918 -5.16016 5.15918h-76.7686c-2.84375 0 -5.16016 -2.31641 -5.16016 -5.15918v-127.738
|
||||
c0 -18.5342 -15.0586 -33.5928 -33.5928 -33.5928h-74.3477h-0.841797h-0.842773c-19.7979 0 -35.8047 16.1113 -35.8047 35.8047v131.213v112.468v7.58203l-43.3867 -38.8584c-2.7373 -2.42188 -6.10742 -3.58008 -9.47754 -3.58008
|
||||
c-3.89648 0 -7.79199 1.5791 -10.6357 4.73828c-5.16016 5.89746 -4.73926 14.8486 1.1582 20.1143l240.943 215.459c5.58105 4.94922 14.0059 4.73828 19.2715 -0.316406c0.526367 -0.31543 0.947266 -0.631836 1.36914 -1.05273zM416.499 145.604v0v113.311
|
||||
l-161.226 144.166l-159.856 -142.797v-32.9609v-112.469v-131.317c0 -4.10742 3.37012 -7.37207 7.37109 -7.37207h0.842773h0.842773h74.3467c2.84375 0 5.16016 2.31641 5.16016 5.16016v127.738c0 18.5332 15.0586 33.5928 33.5928 33.5928h76.7695
|
||||
c18.5342 0 33.5928 -15.0596 33.5928 -33.5928v-127.527c0 -2.84375 2.31641 -5.16016 5.16016 -5.16016h76.0312c2.31738 0 7.37207 6.21289 7.37207 16.4277v116.996v35.8047z" />
|
||||
<glyph glyph-name="uniF128" unicode=""
|
||||
d="M405.688 119.069c50.498 0 91.6416 -41.0361 91.6416 -91.5342c0 -50.499 -41.0371 -91.5352 -91.5352 -91.5352s-91.5352 41.1426 -91.5352 91.5352c0 10.6309 1.91406 20.9434 5.31543 30.5117l-140.544 78.5645c-16.7979 -21.9004 -43.1631 -36.04 -72.7178 -36.04
|
||||
c-50.499 0 -91.6416 41.0371 -91.6416 91.5352s41.1426 91.5352 91.5352 91.5352c29.5547 0 55.9199 -14.0332 72.6113 -35.9336l140.438 78.458c-3.40234 9.46191 -5.20898 19.668 -5.20898 30.2988c0 50.499 41.0361 91.5352 91.5342 91.5352
|
||||
c50.499 0 91.5352 -41.0361 91.5352 -91.5352c0 -50.498 -41.1426 -91.5342 -91.5352 -91.5342c-29.5547 0 -55.9199 14.1387 -72.6113 35.9326l-140.545 -78.458c3.40234 -9.56836 5.20996 -19.668 5.20996 -30.2988c0 -10.5254 -1.80762 -20.7314 -5.10352 -30.1924
|
||||
l140.651 -78.5654c16.7979 21.6875 43.0566 35.7207 72.5049 35.7207zM405.688 419.189c-34.5518 0 -62.8301 -28.1729 -62.8301 -62.8311c0 -34.6572 28.1729 -62.8301 62.8301 -62.8301c34.6582 0 62.8311 28.1729 62.8311 62.8301
|
||||
c0 34.6582 -28.1729 62.8311 -62.8311 62.8311zM106.312 129.275c34.5518 0 62.8301 28.1729 62.8301 62.8311c0 34.6572 -28.1729 62.8301 -62.8301 62.8301c-34.6582 0 -62.8311 -28.1729 -62.8311 -62.8301c0 -34.6582 28.1729 -62.8311 62.8311 -62.8311z
|
||||
M405.688 -35.1895c34.6582 0 62.8311 28.1729 62.8311 62.8311c0 34.6572 -28.1729 62.8301 -62.8311 62.8301c-34.6572 0 -62.8301 -28.1729 -62.8301 -62.8301c0 -34.6582 28.1729 -62.8311 62.8301 -62.8311z" />
|
||||
<glyph glyph-name="uniF102" unicode=""
|
||||
d="M155.784 192.014l231.12 -231.228c5.68652 -5.6875 5.68652 -14.8076 0 -20.4941c-2.79004 -2.89746 -6.54492 -4.29199 -10.1934 -4.29199s-7.40332 1.50195 -10.1934 4.29199l-241.528 241.421c-5.68652 5.68652 -5.68652 14.8066 0 20.4941l241.528 241.528
|
||||
c5.68652 5.68652 14.8076 5.68652 20.4941 0c5.68652 -5.6875 5.68652 -14.8076 0 -20.4941z" />
|
||||
<glyph glyph-name="uniF121" unicode=""
|
||||
d="M442.611 179.047c7.95508 0 14.5127 -6.55762 14.5127 -14.5117c0 -125.984 -102.551 -228.535 -228.535 -228.535s-228.535 102.551 -228.535 228.535s102.551 228.535 228.535 228.535c8.06152 0 14.5117 -6.4502 14.5117 -14.5127v-199.511h199.511zM228.589 -34.9766
|
||||
c105.13 0 191.557 81.6963 198.974 185h-198.974c-8.0625 0 -14.5117 6.44922 -14.5117 14.5117v198.974c-103.304 -7.41699 -185 -93.8438 -185 -198.974c0 -109.968 89.5439 -199.512 199.512 -199.512zM511.946 220.218v-0.75293
|
||||
c0 -8.06152 -6.4502 -14.5117 -14.5117 -14.5117v0h-214.023c-8.06152 0 -14.5117 6.4502 -14.5117 14.5117v214.023c0 8.0625 6.4502 14.5117 14.5117 14.5117c65.5723 0 127.92 -28.1641 171.348 -77.2891c36.6562 -41.6006 56.9727 -95.0254 57.1875 -150.493z
|
||||
M297.923 233.869h184.462c-3.22461 43.4287 -20.4238 84.707 -49.4473 117.492c-34.6133 39.2363 -83.2012 63.208 -135.015 66.9697v-184.462z" />
|
||||
<glyph glyph-name="uniF104" unicode=""
|
||||
d="M437.01 373.01c48.377 -48.377 74.9902 -112.592 74.9902 -181.01s-26.6133 -132.633 -74.9902 -181.01s-112.592 -74.9902 -181.01 -74.9902s-132.633 26.6133 -181.01 74.9902s-74.9902 112.592 -74.9902 181.01s26.6133 132.633 74.9902 181.01
|
||||
s112.592 74.9902 181.01 74.9902s132.633 -26.6133 181.01 -74.9902zM416.431 31.5693c88.458 88.458 88.458 232.403 0 320.861c-42.8818 42.8828 -99.8789 66.4785 -160.431 66.4785s-117.549 -23.5957 -160.431 -66.4785c-88.458 -88.458 -88.458 -232.403 0 -320.861
|
||||
c42.8818 -42.8828 99.8789 -66.4785 160.431 -66.4785s117.549 23.5957 160.431 66.4785zM368.808 304.809c5.71094 -5.71094 5.71094 -14.8691 0.000976562 -20.5801l-92.2295 -92.2285l92.0137 -92.2285c5.70996 -5.71094 5.70996 -14.8691 0 -20.5801
|
||||
c-2.80176 -2.9082 -6.46484 -4.30957 -10.2363 -4.30957c-3.66309 0 -7.43359 1.50879 -10.2354 4.30957l-92.2285 92.2295l-92.2295 -92.2295c-2.80078 -2.9082 -6.57227 -4.30957 -10.2354 -4.30957s-7.43457 1.50879 -10.2354 4.30957
|
||||
c-5.71094 5.71094 -5.71094 14.8691 0 20.5801l92.2285 92.2285l-92.2285 92.2285c-5.71094 5.71094 -5.71094 14.8691 0 20.5801c5.70996 5.70996 14.8682 5.70996 20.5791 0l92.2285 -92.2295l92.2285 92.2295c5.71094 5.70996 14.8691 5.70996 20.5791 0z" />
|
||||
<glyph glyph-name="uniF12E" unicode=""
|
||||
d="M502.712 222.068c12.3838 -16.8975 12.3838 -43.3447 0 -60.1367l-87.6338 -119.538c-11.4395 -15.7432 -34.8428 -27.6025 -54.3643 -27.6025h-319.573c-22.6689 0 -41.1406 18.4717 -41.1406 41.1406v272.137c0 22.6689 18.4717 41.1406 41.1406 41.1406h319.573
|
||||
c19.416 0 42.8203 -11.8594 54.3643 -27.6025zM479.833 178.514c5.14258 7.03223 5.14258 19.8359 0.104492 26.8672l-87.6328 119.539c-6.19238 8.29102 -21.2002 15.9521 -31.5908 15.9521h-319.573c-7.03223 0 -12.8037 -5.77246 -12.8037 -12.8037v-272.241
|
||||
c0 -7.03223 5.77148 -12.8037 12.8037 -12.8037h319.469c10.3896 0 25.5029 7.55566 31.5898 15.9521z" />
|
||||
<glyph glyph-name="uniF11E" unicode=""
|
||||
d="M507.617 443.548c4.36621 -4.25781 5.56738 -10.6982 3.16602 -16.2656l-209.041 -482.267c-2.29199 -5.13086 -7.0957 -8.51465 -12.6621 -8.8418h-0.874023c-5.12988 0 -10.042 2.83789 -12.6621 7.31348l-99.8809 169.962l-168.215 95.4053
|
||||
c-4.80371 2.72852 -7.75098 7.96875 -7.42285 13.5352c0.327148 5.56738 3.71094 10.4795 8.8418 12.7725l482.485 211.441c5.45801 2.40234 12.0078 1.20117 16.2646 -3.05566zM430.878 387.985l-383.259 -167.997l136.34 -77.2852zM286.241 -16.5605l167.015 385.225
|
||||
l-248.338 -246.701z" />
|
||||
<glyph glyph-name="uniF105" unicode=""
|
||||
d="M436.978 372.942c48.3584 -48.3584 74.9502 -112.693 74.9502 -180.996s-26.5918 -132.638 -74.9502 -180.996s-112.586 -74.9502 -180.996 -74.9502c-42.4609 0 -84.1719 10.5078 -121.271 30.4521c-27.5566 -18.9795 -60.582 -29.8086 -91.999 -29.8086v0
|
||||
c-6.32617 0 -12.4385 0.536133 -18.1211 1.39355c-10.4004 1.6084 -18.335 9.65039 -19.9434 20.0508c-1.50195 10.2939 3.75293 20.373 13.0811 24.9844c15.2256 7.50488 28.8438 23.1602 40.3164 46.6426c-83.0996 101.006 -76.3438 250.049 16.9414 343.335
|
||||
c48.3594 48.3584 112.587 74.9502 180.996 74.9502c68.4102 0 132.638 -26.6992 180.996 -75.0576zM416.498 31.4307c88.5674 88.46 88.5674 232.571 0 321.246c-42.8906 42.8906 -99.8271 66.4795 -160.517 66.4795c-60.582 0 -117.626 -23.5889 -160.516 -66.4795
|
||||
c-84.708 -84.708 -88.8896 -221.312 -9.54297 -310.953c3.75293 -4.28906 4.71777 -10.293 2.46582 -15.4404c-12.1162 -27.7705 -26.5918 -47.7148 -43.8545 -60.582c14.4746 0.322266 47.5 4.0752 80.3115 29.4873c2.57324 1.92969 5.79004 3.00195 8.89941 3.00195
|
||||
c2.46582 0 5.04004 -0.75 7.29102 -2.03711c34.6338 -20.373 74.415 -31.2021 114.945 -31.2021c60.583 0 117.626 23.5889 160.517 66.4795zM320.96 309.251c23.0537 0 44.8203 -9.00684 61.2256 -25.4131c16.2988 -16.4053 25.3057 -38.1719 25.3057 -61.332
|
||||
c0 -23.0537 -9.00684 -44.8203 -25.4131 -61.2256l-116.018 -115.589c-2.78711 -2.78809 -6.54004 -4.18164 -10.1855 -4.18164c-3.64648 0 -7.39941 1.50098 -10.1865 4.28906l-115.696 115.695c-16.2979 16.4053 -25.4121 38.0654 -25.4121 61.2256
|
||||
c-0.107422 23.0537 8.89941 44.8203 25.3047 61.2256c16.2988 16.2988 38.0654 25.3057 61.1182 25.3057c23.1611 0 44.9277 -9.00684 61.333 -25.4131l3.64551 -3.64551l3.64551 3.64551c16.4062 16.4062 38.1729 25.4131 61.333 25.4131zM361.599 181.76
|
||||
c10.9365 10.9375 16.9414 25.4121 16.9414 40.8525c0.107422 15.334 -5.89746 29.8086 -16.834 40.7461c-10.9375 10.9365 -25.4131 16.9414 -40.7461 16.9414c-15.4404 0 -29.916 -6.00488 -40.8525 -16.9414l-13.832 -13.832
|
||||
c-5.68262 -5.68262 -14.7969 -5.68262 -20.4805 0l-13.9385 13.9395c-10.9375 10.9365 -25.4131 16.9414 -40.8535 16.9414s-29.915 -6.00488 -40.7451 -16.835c-10.8301 -10.8291 -16.834 -25.3047 -16.834 -40.7451s6.00391 -29.916 16.9414 -40.8525l105.51 -105.51z" />
|
||||
<glyph glyph-name="uniF10A" unicode=""
|
||||
d="M169.312 237.642c5.55859 5.66504 14.751 5.66504 20.416 0l51.8418 -51.8408v247.77c0 8.0166 6.41309 14.4297 14.4297 14.4297s14.4297 -6.41309 14.4297 -14.4297v-247.77l51.8418 51.8408c5.66504 5.66504 14.751 5.66504 20.416 0s5.66504 -14.751 0 -20.416
|
||||
l-76.5332 -76.5322c-2.7793 -2.88672 -6.52051 -4.27539 -10.1543 -4.27539s-7.375 1.49609 -10.1543 4.27539l-76.5332 76.5322c-5.66504 5.66504 -5.66504 14.751 0 20.416zM491.905 119.422c0.426758 -1.17578 0.53418 -2.45801 0.53418 -3.84766v-75.4639
|
||||
c0 -57.3994 -46.7109 -104.11 -104.11 -104.11h-264.658c-57.3994 0 -104.11 46.7109 -104.11 104.11v75.7842c0 1.2832 0.213867 2.56543 0.53418 3.84863l50.2383 181.712c1.06934 4.16797 4.06152 7.48145 7.91016 9.29883l1.38965 0.641602
|
||||
c1.92383 0.855469 3.95508 1.28223 5.98535 1.28223h90.6426c8.0166 0 14.4297 -6.41309 14.4297 -14.4297s-6.41309 -14.4297 -14.4297 -14.4297h-80.8086l-42.6484 -154.028h107.851c8.01758 0 14.4307 -6.41309 14.4307 -14.4297v-13.04
|
||||
c0 -19.1338 15.499 -34.6328 34.6318 -34.6328h88.0771c19.1328 0 34.6318 15.499 34.6318 34.6328v13.04c0 8.0166 6.41309 14.4297 14.4307 14.4297h112.233l-42.4355 153.707h-80.8076c-8.0166 0 -14.4307 6.41309 -14.4307 14.4307
|
||||
c0 8.0166 6.41406 14.4297 14.4307 14.4297h90.5352c2.03027 0 4.06152 -0.427734 5.98535 -1.28223l1.38965 -0.641602c3.84863 -1.81738 6.73438 -5.13086 7.91016 -9.2998zM463.579 40.1104h0.213867v60.8203h-102.293
|
||||
c-0.748047 -34.3115 -28.9668 -61.9961 -63.4922 -61.9961h-88.0771c-34.5254 0 -62.7441 27.6846 -63.4922 61.9961h-98.0176v-60.8203c0 -41.4736 33.7773 -75.25 75.25 -75.25h264.658c41.4727 0 75.25 33.7764 75.25 75.25z" />
|
||||
<glyph glyph-name="uniF127" unicode=""
|
||||
d="M270.924 198.449c33.4727 -6.71582 58.6299 -36.3506 58.6299 -71.6348c0 -35.3916 -25.2637 -64.9199 -58.6299 -71.6357v-104.682c0 -7.99414 -6.39551 -14.3906 -14.3906 -14.3906s-14.3916 6.39648 -14.3916 14.3906v104.682
|
||||
c-33.3652 6.71582 -58.6299 36.2441 -58.6299 71.6357c0 35.3906 25.2646 64.9189 58.6299 71.6348v235.16c0 7.99414 6.39648 14.3906 14.3916 14.3906s14.3906 -6.39648 14.3906 -14.3906v-235.16zM256.533 82.5752c24.4111 0 44.2393 19.8271 44.2393 44.2393
|
||||
c0 24.4111 -19.8281 44.2383 -44.2393 44.2383s-44.2393 -19.8271 -44.2393 -44.2383c0 -24.4121 19.8281 -44.2393 44.2393 -44.2393zM94.7139 319.12c33.3662 -6.71582 58.6299 -36.1367 58.6299 -71.5283c0 -35.3906 -25.2637 -64.9189 -58.6299 -71.6348v-225.459
|
||||
c0 -7.99512 -6.39551 -14.3916 -14.3906 -14.3916s-14.3916 6.39648 -14.3916 14.3916v225.352c-33.3652 6.71582 -58.6299 36.2441 -58.6299 71.6357s25.2646 64.9189 58.6299 71.6348v114.489c0 7.99414 6.39648 14.3906 14.3916 14.3906
|
||||
s14.3906 -6.39648 14.3906 -14.3906v-114.489zM80.3232 203.246c24.3047 0 44.2393 19.8281 44.2393 44.2393s-19.8281 44.2393 -44.2393 44.2393s-44.2393 -19.8281 -44.2393 -44.2393s19.8281 -44.2393 44.2393 -44.2393zM446.068 319.12
|
||||
c33.4717 -6.71582 58.6299 -36.1367 58.6299 -71.5283c0 -35.3906 -25.2646 -64.9189 -58.6299 -71.6348v-225.566c0 -7.99414 -6.39648 -14.3906 -14.3916 -14.3906s-14.3906 6.39648 -14.3906 14.3906v225.459c-33.3662 6.71582 -58.6299 36.2441 -58.6299 71.6357
|
||||
s25.2637 64.9189 58.6299 71.6348v114.489c0 7.99414 6.39551 14.3906 14.3906 14.3906s14.3916 -6.39648 14.3916 -14.3906v-114.489zM431.677 203.246c24.4111 0 44.2393 19.8281 44.2393 44.2393s-19.8281 44.2393 -44.2393 44.2393s-44.2393 -19.8281 -44.2393 -44.2393
|
||||
s19.8281 -44.2393 44.2393 -44.2393z" />
|
||||
<glyph glyph-name="uniF101" unicode=""
|
||||
d="M452.09 -42.9824c2.16699 -4.55078 1.8418 -9.8584 -0.758789 -14.1924c-2.59961 -4.22461 -7.36621 -6.8252 -12.3506 -6.8252h-365.961c-4.98438 0 -9.64258 2.60059 -12.3506 6.8252c-2.60059 4.22559 -2.92578 9.53418 -0.758789 14.084
|
||||
c24.1592 50.1602 66.8438 89.3779 118.195 108.878v29.793c-30.876 1.2998 -56.9854 7.69238 -77.8936 18.959c-18.3096 9.8584 -25.8926 20.042 -27.1934 21.9922c-3.25 4.76758 -4.33301 10.9424 -1.4082 15.8174c2.81738 4.7666 7.25879 7.58398 12.7842 7.15039
|
||||
c1.625 0.433594 7.9082 2.59961 14.5166 13.542c8.01758 13.3252 17.334 41.0596 16.0342 97.7197c-1.2998 56.5518 9.31738 100.212 31.5264 129.68c19.0674 25.3506 41.6016 33.9092 53.7344 38.459l0.650391 0.216797c15.3838 5.95898 30.4424 8.88379 44.8516 8.88379
|
||||
c30.876 0 51.0264 -13.542 60.2354 -21.5586h2.81641c24.1592 0 44.2021 -8.66699 59.5859 -25.6768c14.1914 -15.8164 23.9424 -38.459 28.8174 -67.2764c4.22461 -25.1348 4.7666 -54.3857 1.5166 -86.8867c-7.47559 -76.2686 29.793 -89.0527 30.2256 -89.1611
|
||||
c4.9834 -1.4082 8.88379 -5.30859 10.1836 -10.292c1.30078 -4.9834 -0.108398 -10.292 -3.68262 -13.9756c-28.2764 -28.9258 -76.4863 -35.4258 -102.054 -36.834v-31.3096c52.002 -19.6094 94.9033 -58.502 118.737 -108.012zM97.9365 -34.6406v-0.216797h315.802
|
||||
c-23.292 35.3184 -58.502 62.1855 -99.6699 75.5107c-6.06641 1.9502 -10.1836 7.47559 -10.1836 13.8672v56.0098c0 4.00879 1.625 7.80078 4.44238 10.5088c2.81641 2.70898 6.7168 4.22559 10.6162 4.11719h2.16699c23.9424 0 55.6855 4.6582 78.0029 17.0088
|
||||
c-16.5762 14.9502 -35.751 45.7178 -29.6846 107.146c6.06641 60.8848 -2.38379 108.878 -22.9678 131.629c-9.75 10.834 -22.209 16.0342 -37.918 16.0342c-2.27441 0 -4.6582 -0.108398 -7.04102 -0.325195c-4.87598 -0.433594 -9.53418 1.4082 -12.5674 5.2002
|
||||
c-1.19238 1.4082 -15.4922 16.792 -43.4434 16.792c-10.7256 0 -22.3174 -2.38379 -34.4512 -6.93359l-0.649414 -0.216797c-20.584 -7.7998 -69.0107 -26.2168 -66.1943 -140.079c1.4082 -61.6436 -8.66699 -104.112 -30.0088 -126.321
|
||||
c-1.08398 -1.08301 -2.16699 -2.05762 -3.14258 -3.0332c13.8672 -8.2334 39.3262 -17.875 81.4697 -17.4424c3.90039 0.108398 7.58301 -1.5166 10.4004 -4.22461c2.81641 -2.70898 4.33301 -6.50098 4.33301 -10.4004v-54.4941
|
||||
c0 -6.2832 -4.11621 -11.917 -10.1836 -13.8662c-40.626 -13.1094 -75.7275 -40.3018 -99.1279 -76.2695z" />
|
||||
<glyph glyph-name="uniF106" unicode=""
|
||||
d="M436.939 372.958c48.3486 -48.3486 74.9355 -112.777 74.9355 -181.065s-26.5869 -132.609 -74.9355 -180.958c-48.3477 -48.3486 -112.562 -74.9346 -180.958 -74.9346c-42.4521 0 -84.1533 10.5059 -121.246 30.4453
|
||||
c-27.5508 -18.9746 -60.5693 -29.8018 -91.9795 -29.8018v0c-6.3252 0 -12.4355 0.536133 -18.1172 1.39355c-10.3994 1.60742 -18.332 9.64844 -19.9404 20.0469c-1.5 10.291 3.75293 20.3682 13.0791 24.9775c15.3301 7.50488 28.8379 23.1562 40.3086 46.6338
|
||||
c-83.082 100.984 -76.3291 249.996 16.9375 343.263c48.3486 48.3486 112.563 75.042 180.958 75.042c68.3955 0 132.61 -26.6934 180.958 -75.042zM416.464 31.5176c88.5498 88.4424 88.5498 232.522 0 321.18c-42.8809 42.8809 -99.9121 66.4648 -160.482 66.4648
|
||||
c-60.5693 0 -117.601 -23.584 -160.482 -66.4648c-84.6895 -84.6904 -88.8711 -221.267 -9.54102 -310.889c3.75195 -4.28809 4.7168 -10.291 2.46582 -15.4365c-12.1133 -27.7656 -26.5859 -47.7051 -43.8457 -60.5693c14.4727 0.321289 47.4912 4.07324 80.2949 29.4805
|
||||
c2.57227 1.92969 5.78906 3.00195 8.89746 3.00195c2.46582 0 5.03906 -0.750977 7.29004 -2.03711c34.626 -20.3691 74.3984 -31.1963 114.921 -31.1963c60.5703 0 117.602 23.585 160.482 66.4658zM363.185 276.476c7.93262 0 14.4727 -6.43164 14.4727 -14.4727
|
||||
c0 -8.04004 -6.43262 -14.4717 -14.4727 -14.4717h-214.405c-8.04004 0 -14.4727 6.43164 -14.4727 14.4717c0 8.04102 6.43262 14.4727 14.4727 14.4727h214.405zM363.185 206.473c7.93262 0 14.4727 -6.43262 14.4727 -14.4727s-6.43262 -14.4727 -14.4727 -14.4727
|
||||
h-214.405c-8.04004 0 -14.4727 6.43262 -14.4727 14.4727s6.43262 14.4727 14.4727 14.4727h214.405zM363.185 136.469c7.93262 0 14.4727 -6.43164 14.4727 -14.4717c0 -8.04102 -6.43262 -14.4727 -14.4727 -14.4727h-214.405
|
||||
c-8.04004 0 -14.4727 6.43164 -14.4727 14.4727c0 8.04004 6.43262 14.4717 14.4727 14.4717h214.405z" />
|
||||
<glyph glyph-name="uniF10B" unicode=""
|
||||
d="M497.331 197.922c8.14941 0 14.6689 -6.62793 14.6689 -14.6689v-133.433c0 -52.374 -42.5938 -95.0762 -95.0762 -95.0762h-321.848c-52.373 0 -95.0762 42.5938 -95.0762 95.0762v135.605c0 8.14941 6.51953 14.6689 14.6689 14.6689
|
||||
s14.6689 -6.51953 14.6689 -14.6689v-135.605c0 -36.1836 29.4463 -65.7393 65.7383 -65.7393h321.848c36.1836 0 65.7383 29.4473 65.7383 65.7393v133.433c0 8.14941 6.51953 14.6689 14.6689 14.6689zM245.678 71.2256l-93.3379 93.2295
|
||||
c-5.75879 5.75879 -5.75879 14.9951 0 20.7539s14.9941 5.75879 20.7539 0l68.2373 -68.2383v297.617c0 8.14941 6.51953 14.6689 14.6689 14.6689s14.6689 -6.51953 14.6689 -14.6689v-297.617l68.1289 68.2383c5.75879 5.75879 14.9951 5.75879 20.7539 0
|
||||
s5.75879 -14.9951 0 -20.7539l-93.2295 -93.2295c-2.8252 -2.93359 -6.62793 -4.3457 -10.3223 -4.3457s-7.49707 1.52051 -10.3223 4.3457z" />
|
||||
<glyph glyph-name="uniF119" unicode=""
|
||||
d="M448.851 421.953c34.8701 0 63.1494 -28.2783 63.1494 -63.1494v-244.624c0 -34.8711 -28.3857 -63.1494 -63.1494 -63.1494h-178.498v-60.2793h88.9834c7.97266 0 14.3516 -6.37891 14.3516 -14.3525s-6.37891 -14.3516 -14.3516 -14.3516h-206.672
|
||||
c-7.97266 0 -14.3516 6.37793 -14.3516 14.3516s6.37891 14.3525 14.3516 14.3525h88.9834v60.2793h-178.498c-34.8701 0 -63.1494 28.3848 -63.1494 63.1494v244.624c0 34.8711 28.3857 63.1494 63.1494 63.1494h385.701zM63.1494 393.249
|
||||
c-19.0303 0 -34.4453 -15.415 -34.4453 -34.4453v-204.438h454.698v204.438c0 19.0303 -15.5225 34.4453 -34.4453 34.4453h-385.808zM448.851 79.7344c19.0303 0 34.4453 15.5215 34.4453 34.4453v11.4814h-454.592v-11.4814c0 -19.0303 15.5215 -34.4453 34.4453 -34.4453
|
||||
h385.701z" />
|
||||
<glyph glyph-name="uniF11B" unicode=""
|
||||
d="M506.858 221.764c3.25293 -2.72852 5.1416 -6.82031 5.1416 -11.0176s-1.88867 -8.18457 -5.1416 -10.9121l-226.013 -186.98c-4.30176 -3.46191 -10.0732 -4.19727 -15.1094 -1.88867c-5.03711 2.30859 -8.18457 7.34473 -8.18457 12.8018v97.8965
|
||||
c-91.3916 -0.314453 -154.452 -6.82031 -231.049 -141.861c-2.51855 -4.51172 -7.24023 -7.13477 -12.2773 -7.13477c-1.15332 0 -2.41309 0.104492 -3.56738 0.419922c-6.29492 1.67871 -10.5977 7.34473 -10.5977 13.7451v11.332
|
||||
c-0.314453 49.001 -0.628906 123.079 33.1572 185.616c39.2432 72.5039 114.686 111.223 224.439 115.21v98.2109c0 5.45703 3.14746 10.4932 8.0791 12.8018s10.8076 1.57324 15.0049 -1.88867zM285.987 53.8799l189.498 156.866l-189.604 156.446v-82.0527
|
||||
c0 -7.76465 -6.29492 -14.0605 -14.0596 -14.165c-107.761 -0.944336 -177.642 -33.9961 -213.736 -100.73c-22.7695 -42.0752 -28.2256 -91.8105 -29.4854 -133.467c31.374 45.6436 63.167 74.708 99.8906 91.8105c42.4961 19.832 86.25 21.4053 143.331 21.4053
|
||||
c3.67188 0 7.34473 -1.57324 9.96777 -4.19629c2.72852 -2.62402 4.19727 -6.19141 4.19727 -9.96875v-81.9482z" />
|
||||
<glyph glyph-name="uniF103" unicode=""
|
||||
d="M445.14 314.912c7.80371 0 14.0254 -6.32812 14.1309 -14.0264v-350.859c0 -7.69922 -6.22168 -14.0264 -14.0254 -14.0264h-311.946c-44.3975 0 -80.5693 36.1719 -80.5693 80.5703v350.859c0 44.3984 36.1719 80.5703 80.5693 80.5703h311.946
|
||||
c7.69824 0 14.0254 -6.22168 14.0254 -14.0264c0 -7.69824 -6.22168 -14.0254 -14.0254 -14.0254h-311.946c-29.001 0 -52.5176 -23.623 -52.5176 -52.5186c0 -29.001 23.6221 -52.5176 52.5176 -52.5176h311.841zM431.113 -35.9482v0v322.702h-297.814
|
||||
c-20.0371 0 -38.3867 7.38281 -52.5176 19.5098v-289.693c0 -29.001 23.6221 -52.5186 52.5176 -52.5186h297.814zM137.729 380.19h263.435c7.69824 0 14.0264 -6.32715 14.0264 -14.0264c0 -7.69824 -6.22266 -14.0254 -14.0264 -14.0254h-263.435
|
||||
c-7.69824 0 -14.0264 6.32715 -14.0264 14.0254c0 7.69922 6.22266 14.0264 14.0264 14.0264zM187.083 25.4287c-7.27637 2.63672 -11.0732 10.6514 -8.75293 18.0332l64.1182 179.174v0c0.105469 0.421875 0.316406 0.84375 0.527344 1.26562l0.316406 0.632812
|
||||
l0.316406 0.632812s0.316406 0.421875 0.421875 0.632812c0.105469 0.105469 0.210938 0.31543 0.316406 0.420898c0.210938 0.210938 0.316406 0.421875 0.527344 0.632812c0.210938 0.105469 0.316406 0.316406 0.421875 0.421875l0.527344 0.527344l0.527344 0.527344
|
||||
c0.105469 0.210938 0.316406 0.316406 0.421875 0.421875c0.210938 0.210938 0.421875 0.316406 0.632812 0.527344c0.105469 0.105469 0.316406 0.210938 0.421875 0.316406c0.316406 0.105469 0.527344 0.316406 0.738281 0.421875l0.632812 0.316406l0.632812 0.316406
|
||||
c0.421875 0.210938 0.84375 0.421875 1.26465 0.527344v0h0.105469c0.316406 0.105469 0.738281 0.210938 1.16016 0.316406c0.210938 0 0.316406 0.105469 0.527344 0.105469c0.316406 0.105469 0.527344 0.210938 0.84375 0.210938
|
||||
c0.210938 0.105469 0.421875 0.105469 0.632812 0.105469c0.210938 0.105469 0.527344 0.105469 0.738281 0.105469h0.738281h0.632812s0.527344 -0.105469 0.738281 -0.105469c0.210938 -0.105469 0.421875 -0.105469 0.632812 -0.105469
|
||||
c0.316406 -0.105469 0.527344 -0.105469 0.84375 -0.210938c0.210938 0 0.316406 -0.105469 0.527344 -0.105469l1.26562 -0.316406h0.105469v0c0.421875 -0.105469 0.842773 -0.316406 1.26465 -0.527344l0.632812 -0.316406l0.632812 -0.316406
|
||||
s0.421875 -0.316406 0.632812 -0.421875c0.105469 -0.105469 0.316406 -0.210938 0.421875 -0.316406c0.210938 -0.210938 0.421875 -0.316406 0.632812 -0.527344c0.105469 -0.210938 0.316406 -0.316406 0.421875 -0.421875l0.527344 -0.527344
|
||||
s0.421875 -0.316406 0.527344 -0.527344c0.210938 -0.105469 0.316406 -0.316406 0.421875 -0.421875c0.210938 -0.210938 0.421875 -0.421875 0.527344 -0.632812c0.105469 -0.104492 0.210938 -0.31543 0.316406 -0.420898
|
||||
c0.105469 -0.316406 0.316406 -0.527344 0.421875 -0.738281l0.316406 -0.632812l0.316406 -0.632812c0.210938 -0.421875 0.421875 -0.84375 0.527344 -1.26562v0l63.9072 -179.174c2.63672 -7.27637 -1.16016 -15.291 -8.43652 -17.9277
|
||||
c-1.58203 -0.527344 -3.16406 -0.84375 -4.74512 -0.84375c-5.69531 0 -11.1787 3.58594 -13.1826 9.28027l-17.084 47.8779c-0.527344 -0.105469 -1.16016 -0.105469 -1.6875 -0.105469h-65.8066l-17.084 -47.7725c-2.00391 -5.69434 -7.38184 -9.28027 -13.1816 -9.28027
|
||||
c-1.58203 0 -3.16406 0.316406 -4.74609 0.84375zM255.947 176.129l-23.834 -66.4395h47.5625z" />
|
||||
<glyph glyph-name="uniF12C" unicode=""
|
||||
d="M298.227 389.779c7.91797 0 14.252 -6.43945 14.252 -14.251v-367.057c0 -7.91699 -6.33398 -14.252 -14.252 -14.252c-35.3643 0 -69.9902 9.39551 -100.288 27.2363c-27.0254 15.9414 -49.9336 38.1104 -66.7188 64.502h-75.5859
|
||||
c-30.7197 0 -55.6338 24.9141 -55.6338 55.6338v100.816c0 30.7197 24.9141 55.6338 55.6338 55.6338h75.5859c16.7852 26.3916 39.6934 48.5605 66.7188 64.502c30.2979 17.8408 64.9238 27.2354 100.288 27.2354zM124.991 114.461v155.078h-69.3574
|
||||
c-14.9902 0 -27.1309 -12.1406 -27.1309 -27.1309v-100.816c0 -14.9902 12.1406 -27.1309 27.1309 -27.1309h69.3574zM283.976 23.251v337.393c-53.5225 -4.54004 -102.295 -34.626 -130.481 -80.8643v-175.664c28.1865 -46.2383 76.959 -76.3252 130.481 -80.8643z
|
||||
M368.323 302.37c36.1045 -25.125 57.7451 -66.7178 57.7451 -110.634s-21.6406 -85.1924 -57.7451 -110.424c-2.42773 -1.68848 -5.27832 -2.5332 -8.12891 -2.5332c-4.53906 0 -8.97266 2.11133 -11.7178 6.12305c-4.43359 6.43945 -2.85059 15.3076 3.58984 19.8467
|
||||
c28.5029 19.8467 45.499 52.4668 45.499 87.0928s-16.9961 67.2461 -45.499 87.0928c-6.5459 4.53906 -8.12891 13.4072 -3.58984 19.8467c4.53906 6.54492 13.4072 8.12891 19.8467 3.58887zM423.43 361.382c55.5283 -38.6367 88.5703 -101.978 88.5703 -169.435
|
||||
s-33.1484 -130.798 -88.5703 -169.436c-2.42871 -1.68848 -5.27832 -2.5332 -8.12891 -2.5332c-4.53906 0 -8.97363 2.11133 -11.7178 6.12305c-4.43457 6.43945 -2.85059 15.3066 3.58887 19.8467c47.8223 33.2529 76.3252 87.9375 76.3252 145.999
|
||||
s-28.5029 112.64 -76.3252 145.999c-6.54492 4.53906 -8.12891 13.4072 -3.58887 19.8467c4.53906 6.54492 13.4062 8.12891 19.8467 3.58887z" />
|
||||
<glyph glyph-name="uniF129" unicode=""
|
||||
d="M460.8 5.41797c0.104492 -0.417969 0.104492 -0.836914 0.104492 -1.25586c0 -37.5889 -34.4473 -68.1621 -76.8516 -68.1621h-256.105c-42.4043 0 -76.8516 30.5732 -76.8516 68.1621c0 0.418945 0.104492 0.837891 0.104492 1.25586l29.3164 330.131
|
||||
c0.628906 7.3291 6.70117 12.8779 14.0303 12.8779h60.3096c0.837891 55.0742 45.8604 99.5732 101.144 99.5732s100.306 -44.499 101.144 -99.5732h60.3096c7.22461 0 13.4014 -5.54883 14.0303 -12.8779zM256 419.73c-39.6826 0 -72.0361 -31.8301 -72.874 -71.3037
|
||||
h145.748c-0.837891 39.4736 -33.1914 71.3037 -72.874 71.3037zM384.053 -35.7305c26.4893 0 48.1631 17.5908 48.582 39.2646l-28.165 316.519h-47.3262v-42.9287c0 -7.85254 -6.28223 -14.1348 -14.1348 -14.1348s-14.1348 6.28223 -14.1348 14.1348v42.9287h-145.853
|
||||
v-42.9287c0 -7.85254 -6.28223 -14.1348 -14.1348 -14.1348s-14.1348 6.28223 -14.1348 14.1348v42.9287h-47.3262l-28.0605 -316.519c0.418945 -21.6738 21.9873 -39.2646 48.582 -39.2646h256.105z" />
|
||||
<glyph glyph-name="uniF109" unicode=""
|
||||
d="M489.891 284.098c10.4932 -13.4912 15.418 -27.7324 14.9902 -42.5088c-0.642578 -16.2744 -7.92383 -29.0166 -13.9199 -36.833c6.95996 -17.3457 9.74414 -44.543 -13.5986 -65.8506c-16.917 -15.5254 -45.9346 -22.4854 -85.9805 -20.5586
|
||||
c-28.1602 1.28516 -51.7168 6.53223 -52.6797 6.74609h-0.107422c-5.46094 0.963867 -11.1357 2.1416 -16.918 3.42676c-0.427734 -6.85352 0.75 -23.8779 13.3848 -62.2109c14.9902 -45.6133 14.0264 -80.5195 -2.78418 -103.861
|
||||
c-17.7744 -24.5195 -46.2559 -26.4473 -54.501 -26.4473c-8.1377 0 -15.418 3.31934 -20.665 9.42285c-11.7783 13.8125 -10.3857 39.2959 -8.99414 51.0742c-14.0264 37.9043 -53.6445 130.844 -87.2656 156.649c-0.642578 0.427734 -1.17773 0.962891 -1.71289 1.49902
|
||||
c-9.85059 10.3857 -16.4893 21.6289 -20.9863 31.4795c-6.31738 -3.42676 -13.4912 -5.35352 -21.2012 -5.35352h-65.3145c-24.5205 0 -44.543 19.915 -44.543 44.542v173.996c0 24.5195 19.916 44.542 44.543 44.542h65.3145c9.53027 0 18.417 -2.99805 25.6982 -8.1377
|
||||
l25.1621 2.99902c3.85449 0.535156 72.3818 9.20801 142.729 7.81641c34.9062 2.67676 63.709 1.71289 85.6592 -2.99902c32.7646 -6.95898 55.1436 -20.8789 66.6006 -41.4375c8.67285 -15.5254 8.67285 -31.1582 7.28125 -41.0088
|
||||
c21.3076 -19.2734 25.0547 -40.4746 24.3057 -55.5713c-0.536133 -8.56641 -2.46289 -15.9541 -4.49707 -21.415zM116.951 209.574c8.67383 0 15.6328 6.95996 15.6328 15.6328v173.995c0 8.56543 -6.95898 15.6328 -15.6328 15.6328h-65.3145
|
||||
c-8.56641 0 -15.6328 -6.95996 -15.6328 -15.6328v-173.995c0 -8.56641 6.95996 -15.6328 15.6328 -15.6328h65.3145zM461.408 199.188c-3.85449 5.99609 -2.89062 13.8125 2.46289 18.417c0.75 0.642578 11.5645 11.1357 11.9922 25.1621
|
||||
c0.321289 9.42285 -4.17578 19.0596 -13.3838 28.6963c-4.60449 4.81836 -5.46094 11.8848 -1.92773 17.4531c1.92773 3.42578 16.4893 31.1582 -15.2041 54.9287c-5.13965 3.85449 -7.17383 10.3867 -4.92578 16.3828c0.321289 1.28418 4.49707 14.8828 -3.10449 28.0527
|
||||
c-7.28125 12.7422 -23.1279 21.7363 -47.1133 26.876c-19.3799 4.17578 -45.6133 4.9248 -78.0566 2.35547h-1.49902c-68.8486 1.49902 -138.554 -7.49512 -139.196 -7.60254h-0.106445l-10.8154 -1.28418c0.642578 -2.99805 0.963867 -6.21094 0.963867 -9.42285v-173.889
|
||||
c0 -4.60352 -0.749023 -9.10059 -2.03418 -13.2764c1.92773 -7.1748 7.3877 -23.1279 19.916 -36.7266c48.0762 -38.1182 95.0811 -166.821 97.1162 -172.282c0.749023 -2.35547 0.962891 -4.81836 0.642578 -7.17383c-1.92773 -12.0996 -1.17871 -26.7686 1.3916 -31.0518
|
||||
c5.78223 0.107422 20.9863 1.71289 30.1943 14.4551c10.9219 15.0977 10.4941 42.0801 -1.28418 77.8428c-17.8818 54.501 -19.4873 83.1963 -5.24707 95.8311c7.06738 6.31738 16.4893 6.63867 23.3418 4.17578c6.4248 -1.3916 12.7422 -2.67676 18.6318 -3.74707
|
||||
c0.535156 -0.107422 0.962891 -0.213867 1.3916 -0.321289c32.8711 -7.28125 91.7627 -11.5645 112.214 7.06641c7.49512 6.85352 10.2783 15.0977 8.67285 25.0557c-1.28516 8.03027 -5.0332 13.9199 -5.0332 14.0264z" />
|
||||
<glyph glyph-name="uniF122" unicode=""
|
||||
d="M474.302 260.83c20.8955 0 37.9062 -16.9053 37.6963 -37.6963v-58.4873c0 -20.8955 -17.0107 -37.9062 -37.9062 -37.9062h-6.19531c-11.4453 -31.1865 -31.1865 -59.7471 -57.332 -83.1631c-0.209961 -0.314453 -0.419922 -0.524414 -0.735352 -0.735352
|
||||
l-0.209961 -0.209961c-0.945312 -0.839844 -1.99512 -1.67969 -2.93945 -2.51953c-19.8457 -18.0605 -21.5264 -38.9561 -21.6309 -43.3662v-19.1113c0 -14.9102 -12.0762 -26.9854 -26.9863 -26.9854h-78.2275c-14.9111 0 -26.9863 12.0752 -26.9863 26.9854v3.15039
|
||||
c-11.2354 -0.525391 -22.4707 -0.419922 -33.6006 0.419922v-3.57031c0 -14.9102 -12.0762 -26.9854 -26.9863 -26.9854h-78.2275c-13.4404 0 -24.6758 9.97461 -26.6709 22.9951c-0.209961 1.05078 -0.31543 2.10059 -0.31543 3.25586v0.734375v5.46094
|
||||
c-0.524414 11.1299 -4.2002 38.8506 -25.4111 60.6914c-15.3301 15.8555 -28.9805 36.4365 -40.4258 61.0078c-6.8252 13.5449 -12.1807 27.7207 -15.751 42.2109l-0.104492 0.525391c-0.105469 0.209961 -0.105469 0.524414 -0.209961 0.839844
|
||||
c-3.46582 14.3857 -5.14551 29.0859 -5.14551 43.7861c0 56.9121 25.2012 110.359 70.9824 150.365c45.2568 39.4814 105.214 61.3223 168.951 61.3223c9.97559 0 20.0557 -0.629883 29.9258 -1.67969c3.99023 -0.31543 25.3057 -1.89062 42.1064 -7.14062
|
||||
c13.9658 16.2754 37.2764 33.3916 75.6025 38.1162c1.15527 0.105469 2.41504 0.209961 3.57031 0.209961c10.1855 0 19.6357 -5.56445 24.6758 -14.5947c5.04004 -9.13574 4.72559 -19.8457 -0.839844 -28.7715c-9.97559 -15.751 -12.916 -30.9756 -9.03027 -45.0469
|
||||
c27.7207 -23.415 48.5117 -52.291 60.9023 -84.1074h7.45508zM391.139 405.104l-1.88965 14.0713l1.78418 -14.0713v0v0.105469l0.105469 -0.105469c-0.105469 0 -0.105469 0 0 0zM483.856 164.542h0.105469v58.1719c0 5.25 -4.30566 9.55469 -9.55566 9.55469h-17.2207
|
||||
h-0.209961c-6.08984 0 -11.5498 3.99023 -13.4404 9.76562c-10.5 32.0264 -31.0811 61.1123 -59.4316 84.0029c-3.15039 2.625 -5.14551 6.51074 -5.25 10.6055c-6.19531 21.9453 -1.99512 45.4668 12.1797 68.1475c-35.0703 -4.30566 -53.3418 -21.4209 -62.4766 -34.9658
|
||||
c-4.0957 -5.98535 -12.0752 -7.98047 -18.4805 -4.51562c-8.71582 4.72559 -30.5566 7.77051 -42.3164 8.50488c-0.210938 0.105469 -0.420898 0.105469 -0.630859 0.105469c-8.9248 0.945312 -18.0605 1.46973 -27.0908 1.46973
|
||||
c-116.659 0 -211.582 -82.2178 -211.582 -183.336c0 -12.6006 1.5752 -25.3057 4.51465 -37.6963v-0.209961c0 -0.105469 0.105469 -0.209961 0.105469 -0.31543c3.04492 -12.4951 7.66504 -24.6758 13.6504 -36.3311c0 -0.209961 0.105469 -0.31543 0.209961 -0.525391
|
||||
c10.0801 -21.8408 21.9463 -39.7959 35.1768 -53.4463c28.2451 -29.0859 32.7607 -65.3125 33.3906 -79.4883v-0.629883v-4.51465h75.498v17.9551c0 4.0957 1.78516 7.98047 4.83008 10.7109c3.04492 2.625 7.13965 3.88477 11.2354 3.35938
|
||||
c10.8154 -1.46973 21.8408 -2.20508 32.8662 -2.20508c8.50488 0 17.1152 0.419922 25.7256 1.36523c3.88477 0.419922 7.98047 -0.839844 10.9209 -3.57031c3.04492 -2.625 4.72461 -6.50977 4.72461 -10.5v-17.1152h75.6025v17.9551v0.31543
|
||||
c0.209961 8.61035 3.04492 38.5361 31.0811 63.9473c0.105469 0.104492 0.209961 0.209961 0.31543 0.314453c0.945312 0.839844 1.88965 1.68066 2.83496 2.52051l0.105469 0.104492c0.104492 0.105469 0.104492 0.105469 0.209961 0.209961
|
||||
c25.3057 22.5762 43.6807 50.5068 52.9209 80.748c1.78516 5.87988 7.35059 9.97559 13.5459 9.97559h16.3809c5.25 0 9.55469 4.30469 9.55469 9.55566z" />
|
||||
<glyph glyph-name="uniF12A" unicode=""
|
||||
d="M153.703 110.887c-10.8379 0 -21.0449 2.94629 -29.6738 7.99707v-38.5127c0 -16.3105 13.2588 -29.6738 29.6738 -29.6738h268.328c31.5684 0 57.3486 -25.7812 57.3486 -57.3486c0 -31.5684 -25.7803 -57.3486 -57.3486 -57.3486s-57.3486 25.6758 -57.3486 57.3486
|
||||
c0 10.5225 2.84082 20.4141 7.89258 28.9375h-127.745c5.05078 -8.41797 7.8916 -18.415 7.8916 -28.9375c0 -31.5684 -25.7803 -57.3486 -57.3486 -57.3486c-31.5674 0 -57.3486 25.6758 -57.3486 57.3486c0 10.7334 3.05176 20.835 8.20801 29.4629
|
||||
c-28.5166 3.68359 -50.6143 28.0957 -50.6143 57.5596v88.3906v69.9756v78.2881v10.207v64.3984l-68.8184 29.043c-7.26074 3.05176 -10.6279 11.3643 -7.57617 18.625s11.3643 10.6279 18.625 7.57617l77.5527 -32.6201
|
||||
c0.420898 -0.209961 0.946289 -0.420898 1.36719 -0.630859c0.105469 -0.105469 0.210938 -0.105469 0.316406 -0.210938c0.209961 -0.105469 0.525391 -0.31543 0.841797 -0.526367c0.209961 -0.209961 0.420898 -0.31543 0.630859 -0.525391
|
||||
c0.105469 -0.105469 0.31543 -0.210938 0.420898 -0.316406c0.31543 -0.209961 0.526367 -0.420898 0.736328 -0.630859l0.316406 -0.316406c0.209961 -0.209961 0.420898 -0.419922 0.630859 -0.630859l0.31543 -0.31543
|
||||
c0.105469 -0.210938 0.316406 -0.420898 0.420898 -0.631836c0.105469 -0.209961 0.210938 -0.31543 0.316406 -0.526367c0.104492 -0.209961 0.209961 -0.31543 0.31543 -0.525391c0.209961 -0.210938 0.31543 -0.420898 0.420898 -0.631836
|
||||
c0.105469 -0.105469 0.105469 -0.31543 0.209961 -0.420898c0.210938 -0.31543 0.316406 -0.526367 0.420898 -0.841797c0 -0.105469 0.105469 -0.31543 0.105469 -0.420898l0.316406 -0.947266c0 -0.209961 0.104492 -0.31543 0.104492 -0.525391
|
||||
c0.105469 -0.316406 0.105469 -0.526367 0.210938 -0.841797c0 -0.316406 0.105469 -0.631836 0.105469 -0.947266c0.104492 -0.210938 0.104492 -0.31543 0.104492 -0.420898c0.105469 -0.420898 0.105469 -0.947266 0.105469 -1.47363v-49.877l357.56 -49.3516
|
||||
c0.210938 0 0.316406 -0.105469 0.420898 -0.105469c0.316406 0 0.526367 0 0.841797 -0.104492c0.105469 0 0.316406 -0.105469 0.526367 -0.105469c0.210938 0 0.526367 -0.105469 0.737305 -0.210938c0.209961 -0.104492 0.419922 -0.104492 0.630859 -0.209961
|
||||
s0.420898 -0.210938 0.631836 -0.31543c0.209961 -0.105469 0.420898 -0.210938 0.630859 -0.316406c0.210938 -0.104492 0.420898 -0.209961 0.631836 -0.31543c0.209961 -0.209961 0.420898 -0.31543 0.630859 -0.420898
|
||||
c0.210938 -0.105469 0.31543 -0.209961 0.526367 -0.31543c0.209961 -0.105469 0.420898 -0.31543 0.630859 -0.420898c0.210938 -0.105469 0.316406 -0.31543 0.526367 -0.420898l0.526367 -0.526367c0.105469 -0.105469 0.31543 -0.209961 0.420898 -0.420898
|
||||
c0.105469 -0.209961 0.31543 -0.31543 0.420898 -0.526367c0.105469 -0.209961 0.31543 -0.31543 0.420898 -0.526367c0.209961 -0.209961 0.31543 -0.31543 0.420898 -0.525391c0.105469 -0.210938 0.31543 -0.420898 0.420898 -0.631836
|
||||
c0.105469 -0.209961 0.209961 -0.31543 0.31543 -0.526367c0.105469 -0.209961 0.210938 -0.420898 0.31543 -0.630859c0.105469 -0.105469 0.210938 -0.31543 0.316406 -0.526367c0.104492 -0.31543 0.209961 -0.526367 0.31543 -0.736328
|
||||
c0.105469 -0.210938 0.105469 -0.420898 0.209961 -0.631836c0.105469 -0.209961 0.105469 -0.420898 0.210938 -0.630859c0.105469 -0.31543 0.105469 -0.526367 0.209961 -0.736328c0 -0.210938 0.105469 -0.420898 0.105469 -0.631836
|
||||
c0 -0.209961 0.105469 -0.526367 0.105469 -0.736328c0.105469 -0.210938 0.105469 -0.420898 0.105469 -0.631836v-0.841797v-0.420898v-118.695c0 -31.9893 -26.0967 -58.085 -58.085 -58.085h-282.113zM224.416 -6.5459c0 15.9941 -13.0488 28.9365 -28.9375 28.9365
|
||||
c-15.8896 0 -28.9375 -13.0479 -28.9375 -28.9365c0 -15.8896 13.0479 -28.9375 28.9375 -28.9375c15.8887 0 28.9375 12.9424 28.9375 28.9375zM451.074 -6.5459c0 15.9941 -13.0488 28.9365 -28.9375 28.9365c-15.8896 0 -28.9375 -13.0479 -28.9375 -28.9365
|
||||
c0 -15.8896 13.0479 -28.9375 28.9375 -28.9375c15.8887 0 28.9375 12.9424 28.9375 28.9375zM435.816 139.298c16.3096 0 29.6738 13.2588 29.6738 29.7793v106.384l-341.461 47.0361v-5.26074v-78.2891v-69.9756c0 -16.3105 13.2588 -29.6738 29.6738 -29.6738h282.113z
|
||||
" />
|
||||
<glyph glyph-name="uniF124" unicode=""
|
||||
d="M423.66 343.054c41.7031 0 75.6592 -33.957 75.6592 -75.6602v-122.03c0 -41.7031 -33.9561 -75.6602 -75.6592 -75.6602h-13.2646v-95.9268c0 -20.7979 -16.9775 -37.7764 -37.7764 -37.7764h-234.618c-20.7979 0 -37.7764 16.9785 -37.7764 37.7764v95.9268h-11.8848
|
||||
c-41.7031 0 -75.6592 33.957 -75.6592 75.6602v122.03c0 41.7031 33.9561 75.6602 75.6592 75.6602h11.9912v29.2871c0 41.7031 33.9561 75.6592 75.6592 75.6592h158.853c41.7031 0 75.6592 -33.9561 75.6592 -75.6592v-29.2871h13.1582zM128.875 372.341v-29.2871h252.764
|
||||
v29.2871c0 25.8916 -21.1162 47.0088 -47.0078 47.0088h-158.747c-25.8916 0 -47.0088 -21.1172 -47.0088 -47.0088zM381.745 -26.4355v158.216h-252.87v-158.216c0 -4.9873 4.13867 -9.12598 9.12598 -9.12598h234.618c4.9873 0 9.12598 4.13867 9.12598 9.12598z
|
||||
M470.669 145.257v122.031c0 25.8916 -21.1172 47.0078 -47.0088 47.0078h-335.32c-25.8916 0 -47.0088 -21.1162 -47.0088 -47.0078v-122.031c0 -25.8916 21.1172 -47.0088 47.0088 -47.0088h11.9912v33.5322h-21.1172c-7.95801 0 -14.3252 6.36719 -14.3252 14.3252
|
||||
c0 7.95898 6.36719 14.3252 14.3252 14.3252h350.177c7.95801 0 14.3252 -6.36621 14.3252 -14.3252c0 -7.95801 -6.36719 -14.3252 -14.3252 -14.3252h-18.8887v-33.5322h13.1582c25.8916 0 47.0088 21.1172 47.0088 47.0088zM163.575 61.3203
|
||||
c-7.85254 0 -14.3262 6.36719 -14.3262 14.3262c0 7.95801 6.36719 14.3252 14.3262 14.3252h182.409c7.95898 0 14.3262 -6.36719 14.3262 -14.3252c0 -7.95898 -6.36719 -14.3262 -14.3262 -14.3262h-182.409zM347.152 31.3965
|
||||
c7.85156 0 14.2188 -6.36719 14.2188 -14.3252c0 -7.95898 -6.36719 -14.3252 -14.3252 -14.3252h-182.41c-7.95801 0 -14.3252 6.36621 -14.3252 14.3252c0 7.95801 6.36719 14.3252 14.3252 14.3252h182.517zM423.342 286.812
|
||||
c7.95898 0 14.3252 -6.36621 14.3252 -14.3252c0 -7.95801 -6.36621 -14.3252 -14.3252 -14.3252h-29.0752c-7.95898 0 -14.3252 6.36719 -14.3252 14.3252c0 7.95898 6.36621 14.3252 14.3252 14.3252h29.0752z" />
|
||||
<glyph glyph-name="uniF12D" unicode=""
|
||||
d="M511.298 251.688c1.68164 -5.14941 0.31543 -10.8232 -3.7832 -14.6064l-115.174 -112.968l27.6377 -158.153c0.31543 -1.05078 0.420898 -2.10156 0.420898 -3.25781c0 -7.77637 -6.41016 -14.1865 -14.1865 -14.1865v0c-2.20703 0 -4.41406 0.525391 -6.51562 1.57617
|
||||
l-143.021 74.7158l-142.602 -75.5566c-2.10156 -1.15527 -4.30859 -1.68066 -6.62012 -1.68066c-2.94238 0 -5.88477 0.945312 -8.30176 2.73145c-4.41309 3.15332 -6.62012 8.5127 -5.6748 13.8721l26.7969 159.1l-115.909 112.336
|
||||
c-3.8877 3.67773 -5.35938 9.35254 -3.67773 14.502c1.68066 5.14941 6.09473 8.82715 11.4541 9.66797l159.73 23.749l70.9326 144.913c2.41699 4.93945 7.35547 7.98633 12.7148 7.98633v0c5.35938 0 10.2988 -3.04688 12.7158 -7.88086l71.8779 -144.493l159.73 -22.6982
|
||||
c5.35938 -0.84082 9.77246 -4.51855 11.4541 -9.66797zM367.331 139.142l100.146 98.0449l-138.713 19.7568c-4.62402 0.735352 -8.61719 3.57227 -10.7188 7.77539l-62.4209 125.473l-61.5801 -125.787c-1.99707 -4.2041 -5.99023 -7.04102 -10.6143 -7.77637
|
||||
l-138.607 -20.5967l100.462 -97.5195c3.3623 -3.25781 4.83398 -7.88184 4.09863 -12.5059l-23.2246 -138.188l123.791 65.5742c4.20312 2.10156 9.14258 2.20605 13.2412 0l124.211 -64.8379l-24.0645 137.977c-0.84082 4.62402 0.629883 9.35352 3.99316 12.6104z" />
|
||||
<glyph glyph-name="uniF11A" unicode=""
|
||||
d="M486.939 335.223v-0.107422v-238.504c0 -18.7754 -9.33398 -36.0488 -26.2861 -48.8164c-15.7715 -11.8018 -36.3701 -18.3467 -58.2578 -18.3467c-21.8867 0 -42.4863 6.54492 -58.2578 18.3467c-16.9512 12.7676 -26.2852 30.041 -26.2852 48.8164
|
||||
s9.33398 36.0488 26.2852 48.8164c15.7715 11.8018 36.4785 18.3467 58.2578 18.3467c20.5996 0 40.2334 -5.79395 55.5762 -16.415v168.015l-263.824 -83.9004v-228.311c0 -18.7754 -9.33398 -36.0498 -26.2852 -48.8164
|
||||
c-15.7715 -11.8018 -36.3711 -18.3467 -58.2578 -18.3467s-42.4863 6.54492 -58.2578 18.3467c-16.9521 12.7666 -26.2861 30.041 -26.2861 48.8164s9.33398 36.0488 26.2861 48.8164c15.7715 11.8018 36.4775 18.3467 58.2578 18.3467
|
||||
c20.5996 0 40.2334 -5.79395 55.5752 -16.416v188.078v0.107422v98.3838c0 6.33008 4.07715 11.9092 10.085 13.8398l292.792 93.0195c4.39844 1.39453 9.22656 0.537109 12.9824 -2.14551c3.64746 -2.68262 5.90039 -7.08105 5.90039 -11.6943v-98.2764zM109.604 -35.0322
|
||||
c30.1475 0 55.5752 17.3809 55.5752 38.1953c0 20.707 -25.4277 38.1943 -55.5752 38.1943c-30.1484 0 -55.5762 -17.4883 -55.5762 -38.1943c0 -20.707 25.4277 -38.1953 55.5762 -38.1953zM194.147 261.943l263.824 83.793v68.0215l-263.824 -83.793v-68.0215z
|
||||
M402.503 58.417c30.041 0 55.4688 17.4873 55.5762 38.1943c0 20.707 -25.4277 38.1953 -55.5762 38.1953s-55.5752 -17.4883 -55.5752 -38.1953s25.4268 -38.1943 55.5752 -38.1943z" />
|
||||
<glyph glyph-name="uniF118" unicode=""
|
||||
d="M507.516 -37.8887c5.90332 -5.9043 5.90332 -15.667 0 -21.5703c-2.95117 -3.06543 -6.9248 -4.54102 -10.7852 -4.54102c-3.85938 0 -7.83301 1.58984 -10.7842 4.54102l-124.425 124.424c-38.3711 -33.376 -88.4355 -53.584 -143.155 -53.584
|
||||
c-120.337 0 -218.31 97.9727 -218.31 218.31s97.8594 218.31 218.31 218.31c120.337 0 218.31 -97.8594 218.31 -218.31c0 -54.7197 -20.207 -104.784 -53.584 -143.155zM30.5947 229.69c0 -103.535 84.2363 -187.771 187.658 -187.771
|
||||
c103.535 0 187.657 84.3496 187.657 187.771s-84.1221 187.657 -187.657 187.657c-103.422 0 -187.658 -84.1221 -187.658 -187.657z" />
|
||||
<glyph glyph-name="uniF10D" unicode=""
|
||||
d="M449.496 386.82c34.5361 0 62.6094 -28.1797 62.5039 -62.7148v-264.316c0 -34.5361 -28.0732 -62.6094 -62.6094 -62.6094h-386.781c-34.5361 0 -62.6094 28.0732 -62.6094 62.6094v264.422c0 34.5361 28.0732 62.6094 62.6094 62.6094h386.887zM483.503 59.7891
|
||||
h-0.106445v264.316c0 18.751 -15.2549 34.0059 -34.0059 34.0059h-386.781c-18.751 0 -34.0059 -15.2549 -34.0059 -34.0059v-264.316c0 -18.751 15.2549 -34.0059 34.0059 -34.0059h386.887c18.751 0 34.0068 15.2549 34.0068 34.0059zM322.9 195.284l125.748 -119.393
|
||||
c5.7207 -5.40332 5.93262 -14.5137 0.530273 -20.2344c-2.86035 -2.96582 -6.56836 -4.44922 -10.3818 -4.44922c-3.49609 0 -7.09766 1.27148 -9.85254 3.91992l-127.338 120.981l-35.7012 -31.9932c-2.64844 -2.43652 -6.14453 -3.70801 -9.53418 -3.70801
|
||||
c-3.39062 0 -6.78027 1.16504 -9.53516 3.60156l-34.7471 31.04l-128.08 -119.816c-2.75391 -2.54199 -6.25 -3.81348 -9.74609 -3.81348c-3.81348 0 -7.62793 1.58887 -10.4883 4.55566c-5.40234 5.82617 -5.08496 14.8311 0.635742 20.2334l126.173 118.122
|
||||
l-126.702 113.248c-5.93262 5.29688 -6.46191 14.3018 -1.16504 20.2334c5.29688 5.93262 14.3018 6.46289 20.2344 1.16602l137.084 -122.677c0.847656 -0.635742 1.58887 -1.27148 2.33008 -2.0127c0 -0.106445 0.106445 -0.211914 0.211914 -0.318359l33.6885 -30.0859
|
||||
l172.68 154.987c5.93262 5.29688 14.9375 4.76758 20.2344 -1.05957c5.29688 -5.93164 4.7666 -14.9365 -1.05957 -20.2334z" />
|
||||
<glyph glyph-name="uniF111" unicode=""
|
||||
d="M480.354 190.193c0.985352 -5.36719 25.0801 -131.861 -34.9365 -204.801c-26.9414 -32.7461 -66.1494 -49.3926 -116.527 -49.3926v0h-1.75293c-36.9072 0.328125 -75.6777 11.1709 -115.323 32.1982c-31.1035 16.5371 -62.8633 39.4268 -94.4053 68.0117
|
||||
c-53.2256 48.4072 -87.1768 95.9385 -88.6006 97.9092c-4.05176 5.69531 -3.61426 13.3613 1.0957 18.5088c16.7559 18.3994 36.5791 27.8174 58.9209 27.8174c33.0742 0 59.7969 -21.5752 63.6299 -24.8604l19.7139 -15.2227l1.20508 182.349v74.6914
|
||||
c0 0.547852 0.109375 0.985352 0.109375 1.5332c1.42383 27.5986 23.875 49.0645 51.6924 49.0645c28.1465 0 51.1455 -22.7803 51.6934 -50.8164l15.4414 -126.933c4.27148 -0.985352 8.76172 -1.86133 13.3613 -2.84766
|
||||
c35.7031 -7.44727 84.5488 -17.7422 167.783 -67.3535c3.61426 -2.19043 6.13281 -5.69531 6.89941 -9.85645zM422.528 4.01074c44.2461 53.7744 33.623 148.727 29.8994 174.135c-75.3496 44.0273 -118.28 53.1172 -152.889 60.3447
|
||||
c-8.65234 1.75293 -16.7559 3.50488 -24.6416 5.58594c-5.80469 1.5332 -10.0762 6.46191 -10.8428 12.4854l-16.5371 137.884c-0.109375 0.547852 -0.109375 1.20508 -0.109375 1.75195c0 12.1572 -9.85645 22.123 -22.123 22.123
|
||||
c-12.0469 0 -21.7939 -9.41895 -22.1221 -21.4658v-0.4375v-73.9258l-1.42383 -212.247c-0.109375 -5.58496 -3.28613 -10.7324 -8.32324 -13.1426c-5.14746 -2.51855 -11.0615 -1.86133 -15.5518 1.53418l-43.6982 33.6221
|
||||
c-0.21875 0.21875 -0.547852 0.4375 -0.766602 0.657227c-0.109375 0.21875 -20.6992 17.8516 -44.4648 17.8516c-10.2949 0 -19.6035 -3.28613 -28.2559 -9.9668c12.7041 -16.4277 40.4121 -49.9404 77.1016 -83.2344c45.998 -41.7266 116.309 -91.5576 189.577 -92.1045
|
||||
h1.5332c41.0693 0 72.6104 12.9229 93.6377 38.5498z" />
|
||||
<glyph glyph-name="uniF11D" unicode=""
|
||||
d="M419.897 224.875c15.2705 0 27.6787 -12.4082 27.6787 -27.6787v-178.267c0 -45.707 -37.2236 -82.9297 -82.9297 -82.9297h-217.293c-45.7061 0 -82.9297 37.2227 -82.9297 82.9297v178.267c0 15.2715 12.4082 27.6787 27.6787 27.6787h291.632v66.7041
|
||||
c0 70.5225 -57.3711 127.788 -127.787 127.788c-70.5225 0 -127.788 -57.3721 -127.788 -127.788c0 -7.95312 -6.36328 -14.3164 -14.3164 -14.3164c-7.9541 0 -14.3164 6.36328 -14.3164 14.3164c0 86.3232 70.2031 156.421 156.421 156.421
|
||||
c86.3232 0 156.421 -70.2041 156.421 -156.421v-66.7041h7.5293zM418.942 18.9297v0v177.312h-325.779v-177.312c0 -30.0117 24.3916 -54.2969 54.2969 -54.2969h217.187c30.0117 0 54.2959 24.3916 54.2959 54.2969zM256.053 24.7627
|
||||
c-29.5869 0 -53.5537 24.0723 -53.5537 53.5537s23.9668 53.5547 53.5537 53.5547c29.4814 0 53.5547 -23.9668 53.5547 -53.5547c0 -29.4814 -23.9668 -53.5537 -53.5547 -53.5537zM256.053 103.344c-13.7861 0 -24.9209 -11.3467 -24.9209 -25.0273
|
||||
c0 -13.6797 11.1348 -24.9209 24.9209 -24.9209s24.9219 11.3467 24.9219 25.0273c0 13.6797 -11.1357 24.9209 -24.9219 24.9209z" />
|
||||
<glyph glyph-name="uniF116" unicode=""
|
||||
d="M270.635 226.041c5.62012 5.62109 14.7402 5.62109 20.2549 0c34.3594 -34.3594 34.3594 -90.3525 0 -124.712l-121.955 -121.955c-17.1797 -17.1797 -39.7676 -25.7695 -62.3564 -25.7695c-22.5879 0 -45.1768 8.58984 -62.3564 25.7695l-18.3457 18.3457
|
||||
c-16.7559 16.6494 -25.876 38.8135 -25.876 62.3564s9.22656 45.707 25.876 62.3564l121.955 121.955c5.62012 5.62012 14.6348 5.62012 20.2549 0c5.62109 -5.62012 5.62109 -14.6348 0 -20.2549l-121.955 -121.955c-23.2246 -23.2246 -23.2246 -60.9785 0 -84.2021
|
||||
l18.3467 -18.3467c23.2246 -23.2246 60.9775 -23.2246 84.2021 0l121.955 121.955c23.2246 23.2246 23.2246 60.9775 0 84.2021c-5.62109 5.62109 -5.62109 14.6348 0 20.2549zM486.23 386.28c16.6494 -16.6494 25.7695 -38.8135 25.7695 -62.3564
|
||||
s-9.22656 -45.707 -25.876 -62.3564l-121.955 -121.955c-2.75684 -2.86328 -6.46875 -4.24219 -10.0742 -4.24219s-7.31738 1.48535 -10.0752 4.24219c-5.62012 5.62012 -5.62012 14.6348 0 20.2549l121.956 121.955c23.2236 23.2246 23.2236 60.9785 0 84.2021
|
||||
l-18.3467 18.3467c-23.2246 23.2246 -60.9775 23.2246 -84.2021 0l-121.955 -121.955c-23.2246 -23.2246 -23.2246 -60.9775 0 -84.2021c5.62012 -5.62109 5.62012 -14.6348 0 -20.2549c-5.62109 -5.62109 -14.6348 -5.62109 -20.2559 0
|
||||
c-34.3594 34.3594 -34.3594 90.3525 0 124.712l121.956 121.955c34.3594 34.3604 90.3525 34.3604 124.712 0z" />
|
||||
<glyph glyph-name="uniF120" unicode=""
|
||||
d="M504.441 288.794c4.72363 -2.41504 7.55859 -7.24414 7.55859 -12.4932v-166.922c0 -66.9795 -54.4863 -121.36 -121.36 -121.36c-7.87305 0 -14.1719 6.29883 -14.1719 14.1729s6.29883 14.1729 14.1719 14.1729c51.3369 0 93.0146 41.7832 93.0146 93.0146v157.999
|
||||
c-17.1113 7.76855 -62.1494 26.1406 -126.504 37.2686c-5.56348 0.944336 -10.0781 5.14355 -11.3379 10.708l-5.24902 22.5713c-5.24902 22.3613 -24.8809 37.8984 -47.7666 37.8984h-73.5938c-22.9902 0 -42.5176 -15.6426 -47.7666 -37.8984l-5.24902 -22.5713
|
||||
c-1.25977 -5.45898 -5.77441 -9.76367 -11.3379 -10.708c-64.5645 -11.1279 -109.497 -29.5 -126.504 -37.2686v-157.999c0 -51.3369 41.7822 -93.0146 93.0137 -93.0146c7.87402 0 14.1729 -6.29883 14.1729 -14.1729s-6.29883 -14.1729 -14.1729 -14.1729
|
||||
c-66.9785 0 -121.359 54.4863 -121.359 121.36v166.922c0 5.24902 2.93945 10.0781 7.55859 12.4932c2.09961 1.15527 51.2314 26.7705 133.118 42.0977l3.14941 13.4385c8.29395 35.2734 39.2637 59.8398 75.377 59.8398h73.5938
|
||||
c36.2188 0 67.1885 -24.6709 75.377 -59.8398l3.14941 -13.4385c81.8867 -15.4316 131.019 -40.9424 133.118 -42.0977zM46.4023 317.77c-5.87891 0 -11.4434 3.7793 -13.543 9.7627c-2.41406 7.34863 1.5752 15.4326 9.02832 17.8477
|
||||
c15.748 5.14355 32.2305 9.7627 48.9219 13.752c7.55957 1.78516 15.2227 -2.83398 17.0078 -10.498c1.78418 -7.55859 -2.83496 -15.2227 -10.499 -17.0068c-15.957 -3.7793 -31.5996 -8.18848 -46.5068 -13.123c-1.46973 -0.524414 -2.93945 -0.734375 -4.40918 -0.734375
|
||||
zM256.053 306.221c89.9697 0 163.143 -73.2773 163.143 -163.248c0 -89.9697 -73.1729 -163.143 -163.143 -163.143c-89.9707 0 -163.144 73.2783 -163.144 163.248s73.1729 163.143 163.144 163.143zM256.053 8.17578c74.3271 0 134.797 60.5742 134.797 134.902
|
||||
s-60.4697 134.798 -134.797 134.798c-74.3281 0 -134.798 -60.5752 -134.798 -134.903c0 -74.3271 60.4697 -134.797 134.798 -134.797z" />
|
||||
<glyph glyph-name="uniF108" unicode=""
|
||||
d="M329.502 358.455c22.2295 0 40.3691 -18.1396 40.4736 -40.4736v-341.508c0 -22.334 -18.1396 -40.4736 -40.4736 -40.4736h-238.018c-22.333 0 -40.4727 18.1396 -40.4727 40.4736v341.508c0 22.334 18.1396 40.4736 40.4727 40.4736h238.018zM341.561 -23.4219v341.403
|
||||
c0 6.71094 -5.45215 12.1631 -12.1631 12.1631h-238.018c-6.71094 0 -12.1631 -5.45215 -12.1631 -12.1631v-341.403c0 -6.70996 5.45215 -12.1631 12.1631 -12.1631h238.018c6.71094 0 12.1631 5.45312 12.1631 12.1631zM420.516 448
|
||||
c22.333 0 40.4727 -18.1396 40.4727 -40.4736v-341.508c0 -22.334 -18.1396 -40.4736 -40.4727 -40.4736c-7.86426 0 -14.1553 6.29102 -14.1553 14.1553s6.29102 14.1553 14.1553 14.1553c6.70996 0 12.1631 5.45215 12.1631 12.1631v341.508
|
||||
c0 6.71094 -5.45312 12.1631 -12.1631 12.1631h-238.018c-6.71094 0 -12.1631 -5.45215 -12.1631 -12.1631c0 -7.86426 -6.29199 -14.1553 -14.1553 -14.1553c-7.86426 0 -14.1553 6.29102 -14.1553 14.1553c0 22.334 18.1396 40.4736 40.4736 40.4736h238.018z" />
|
||||
<glyph glyph-name="uniF123" unicode=""
|
||||
d="M255.893 448c113.134 0 205.229 -92.0957 205.444 -205.229c0 -12.8799 -1.28809 -25.8682 -3.64941 -38.5342c-0.107422 -0.750977 -0.537109 -3.00488 -1.39551 -6.86914c-3.11328 -13.9541 -7.72852 -27.4785 -13.7393 -40.4668
|
||||
c-22.1113 -52.0586 -70.8428 -132.024 -177.429 -217.681c-2.68359 -2.14648 -5.9043 -3.21973 -9.12402 -3.21973s-6.44043 1.07324 -9.12402 3.21973c-106.693 85.6562 -155.317 165.622 -177.429 217.681c-6.01074 12.9883 -10.626 26.6201 -13.7393 40.4668
|
||||
c-0.858398 3.86426 -1.28809 6.11816 -1.39551 6.86914c-2.46875 12.666 -3.64941 25.6543 -3.64941 38.5342c0 113.134 92.0957 205.229 205.229 205.229zM428.921 209.281c2.14648 10.9482 3.21973 22.2188 3.21973 33.5967c0 97.1406 -79.1074 176.248 -176.248 176.248
|
||||
s-176.248 -79.1074 -176.248 -176.248c0 -11.2705 1.07324 -22.4336 3.21973 -33.4893c0 -0.322266 0.107422 -0.537109 0.107422 -0.750977c0.107422 -0.537109 0.322266 -2.14746 0.96582 -4.61621v-0.214844c2.79102 -12.0215 6.7627 -23.8281 11.915 -34.9912
|
||||
c0.107422 -0.107422 0.107422 -0.322266 0.214844 -0.429688c20.0723 -47.5508 64.0801 -120.11 159.825 -199.219c95.7451 79.1084 139.754 151.668 159.825 199.219c0.107422 0.107422 0.107422 0.322266 0.214844 0.429688
|
||||
c5.25977 11.2705 9.23145 22.9697 11.915 34.9912v0.214844c0.536133 2.46875 0.858398 4.0791 0.96582 4.61621c0 0.213867 0.107422 0.428711 0.107422 0.643555zM255.893 370.824c71.8086 0 130.308 -58.499 130.308 -130.308s-58.499 -130.308 -130.308 -130.308
|
||||
s-130.308 58.499 -130.308 130.308s58.499 130.308 130.308 130.308zM255.893 139.189c55.9229 0 101.327 45.5117 101.327 101.327s-45.5117 101.326 -101.327 101.326s-101.326 -45.5107 -101.326 -101.326s45.4033 -101.327 101.326 -101.327z" />
|
||||
<glyph glyph-name="uniF10E" unicode=""
|
||||
d="M429.752 343.887c45.3271 0 82.248 -36.8145 82.248 -82.1406v-207.269c0 -45.3271 -36.9209 -82.248 -82.248 -82.248h-347.504c-45.3271 0 -82.248 36.9209 -82.248 82.248v275.045c0 45.3271 36.9209 82.248 82.248 82.248h158.324
|
||||
c7.97949 0 14.3633 -6.38379 14.3633 -14.3643c0 -29.5791 24.0469 -53.5195 53.5195 -53.5195h121.297zM483.271 54.584v0v207.056c0 29.5791 -24.0459 53.5195 -53.5195 53.5195h-121.297c-40.4316 0 -74.1611 29.3662 -80.9707 67.8828h-145.236
|
||||
c-29.5801 0 -53.5195 -24.0459 -53.5195 -53.5195v-274.938c0 -29.5801 24.0459 -53.5195 53.5195 -53.5195h347.504c29.5801 0 53.5195 24.0459 53.5195 53.5195z" />
|
||||
<glyph glyph-name="uniF107" unicode=""
|
||||
d="M436.857 372.986c48.3857 -48.3857 75.1221 -112.575 75.1221 -180.986s-26.6279 -132.601 -75.0137 -180.986c-49.3604 -49.3594 -114.957 -75.0137 -181.203 -75.0137c-41.2412 0 -82.8076 9.95898 -120.802 30.417
|
||||
c-34.0967 -24.5713 -67.4365 -29.876 -90.0596 -29.876c-8.44336 0 -15.3711 0.757812 -20.2422 1.51562c-10.3916 1.62402 -18.4014 9.74219 -20.0254 20.1338c-1.62305 10.3916 3.68066 20.458 13.0977 25.1123c19.5928 9.63477 32.7988 28.9023 41.0254 45.4639
|
||||
c-83.8906 100.992 -77.3955 250.695 16.1279 344.22c48.3857 48.3857 112.575 75.0137 180.986 75.0137s132.601 -26.6279 180.986 -75.0137zM416.183 31.6885c88.4365 88.4365 88.4365 232.187 -0.108398 320.623c-88.3281 88.4365 -232.187 88.4365 -320.622 0
|
||||
c-84.6484 -84.6484 -88.7617 -221.037 -9.52637 -310.556c2.05664 -2.38184 3.24805 -5.30469 3.57227 -8.22656c0.757812 -3.03125 0.541016 -6.27832 -0.757812 -9.41797c-8.11816 -18.5098 -21.9736 -42.3232 -43.9473 -58.3438h0.108398
|
||||
c19.0508 0 47.8438 4.7627 77.1787 27.4941c0.324219 0.325195 0.757812 0.649414 1.19043 0.866211c4.65527 4.6543 11.9072 5.73633 17.7529 2.27246c88.9775 -52.2822 202.094 -37.7773 275.159 35.2881zM237.902 192c0 11.9792 5.98958 17.9688 17.9688 17.9688
|
||||
c11.9792 0 17.9688 -5.98958 17.9688 -17.9688s-5.98959 -17.9688 -17.9688 -17.9688c-11.9792 0 -17.9688 5.98958 -17.9688 17.9688zM330.561 192c0 11.9792 5.98959 17.9688 17.9688 17.9688s17.9688 -5.98958 17.9688 -17.9688s-5.98959 -17.9688 -17.9688 -17.9688
|
||||
s-17.9688 5.98958 -17.9688 17.9688zM145.244 192c0 11.9792 5.98958 17.9688 17.9688 17.9688s17.9688 -5.98958 17.9688 -17.9688s-5.98958 -17.9688 -17.9688 -17.9688s-17.9688 5.98958 -17.9688 17.9688z" />
|
||||
<glyph glyph-name="uniF115" unicode=""
|
||||
d="M489.917 99.9219c2.03418 -5.46094 3.96191 -12.8486 4.38965 -21.5215c0.75 -14.9893 -2.99805 -36.2959 -24.3047 -55.5684c1.39258 -9.84961 1.39258 -25.375 -7.28027 -41.0068c-11.3486 -20.4502 -33.7266 -34.3691 -66.4893 -41.3281
|
||||
c-13.9189 -2.99805 -30.6211 -4.49707 -49.7871 -4.49707c-11.1348 0 -23.126 0.535156 -35.8672 1.49902c-70.3438 -1.3916 -138.867 7.28027 -142.722 7.81641l-25.1611 2.99707c-7.28125 -5.13867 -16.168 -8.13672 -25.6963 -8.13672h-65.3115
|
||||
c-24.5186 0 -44.541 19.915 -44.541 44.54v173.986c0 24.5186 19.915 44.54 44.541 44.54h65.3115c7.70898 0 14.8818 -1.92773 21.1992 -5.35352c4.49707 9.85059 11.1348 21.0928 20.9854 31.4785c0.535156 0.535156 1.07031 1.07031 1.71289 1.49902
|
||||
c33.5127 25.8027 73.1279 118.738 87.2607 156.641c-1.49902 11.7773 -2.89062 37.2598 8.99414 51.0713c5.24609 6.10254 12.6338 9.42188 20.6641 9.42188c8.35059 0 36.7236 -1.92773 54.4971 -26.4463c16.917 -23.3408 17.7734 -58.2451 2.78418 -103.855
|
||||
c-12.6338 -38.3311 -13.8115 -55.3545 -13.3838 -62.207c5.78223 1.28516 11.4561 2.46289 16.8096 3.42676h0.107422c0.963867 0.213867 24.5186 5.45996 52.6777 6.74512c40.043 1.92676 68.9521 -5.03223 85.9756 -20.5576
|
||||
c23.2334 -21.1992 20.5566 -48.502 13.5977 -65.8467c5.99609 -7.81543 13.2764 -20.5566 13.9189 -36.8311c0.642578 -14.7754 -4.38965 -29.123 -14.8828 -42.5059zM51.6875 -30.916v0.107422h65.3115c8.56543 0 15.6318 6.95898 15.6318 15.6318v173.985
|
||||
c0 8.56543 -6.95996 15.6318 -15.6318 15.6318h-65.3115c-8.56543 0 -15.6318 -6.95898 -15.6318 -15.6318v-174.093c0 -8.56543 6.95898 -15.6318 15.6318 -15.6318zM462.508 112.448c9.31445 9.63672 13.8115 19.3799 13.3838 28.9082
|
||||
c-0.536133 14.2402 -11.7783 24.8398 -11.8848 24.9473c-5.35352 4.81836 -6.53125 12.6338 -2.56934 18.6299c1.3916 2.24805 13.7041 23.2334 -3.64062 39.0801c-20.4502 18.6299 -79.3379 14.2402 -112.208 7.06641
|
||||
c-0.427734 -0.107422 -0.962891 -0.213867 -1.3916 -0.321289c-5.88867 -0.963867 -12.0986 -2.24902 -18.6299 -3.74707c-6.85254 -2.46289 -16.2744 -2.1416 -23.3408 4.1748c-14.2402 12.6348 -12.7412 41.3291 5.24609 95.8262
|
||||
c11.7783 35.7607 12.2061 62.7422 1.28516 77.8389c-9.20801 12.7412 -24.5186 14.3467 -30.1934 14.4541c-2.56934 -4.38965 -3.21191 -19.0576 -1.3916 -31.0498c0.427734 -2.46289 0.213867 -4.9248 -0.642578 -7.17383
|
||||
c-2.03418 -5.56738 -49.0371 -134.156 -97.1104 -172.272c-12.6348 -13.5977 -17.9883 -29.5508 -19.915 -36.7246c1.28516 -4.1748 2.03418 -8.67188 2.03418 -13.2764v-174.093c0 -3.21191 -0.321289 -6.42383 -0.963867 -9.42188l10.8145 -1.28516h0.106445
|
||||
c0.75 -0.106445 70.3438 -9.10059 139.189 -7.60156h1.49805c32.335 -2.56934 58.6738 -1.82031 78.0527 2.35547c24.1982 5.13965 40.1514 14.3477 47.3242 27.1953c7.49512 13.3838 2.8916 27.5166 2.8916 27.624c-2.1416 5.99512 -0.107422 12.6338 4.9248 16.4883
|
||||
c14.1328 10.5996 20.8779 23.0195 20.1289 37.0459c-0.535156 10.2783 -4.92578 17.7734 -4.92578 17.8799c-3.42578 5.56738 -2.56934 12.7412 1.92773 17.4521z" />
|
||||
<glyph glyph-name="uniF126" unicode=""
|
||||
d="M485.793 245.746c15.2939 -2.56738 26.418 -15.7227 26.2041 -31.2314v-45.0283c0 -15.5088 -11.124 -28.6641 -26.418 -31.2314l-35.9375 -5.98926c-3.63672 -11.9785 -8.55664 -23.6367 -14.4385 -34.8672l21.1768 -29.7334
|
||||
c8.98438 -12.6211 7.4873 -29.8408 -3.42285 -40.751l-31.8721 -31.8721c-5.99023 -5.99023 -13.9043 -9.30566 -22.3545 -9.30566v0c-6.63086 0 -13.0479 2.03223 -18.3965 5.88281l-29.626 21.1768c-11.124 -5.88184 -22.7822 -10.6953 -34.8682 -14.4385
|
||||
l-6.0957 -35.9375c-2.56738 -15.2949 -15.7227 -26.418 -31.2314 -26.418h-45.1357c-15.5078 0 -28.6641 11.124 -31.2305 26.418l-5.99023 35.9375c-11.6582 3.63672 -22.9951 8.23535 -33.7979 13.9043l-30.0547 -21.3916
|
||||
c-5.34766 -3.85059 -11.6572 -5.88184 -18.2891 -5.88184c-8.44922 0 -16.3643 3.31543 -22.3535 9.30469l-31.873 31.873c-11.0166 10.9092 -12.4062 28.1289 -3.42285 40.75l21.0703 29.3057c-5.98926 11.123 -10.9092 22.7812 -14.6523 34.7607l-36.3652 6.20312
|
||||
c-15.2949 2.56738 -26.418 15.7227 -26.418 31.2314v45.0283c0 15.5088 11.123 28.6641 26.418 31.2305l35.5098 5.99023c3.63574 12.0859 8.3418 23.7441 14.2246 34.9746l-21.3906 30.0537c-8.98438 12.6211 -7.4873 29.8408 3.42188 40.751l31.9805 31.8721
|
||||
c5.88184 5.99023 13.9033 9.30566 22.3535 9.30566c6.63086 0 13.0488 -2.03223 18.3965 -5.88281l29.4121 -21.1768c11.124 5.98926 22.7822 10.9092 34.7607 14.6523l6.2041 36.3652c2.56641 15.2949 15.7217 26.418 31.2305 26.418h45.0283
|
||||
c15.5088 0 28.6641 -11.123 31.2314 -26.418l5.98926 -35.5098c12.5137 -3.74316 24.5996 -8.77051 36.1514 -14.8662l29.7334 21.1768c5.34766 3.85059 11.6582 5.88281 18.2891 5.88281c8.4502 0 16.3643 -3.31543 22.3545 -9.30566l31.8721 -31.8721
|
||||
c11.0166 -10.9102 12.4072 -28.1299 3.42285 -40.75l-21.1768 -29.627c5.88184 -11.124 10.6953 -22.7822 14.4385 -34.8682zM483.333 169.486h0.106445v45.0283c0 1.39062 -0.962891 2.56738 -2.35254 2.78125l-44.9219 7.59375
|
||||
c-5.56152 0.855469 -10.1611 5.02637 -11.5508 10.5889c-4.06445 15.7217 -10.2676 30.8027 -18.6104 44.8145c-2.8877 4.91992 -2.67383 11.123 0.641602 15.7217l26.418 37.1143c0.749023 1.17578 0.641602 2.67383 -0.321289 3.63574l-31.8721 31.873
|
||||
c-0.749023 0.749023 -1.60449 0.855469 -2.03223 0.855469c-0.535156 0 -1.06934 -0.213867 -1.60449 -0.53418l-36.8994 -26.5254c-4.70605 -3.31543 -10.8027 -3.5293 -15.7227 -0.641602c-14.332 8.44922 -29.7334 14.7598 -45.8838 18.8242
|
||||
c-5.5625 1.39062 -9.7334 5.98926 -10.6963 11.6582l-7.48633 44.6006c-0.213867 1.39062 -1.39062 2.35254 -2.78125 2.35254h-45.0283c-1.39062 0 -2.56641 -0.961914 -2.78027 -2.35254l-7.70117 -45.2422c-0.962891 -5.56152 -5.13379 -10.0537 -10.5889 -11.5518
|
||||
c-15.7227 -4.06348 -30.8027 -10.4814 -44.707 -18.8242c-4.91992 -2.8877 -11.124 -2.67383 -15.8301 0.641602l-36.8994 26.3115c-0.427734 0.321289 -0.962891 0.535156 -1.60449 0.535156c-0.53418 0 -1.2832 -0.107422 -2.03223 -0.856445l-31.8721 -31.8721
|
||||
c-0.962891 -0.962891 -1.07031 -2.56738 -0.321289 -3.63672l26.6318 -37.4346c3.31543 -4.59863 3.63672 -10.6953 0.749023 -15.6152c-8.23535 -14.0117 -14.332 -29.1992 -18.2891 -44.9219c-1.39062 -5.56152 -5.99023 -9.73242 -11.6582 -10.6953l-44.6006 -7.4873
|
||||
c-1.39062 -0.213867 -2.35352 -1.38965 -2.35352 -2.78027v-45.0283c0 -1.39062 0.962891 -2.56738 2.35352 -2.78125l45.2422 -7.7002c5.56152 -0.962891 10.0537 -5.13477 11.5508 -10.5889c4.06445 -15.7227 10.4814 -30.8037 18.8242 -44.708
|
||||
c2.8877 -4.91992 2.67383 -11.123 -0.641602 -15.8291l-26.3115 -36.8994c-0.748047 -1.17676 -0.641602 -2.67383 0.321289 -3.63672l31.873 -31.873c0.748047 -0.748047 1.60449 -0.855469 2.03223 -0.855469c0.53418 0 1.06934 0.213867 1.60352 0.535156
|
||||
l37.4346 26.6318c2.45996 1.81836 5.45508 2.67383 8.34277 2.67383c2.45996 0 5.02734 -0.641602 7.27344 -1.9248c13.7969 -7.91504 28.5566 -14.0117 43.8516 -17.9688c5.45508 -1.39062 9.62598 -5.88281 10.5889 -11.5518l7.48633 -44.9209
|
||||
c0.213867 -1.39062 1.39062 -2.35352 2.78125 -2.35352h45.0283c1.39062 0 2.56641 0.962891 2.78027 2.35352l7.59473 44.9209c0.855469 5.56152 5.02637 10.1611 10.5879 11.5518c15.7227 4.06445 30.8037 10.2676 44.8145 18.6104
|
||||
c4.91992 2.8877 11.124 2.67383 15.7227 -0.641602l37.1143 -26.4189c0.427734 -0.320312 0.961914 -0.53418 1.60352 -0.53418c0.535156 0 1.28418 0.106445 2.03223 0.855469l31.873 31.873c0.962891 0.961914 1.06934 2.56641 0.321289 3.63574l-26.4189 37.2207
|
||||
c-3.31543 4.70605 -3.5293 10.8027 -0.641602 15.7227c8.34277 14.0117 14.5459 29.0918 18.6104 44.8145c1.39062 5.45508 5.88281 9.62598 11.5518 10.5889l44.9209 7.48633c1.39062 0.214844 2.35352 1.39062 2.35352 2.78125zM256.052 302.539
|
||||
c60.9648 0 110.485 -49.5205 110.485 -110.485s-49.5205 -110.485 -110.485 -110.485s-110.485 49.5205 -110.485 110.485s49.5205 110.485 110.485 110.485zM256.052 110.447c45.0283 0 81.6074 36.5781 81.6074 81.6064s-36.5791 81.6074 -81.6074 81.6074
|
||||
s-81.6074 -36.5791 -81.6074 -81.6074s36.5791 -81.6064 81.6074 -81.6064z" />
|
||||
<glyph glyph-name="uniF10C" unicode=""
|
||||
d="M478.836 414.833c21.3818 -21.2725 33.1641 -49.6367 33.1641 -79.8555c0 -30.2178 -11.7822 -58.582 -33.1641 -79.9639l-293.02 -292.91c-2.72754 -2.83691 -6.54492 -4.36328 -10.3633 -4.36328s-7.63672 1.63574 -10.3643 4.36328l-118.037 118.037
|
||||
l-15.1631 -112.146l77.6729 10.4727c8.07324 1.09082 15.4912 -4.58105 16.582 -12.6543c1.09082 -8.07227 -4.58203 -15.4912 -12.6543 -16.582l-96.874 -13.0908c-0.654297 -0.109375 -1.30859 -0.109375 -1.96289 -0.109375
|
||||
c-3.81836 0 -7.63672 1.63672 -10.3643 4.36426c-3.16309 3.16309 -4.7998 7.74512 -4.14551 12.3271l21.71 160.801c0.435547 3.16309 1.85449 6.10938 4.14551 8.39941l293.02 292.911c44.0723 44.1816 115.746 44.1816 159.818 0zM324.69 378.833l-267.384 -267.384
|
||||
l49.2002 -49.2002l267.384 267.384zM175.562 -6.69629l267.384 267.383l-48.1094 48.1094l-267.384 -267.383zM463.454 281.741c12.3271 14.9453 19.0908 33.4912 19.0908 53.2363c0 22.3643 -8.61816 43.4189 -24.4365 59.1279
|
||||
c-15.8174 15.709 -36.7637 24.4365 -59.127 24.4365c-19.6367 0 -38.291 -6.76367 -53.2373 -19.0908z" />
|
||||
<glyph glyph-name="uniF112" unicode=""
|
||||
d="M512 189.698c0 -0.986328 -0.109375 -1.97266 -0.329102 -2.95898c0.219727 -0.985352 0.329102 -1.97168 0.329102 -2.95801v-121.206c0 -68.4932 -55.7812 -124.273 -124.274 -124.273c-8.21875 0 -14.7939 6.5752 -14.7939 14.7939v218.85
|
||||
c0 8.21875 6.5752 14.7949 14.7939 14.7949c37.918 0 71.8906 -16.9863 94.6855 -43.8359v40.877c0 0.986328 0.109375 1.97266 0.328125 2.95898c-0.21875 0.985352 -0.328125 1.97168 -0.328125 2.95801c0 124.822 -101.589 226.411 -226.411 226.411
|
||||
s-226.411 -101.589 -226.411 -226.411v-40.876c22.7949 26.8486 56.7676 43.835 94.6855 43.835c8.21875 0 14.7939 -6.5752 14.7939 -14.7939v-218.85c0 -8.21875 -6.5752 -14.7949 -14.7939 -14.7949c-68.4932 0 -124.274 55.7812 -124.274 124.274v121.205
|
||||
c0 68.3838 26.6299 132.713 74.959 181.041c48.3291 48.3291 112.657 74.959 181.041 74.959s132.712 -26.6299 181.041 -74.959c48.3291 -48.3281 74.959 -112.657 74.959 -181.041zM109.37 161.973c-45.1514 -7.12305 -79.7812 -46.3564 -79.8906 -93.4795
|
||||
c0 -47.123 34.7393 -86.3564 79.8906 -93.4795v186.959zM402.63 -30.9043c45.1514 7.12305 79.7812 46.2471 79.8906 93.4795c0 47.123 -34.7393 86.3564 -79.8906 93.4795v-186.959z" />
|
||||
<glyph glyph-name="uniF12F" unicode=""
|
||||
d="M416.401 305.023c55.1689 -14.5293 95.4932 -67.0664 95.5986 -126.132c0 -32.6377 -12.1074 -64.0127 -34.3232 -88.4385c-22.3203 -24.6367 -52.3262 -39.377 -84.4385 -41.6934h-1.05273h-78.1211c-7.89648 0 -14.2129 6.31738 -14.2129 14.2139
|
||||
s6.31641 14.2129 14.2129 14.2129h77.5947c50.7471 3.89551 91.9141 49.3789 91.9141 101.705c0 49.3789 -35.376 92.6514 -82.2275 100.652c-6.31738 1.05371 -11.1602 6.21191 -11.792 12.6348c-5.89551 61.6963 -57.1699 108.232 -119.288 108.232
|
||||
c-46.2197 0 -88.7549 -26.9531 -108.443 -68.751c-3.1582 -6.63281 -10.8438 -9.79102 -17.793 -7.26465c-5.68555 2.10547 -11.792 3.1582 -18.0029 3.1582c-29.0586 0 -52.748 -23.6885 -52.748 -52.7471c0 -6.42285 1.05273 -12.4238 3.1582 -18.1094
|
||||
c2.31641 -6.52734 -0.209961 -13.792 -6.21191 -17.2666c-25.7939 -15.0557 -41.7979 -42.8506 -41.7979 -72.6465c0 -46.1143 36.2178 -87.0703 79.2793 -89.7021h90.124c7.89648 0 14.2139 -6.31738 14.2139 -14.2139s-6.31738 -14.2139 -14.2139 -14.2139h-90.5449
|
||||
h-0.841797c-28.6377 1.58008 -55.4854 15.1611 -75.8057 38.1133c-19.793 22.4258 -30.6377 50.7471 -30.6377 79.9111c0 36.1133 17.583 70.0146 46.5361 91.0713c-1.05273 5.47559 -1.68457 11.0557 -1.68457 16.8457c0 44.7461 36.4287 81.1748 81.1748 81.1748
|
||||
c5.26367 0 10.5283 -0.526367 15.582 -1.47363c11.6865 20.4248 28.2158 37.7969 48.1152 50.6416c23.8994 15.4766 51.7998 23.6895 80.4375 23.6895c37.0596 0 72.6465 -13.793 100.021 -38.8506c24.6367 -22.5312 40.7451 -52.2207 46.2197 -84.7539zM341.333 153.202
|
||||
c-5.58008 -5.58008 -14.5293 -5.58008 -20.0039 0l-51.0635 51.0635v-234.68c0 -7.89648 -6.31641 -14.2139 -14.2129 -14.2139s-14.2139 6.31738 -14.2139 14.2139v234.68l-51.0625 -51.0635c-2.7373 -2.84277 -6.42285 -4.21094 -10.002 -4.21094
|
||||
c-3.58008 0 -7.26465 1.47363 -10.0029 4.21094c-5.58008 5.58008 -5.58008 14.5293 0 20.1094l75.2793 75.2793c2.63184 2.7373 6.31641 4.21094 10.002 4.21094c3.68457 0 7.37012 -1.5791 10.002 -4.21094l75.2783 -75.2793
|
||||
c5.58008 -5.58008 5.58008 -14.5293 0 -20.1094z" />
|
||||
<glyph glyph-name="uniF130" unicode=""
|
||||
d="M497.331 197.922c8.14941 0 14.6689 -6.62793 14.6689 -14.6689v-133.433c0 -52.374 -42.5938 -95.0762 -95.0762 -95.0762h-321.848c-52.373 0 -95.0762 42.5938 -95.0762 95.0762v135.605c0 8.14941 6.51953 14.6689 14.6689 14.6689
|
||||
s14.6689 -6.51953 14.6689 -14.6689v-135.605c0 -36.1836 29.4463 -65.7393 65.7383 -65.7393h321.848c36.1836 0 65.7383 29.4473 65.7383 65.7393v133.433c0 8.14941 6.51953 14.6689 14.6689 14.6689zM173.094 310.927c-5.65039 -5.65039 -14.9951 -5.65039 -20.6455 0
|
||||
c-5.75879 5.75879 -5.75879 14.9951 0 20.7539l93.2295 93.2295c2.71582 2.8252 6.41016 4.34668 10.3223 4.34668c3.80273 0 7.60645 -1.62988 10.3223 -4.34668l93.2295 -93.2295c5.75879 -5.75879 5.75879 -14.9951 0 -20.7539
|
||||
c-2.8252 -2.93359 -6.51953 -4.3457 -10.3223 -4.3457c-3.69434 0 -7.49805 1.52051 -10.3232 4.3457l-68.2373 68.2383v-297.616c0 -8.14941 -6.51953 -14.6689 -14.6689 -14.6689s-14.6689 6.51953 -14.6689 14.6689v297.616z" />
|
||||
<glyph glyph-name="uniF125" unicode=""
|
||||
d="M117.261 346.469c-55.5166 -50.1846 -78.9365 -126.611 -61.3721 -199.379c1.88184 -7.52832 -2.82227 -15.1602 -10.3506 -17.042c-1.14941 -0.313477 -2.19531 -0.418945 -3.3457 -0.418945c-6.37695 0 -12.1279 4.28711 -13.6963 10.7695
|
||||
c-20.0732 82.8047 6.69141 169.791 69.8408 226.98c45.8984 41.6123 105.388 62.8359 167.282 59.6992c49.9756 -2.50879 96.71 -20.4922 134.662 -51.5439l-2.19531 57.8174c-0.313477 7.84082 5.75 14.3232 13.5918 14.6367
|
||||
c7.73633 0.313477 14.3232 -5.75 14.6367 -13.5918l3.4502 -92.2139v0v-0.104492v-0.523438v-1.04492c0 -7.63281 -5.95898 -13.8008 -13.5908 -14.1143l-93.2607 -3.4502h-0.522461c-7.52734 0 -13.8008 5.95898 -14.1143 13.5918
|
||||
c-0.313477 7.84082 5.75 14.3232 13.5918 14.6367l60.7441 2.2998c-76.6357 62.418 -189.761 61.3721 -265.352 -7.00488zM483.505 243.591c20.0732 -82.9102 -6.69141 -169.792 -69.8408 -226.981c-43.0752 -38.8936 -97.8604 -60.0127 -155.468 -60.0127
|
||||
c-3.86816 0 -7.8418 0.104492 -11.8145 0.313477c-49.6621 2.50977 -96.1875 20.3877 -134.14 51.126l5.01855 -56.5625c0.731445 -7.8418 -5.01855 -14.6377 -12.7549 -15.3691c-0.418945 -0.104492 -0.836914 -0.104492 -1.25488 -0.104492
|
||||
c-7.21387 0 -13.3828 5.54102 -14.0098 12.8594l-8.36426 92.9463c-0.732422 7.8418 5.01855 14.6377 12.7549 15.3691l92.9463 8.36426c7.8418 0.732422 14.6377 -4.91406 15.3691 -12.7549c0.732422 -7.8418 -5.01855 -14.6377 -12.7549 -15.3691l-61.4766 -5.54102
|
||||
c37.4297 -31.1562 83.8506 -46.9443 130.376 -46.9443c48.7207 0 97.6504 17.3555 136.648 52.5898c55.5166 50.1846 79.041 126.611 61.3721 199.38c-1.88184 7.52734 2.82227 15.1592 10.3506 17.042c7.52734 1.88184 15.1602 -2.82324 17.042 -10.3506z" />
|
||||
<glyph glyph-name="uniF11C" unicode=""
|
||||
d="M387.058 202.207c5.58008 -5.58008 5.58008 -14.8076 -0.107422 -20.3867l-241.528 -241.528c-2.78906 -2.89746 -6.54492 -4.29199 -10.1934 -4.29199c-3.64746 0 -7.40332 1.50195 -10.1934 4.29199c-5.68652 5.68652 -5.68652 14.8066 0 20.4941l231.228 231.228
|
||||
l-231.228 231.228c-5.68652 5.68652 -5.68652 14.8066 0 20.4941c5.6875 5.68652 14.8076 5.68652 20.4941 0z" />
|
||||
<glyph glyph-name="uniF100" unicode=""
|
||||
d="M254.145 172.12c-31.0654 0.530273 -56.1934 11.4512 -74.6426 32.3379c-40.8203 46.0156 -34.0342 124.898 -33.292 132.427c2.65039 56.9355 29.793 83.9727 52.0586 96.5898c22.1602 12.6172 45.2734 14.5254 57.042 14.5254h0.636719h0.423828h0.742188
|
||||
c21.417 -0.423828 40.6084 -5.51367 57.042 -14.9492c22.0537 -12.6172 48.7725 -39.6543 51.4229 -96.166c0.742188 -7.52832 7.52734 -86.4111 -33.292 -132.427c-18.5547 -20.8867 -43.6826 -31.8076 -74.749 -32.3379h-1.05957h-0.636719h-1.69629zM174.519 334.234
|
||||
c-0.105469 -0.636719 -7.31543 -73.0527 26.2949 -110.798c13.2529 -15.0557 31.1719 -22.4775 54.4971 -22.6895h0.530273v0h0.530273c23.4316 0.211914 41.2441 7.63379 54.6035 22.6895c33.7158 37.958 26.2949 110.056 26.1885 110.798
|
||||
c-0.106445 0.211914 -0.106445 0.529297 -0.106445 0.847656c-3.28613 71.8857 -51.9521 83.5488 -80.5791 84.1846h-0.848633h-0.423828c-23.1143 0 -77.0811 -8.16406 -80.5801 -84.1846c0 -0.211914 -0.106445 -0.530273 -0.106445 -0.847656zM473.725 41.2842
|
||||
c0.106445 -5.51367 0.211914 -33.8223 -5.08887 -47.9238c-1.06055 -2.75684 -3.0752 -5.08984 -5.51367 -6.67969c-3.18066 -2.01465 -79.4141 -50.6807 -206.963 -50.6807c-127.55 0 -203.782 48.5596 -206.963 50.6807
|
||||
c-2.54492 1.58984 -4.45312 3.92285 -5.51367 6.67969c-5.61914 14.207 -5.51367 42.5166 -5.40723 48.0293v0.318359c0.106445 0.848633 0.106445 1.69629 0.106445 2.65039c0.635742 20.8877 2.01367 69.9775 48.0293 85.7754
|
||||
c0.318359 0.106445 0.636719 0.211914 1.06055 0.318359c48.0293 12.1924 87.5771 39.7598 88.002 40.0771c6.4668 4.55957 15.373 2.96875 19.9326 -3.49805c4.55859 -6.46777 2.96875 -15.374 -3.49902 -19.9336c-1.80273 -1.16602 -44.001 -30.6416 -96.8018 -44.2129
|
||||
c-24.7041 -8.7998 -27.4609 -35.2002 -28.2031 -59.374c0 -0.954102 -0.105469 -1.80273 -0.105469 -2.65137c-0.212891 -9.54199 0.529297 -24.2793 2.22656 -32.7617c17.2822 -9.75391 85.0322 -43.5762 187.029 -43.5762c102.422 0 169.748 33.7158 186.924 43.4707
|
||||
c1.69727 8.48145 2.33301 23.2188 2.22656 32.7617c-0.105469 0.847656 -0.105469 1.69629 -0.105469 2.65039c-0.742188 24.1738 -3.49902 50.5742 -28.2031 59.375c-52.8008 13.5713 -94.999 42.9404 -96.8018 44.2129
|
||||
c-6.46777 4.55859 -8.05762 13.4648 -3.49902 19.9326c4.55957 6.46777 13.4658 8.05762 19.9326 3.49902c0.424805 -0.318359 40.1846 -27.8848 88.002 -40.0781c0.318359 -0.105469 0.742188 -0.211914 1.06055 -0.318359
|
||||
c46.0156 -15.6914 47.3936 -64.7812 48.0293 -85.7744c0 -0.954102 0.106445 -1.80273 0.106445 -2.65137v-0.317383z" />
|
||||
<glyph glyph-name="uniF117" unicode=""
|
||||
d="M247.328 -34.6621c8.04102 0 14.6689 -6.51953 14.6689 -14.6689s-6.51953 -14.6689 -14.6689 -14.6689h-133.542c-52.373 0 -95.0762 42.5938 -95.0762 95.0762v321.848c0 52.373 42.5938 95.0762 95.0762 95.0762h135.715c8.14941 0 14.6689 -6.51953 14.6689 -14.6689
|
||||
s-6.51953 -14.6689 -14.6689 -14.6689h-135.715c-36.1836 0 -65.7383 -29.4463 -65.7383 -65.7383v-321.848c0 -36.1836 29.4463 -65.7383 65.7383 -65.7383h133.542zM488.985 202.322c5.75879 -5.65039 5.75879 -14.9941 -0.109375 -20.8623l-93.2285 -93.2295
|
||||
c-2.8252 -2.93359 -6.62891 -4.3457 -10.3232 -4.3457s-7.49707 1.52148 -10.3223 4.3457c-5.75879 5.75977 -5.75879 14.9951 0 20.7539l68.2373 68.2383h-297.616c-8.14941 0 -14.6689 6.51953 -14.6689 14.6689s6.51953 14.6689 14.6689 14.6689h297.616
|
||||
l-68.2373 68.2373c-5.75879 5.75879 -5.75879 14.9951 0 20.7539s14.9951 5.75879 20.7539 0z" />
|
||||
<glyph glyph-name="uniF11F" unicode=""
|
||||
d="M404.642 130.834l59.3252 -59.542c10.9141 -10.8057 16.6416 -23.665 16.6416 -37.0645c0 -13.292 -5.61914 -26.2588 -16.3174 -37.3896c-4.64648 -4.8623 -9.40137 -9.50879 -14.0479 -13.9395c-6.80762 -6.5918 -13.292 -12.751 -18.9111 -19.5586
|
||||
c-0.107422 -0.216797 -0.324219 -0.324219 -0.431641 -0.541016c-16.4258 -17.8301 -37.3896 -26.7988 -62.3516 -26.7988c-2.16113 0 -4.53809 0.108398 -6.80762 0.21582c-37.0654 2.37793 -70.2402 16.3174 -95.0938 28.0957
|
||||
c-65.0527 31.4463 -122.001 76.0752 -169.332 132.592c-39.0098 46.8984 -65.1611 90.6631 -82.667 137.886c-7.13184 19.2344 -16.4248 48.627 -13.8311 80.1816c1.72852 19.5586 9.61719 36.416 23.4492 50.248l36.7402 37.0645
|
||||
c0.108398 0.108398 0.108398 0.108398 0.21582 0.216797c10.8066 10.374 23.5576 15.8848 36.7412 15.8848s25.7188 -5.51074 36.2002 -15.8848c7.02441 -6.48438 13.832 -13.3994 20.3154 -20.0996c3.24219 -3.45801 6.7002 -6.91602 10.0498 -10.2656l29.501 -29.501
|
||||
c22.6924 -22.6924 22.6924 -52.085 0 -74.7783c-3.02539 -3.02539 -6.05176 -6.15918 -9.07715 -9.18457c-7.99707 -8.10547 -16.209 -16.5342 -25.0703 -24.6387c6.5918 -14.5879 15.6689 -28.96 29.1768 -46.0342c27.8799 -34.2549 56.9482 -60.7295 88.9346 -81.0449
|
||||
c3.13281 -1.94531 6.80762 -3.78223 10.6973 -5.72754c2.70215 -1.40527 5.51172 -2.80957 8.32129 -4.32227l34.1475 34.0391c10.9141 10.9141 23.665 16.6416 36.9561 16.6416c13.4004 0 26.043 -5.83594 36.5254 -16.75zM443.327 17.0459
|
||||
c11.0225 11.4541 11.0225 22.8008 -0.108398 33.8232l-59.541 59.541l-0.216797 0.216797c-3.34961 3.67383 -8.86035 7.88867 -15.5605 7.88867c-6.80762 0 -12.6426 -4.43066 -16.3174 -8.10547l-36.957 -36.9561c-1.83691 -1.83789 -7.45605 -7.45703 -16.4248 -7.45703
|
||||
c-3.56641 0 -7.02441 0.865234 -10.6982 2.70215c-0.431641 0.21582 -0.864258 0.540039 -1.29688 0.755859c-3.13379 1.94531 -6.80762 3.78223 -10.6982 5.72754c-4.32227 2.16113 -8.86035 4.43066 -13.291 7.24023c-34.6875 21.9365 -66.1338 50.5723 -95.958 87.3135
|
||||
l-0.108398 0.107422c-16.4248 20.8564 -27.2314 38.3623 -34.9033 56.9482c-0.108398 0.324219 -0.216797 0.648438 -0.324219 0.972656c-1.94531 6.16016 -3.6748 15.2373 5.61914 24.5303c0.107422 0.21582 0.324219 0.324219 0.540039 0.540039
|
||||
c9.40137 8.42871 18.0459 17.0742 27.123 26.3672c3.13379 3.02539 6.16016 6.15918 9.29395 9.29297c11.4541 11.4551 11.4541 22.0449 0 33.499l-29.501 29.501c-3.45801 3.56543 -6.91602 7.02344 -10.2656 10.4814c-6.5918 6.80859 -12.8594 13.1836 -19.4512 19.3428
|
||||
c-0.108398 0.108398 -0.21582 0.216797 -0.324219 0.324219c-3.45801 3.45801 -8.96875 7.56445 -15.7773 7.56445c-5.51074 0 -11.1299 -2.70117 -16.4248 -7.67188l-36.8486 -36.8486c-8.96973 -8.96973 -13.832 -19.4512 -14.9131 -32.0947
|
||||
c-1.62109 -19.7754 2.05371 -40.7393 12.1035 -67.6465c16.3164 -44.0889 40.9551 -85.1514 77.8037 -129.564c44.6289 -53.2744 98.3359 -95.3105 159.498 -124.919c22.3691 -10.6982 52.1934 -23.2334 84.2881 -25.2861
|
||||
c1.62012 -0.108398 3.34961 -0.108398 4.9707 -0.108398c16.8574 0 29.7168 5.51074 40.6309 17.1816c6.69922 7.88867 13.832 14.9121 20.8555 21.6123c4.64648 4.53906 8.96973 8.64453 13.1836 13.1836c-0.108398 -0.108398 -0.108398 0 0 0zM276.697 326.209
|
||||
c-7.99707 1.29688 -13.1836 8.96875 -11.7793 16.8574c1.40527 7.88867 8.86133 13.1836 16.8574 11.8867c34.2559 -5.83594 65.4854 -22.0449 90.2314 -46.791s40.9551 -55.9756 46.79 -90.2305c1.29688 -7.99707 -3.99805 -15.5605 -11.9941 -16.8574
|
||||
c-0.864258 -0.108398 -1.62109 -0.216797 -2.48535 -0.216797c-7.02441 0 -13.1836 4.9707 -14.3721 12.1035c-4.86328 28.3115 -18.1543 54.0303 -38.6865 74.5615c-20.5312 20.5322 -46.25 33.9316 -74.5615 38.6865zM511.405 222.146
|
||||
c1.40527 -7.8877 -3.99805 -15.4521 -11.8867 -16.6416c-0.864258 -0.107422 -1.62012 -0.21582 -2.48535 -0.21582c-7.02344 0 -13.1826 4.9707 -14.3721 12.1025c-8.53613 50.3574 -32.3096 96.2832 -68.835 132.808c-36.5244 36.417 -82.4502 60.2979 -132.807 68.835
|
||||
c-7.99707 1.4043 -13.292 8.86133 -11.9951 16.8574c1.40527 7.88867 8.86133 13.292 16.75 11.8867c56.4072 -9.61719 107.736 -36.2002 148.584 -77.0479c40.8467 -40.8467 67.4297 -92.1758 77.0469 -148.584z" />
|
||||
<glyph glyph-name="uniF110" unicode=""
|
||||
d="M504.439 137.178c4.93359 -12.2803 7.66211 -25.7158 7.55762 -39.7803c0 -58.4629 -47.6523 -106.115 -106.115 -106.115c-53.0049 0 -97.0879 39.1504 -104.855 90.0566h-89.7412c-6.92676 -51.8506 -51.4307 -91.9453 -105.17 -91.9453
|
||||
c-58.4629 0 -106.115 47.6514 -106.115 106.114c0 13.96 2.83398 27.3955 7.76758 39.6758c0.104492 0.629883 0.208984 1.1543 0.418945 1.78418l67.5947 215.483c9.65625 31.3838 42.9287 49.1221 74.3125 39.5703c7.45215 -2.2041 11.7549 -10.1816 9.44629 -17.6338
|
||||
c-2.2041 -7.45215 -10.1816 -11.7549 -17.6338 -9.44629c-16.4785 5.03809 -33.9023 -4.30273 -38.9404 -20.7822v-0.104492l-49.1211 -156.182c15.4287 8.71191 33.2725 13.75 52.2705 13.75c53.7393 0 98.2432 -40.0947 105.17 -91.9453h89.2168
|
||||
c6.08789 52.6904 51.0107 93.835 105.38 93.835c18.8926 0 36.6309 -4.93359 52.0605 -13.6445l-48.4922 154.187v0.104492c-5.03809 16.4795 -22.4609 25.8203 -38.9404 20.7822c-7.45215 -2.30859 -15.3242 1.99414 -17.6328 9.44629
|
||||
c-2.30957 7.45215 1.99414 15.3242 9.44629 17.6338c31.3828 9.55176 64.7607 -8.18652 74.3125 -39.5703zM106.22 17.7324c42.8242 0 77.7754 34.8467 77.7754 77.7754c0 42.9297 -34.8467 77.7764 -77.7754 77.7764s-77.7754 -34.8467 -77.7754 -77.7764
|
||||
c0 -42.9287 34.8467 -77.7754 77.7754 -77.7754zM405.987 19.6221c42.9287 0 77.7754 34.8467 77.7754 77.7754s-34.9521 77.7754 -77.7754 77.7754c-42.8242 0 -77.7764 -34.8467 -77.7764 -77.7754s34.8467 -77.7754 77.7764 -77.7754z" />
|
||||
</font>
|
||||
</defs></svg>
|
||||
|
Before Width: | Height: | Size: 82 KiB |
@@ -1,139 +0,0 @@
|
||||
/*
|
||||
Flaticon icon font: Flaticon
|
||||
Creation date: 22/06/2016 15:35
|
||||
*/
|
||||
|
||||
@font-face {
|
||||
font-family: "Flaticon";
|
||||
src: url("./Flaticon.eot");
|
||||
src: url("./Flaticon.eot?#iefix") format("embedded-opentype"),
|
||||
url("./Flaticon.woff") format("woff"),
|
||||
url("./Flaticon.ttf") format("truetype"),
|
||||
url("./Flaticon.svg#Flaticon") format("svg");
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
@media screen and (-webkit-min-device-pixel-ratio:0) {
|
||||
@font-face {
|
||||
font-family: "Flaticon";
|
||||
src: url("./Flaticon.svg#Flaticon") format("svg");
|
||||
}
|
||||
}
|
||||
|
||||
.fi:before{
|
||||
display: inline-block;
|
||||
font-family: "Flaticon";
|
||||
font-style: normal;
|
||||
font-weight: normal;
|
||||
font-variant: normal;
|
||||
line-height: 1;
|
||||
text-decoration: inherit;
|
||||
text-rendering: optimizeLegibility;
|
||||
text-transform: none;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
font-smoothing: antialiased;
|
||||
}
|
||||
|
||||
.flaticon-avatar:before { content: "\f100"; }
|
||||
.flaticon-avatar-1:before { content: "\f101"; }
|
||||
.flaticon-back:before { content: "\f102"; }
|
||||
.flaticon-book:before { content: "\f103"; }
|
||||
.flaticon-cancel:before { content: "\f104"; }
|
||||
.flaticon-chat:before { content: "\f105"; }
|
||||
.flaticon-chat-1:before { content: "\f106"; }
|
||||
.flaticon-chat-2:before { content: "\f107"; }
|
||||
.flaticon-copy:before { content: "\f108"; }
|
||||
.flaticon-dislike:before { content: "\f109"; }
|
||||
.flaticon-download:before { content: "\f10a"; }
|
||||
.flaticon-download-1:before { content: "\f10b"; }
|
||||
.flaticon-edit:before { content: "\f10c"; }
|
||||
.flaticon-envelope:before { content: "\f10d"; }
|
||||
.flaticon-folder:before { content: "\f10e"; }
|
||||
.flaticon-garbage:before { content: "\f10f"; }
|
||||
.flaticon-glasses:before { content: "\f110"; }
|
||||
.flaticon-hand:before { content: "\f111"; }
|
||||
.flaticon-headphones:before { content: "\f112"; }
|
||||
.flaticon-heart:before { content: "\f113"; }
|
||||
.flaticon-house:before { content: "\f114"; }
|
||||
.flaticon-like:before { content: "\f115"; }
|
||||
.flaticon-link:before { content: "\f116"; }
|
||||
.flaticon-logout:before { content: "\f117"; }
|
||||
.flaticon-magnifying-glass:before { content: "\f118"; }
|
||||
.flaticon-monitor:before { content: "\f119"; }
|
||||
.flaticon-musical-note:before { content: "\f11a"; }
|
||||
.flaticon-next:before { content: "\f11b"; }
|
||||
.flaticon-next-1:before { content: "\f11c"; }
|
||||
.flaticon-padlock:before { content: "\f11d"; }
|
||||
.flaticon-paper-plane:before { content: "\f11e"; }
|
||||
.flaticon-phone-call:before { content: "\f11f"; }
|
||||
.flaticon-photo-camera:before { content: "\f120"; }
|
||||
.flaticon-pie-chart:before { content: "\f121"; }
|
||||
.flaticon-piggy-bank:before { content: "\f122"; }
|
||||
.flaticon-placeholder:before { content: "\f123"; }
|
||||
.flaticon-printer:before { content: "\f124"; }
|
||||
.flaticon-reload:before { content: "\f125"; }
|
||||
.flaticon-settings:before { content: "\f126"; }
|
||||
.flaticon-settings-1:before { content: "\f127"; }
|
||||
.flaticon-share:before { content: "\f128"; }
|
||||
.flaticon-shopping-bag:before { content: "\f129"; }
|
||||
.flaticon-shopping-cart:before { content: "\f12a"; }
|
||||
.flaticon-shuffle:before { content: "\f12b"; }
|
||||
.flaticon-speaker:before { content: "\f12c"; }
|
||||
.flaticon-star:before { content: "\f12d"; }
|
||||
.flaticon-tag:before { content: "\f12e"; }
|
||||
.flaticon-upload:before { content: "\f12f"; }
|
||||
.flaticon-upload-1:before { content: "\f130"; }
|
||||
.flaticon-vector:before { content: "\f131"; }
|
||||
|
||||
$font-Flaticon-avatar: "\f100";
|
||||
$font-Flaticon-avatar-1: "\f101";
|
||||
$font-Flaticon-back: "\f102";
|
||||
$font-Flaticon-book: "\f103";
|
||||
$font-Flaticon-cancel: "\f104";
|
||||
$font-Flaticon-chat: "\f105";
|
||||
$font-Flaticon-chat-1: "\f106";
|
||||
$font-Flaticon-chat-2: "\f107";
|
||||
$font-Flaticon-copy: "\f108";
|
||||
$font-Flaticon-dislike: "\f109";
|
||||
$font-Flaticon-download: "\f10a";
|
||||
$font-Flaticon-download-1: "\f10b";
|
||||
$font-Flaticon-edit: "\f10c";
|
||||
$font-Flaticon-envelope: "\f10d";
|
||||
$font-Flaticon-folder: "\f10e";
|
||||
$font-Flaticon-garbage: "\f10f";
|
||||
$font-Flaticon-glasses: "\f110";
|
||||
$font-Flaticon-hand: "\f111";
|
||||
$font-Flaticon-headphones: "\f112";
|
||||
$font-Flaticon-heart: "\f113";
|
||||
$font-Flaticon-house: "\f114";
|
||||
$font-Flaticon-like: "\f115";
|
||||
$font-Flaticon-link: "\f116";
|
||||
$font-Flaticon-logout: "\f117";
|
||||
$font-Flaticon-magnifying-glass: "\f118";
|
||||
$font-Flaticon-monitor: "\f119";
|
||||
$font-Flaticon-musical-note: "\f11a";
|
||||
$font-Flaticon-next: "\f11b";
|
||||
$font-Flaticon-next-1: "\f11c";
|
||||
$font-Flaticon-padlock: "\f11d";
|
||||
$font-Flaticon-paper-plane: "\f11e";
|
||||
$font-Flaticon-phone-call: "\f11f";
|
||||
$font-Flaticon-photo-camera: "\f120";
|
||||
$font-Flaticon-pie-chart: "\f121";
|
||||
$font-Flaticon-piggy-bank: "\f122";
|
||||
$font-Flaticon-placeholder: "\f123";
|
||||
$font-Flaticon-printer: "\f124";
|
||||
$font-Flaticon-reload: "\f125";
|
||||
$font-Flaticon-settings: "\f126";
|
||||
$font-Flaticon-settings-1: "\f127";
|
||||
$font-Flaticon-share: "\f128";
|
||||
$font-Flaticon-shopping-bag: "\f129";
|
||||
$font-Flaticon-shopping-cart: "\f12a";
|
||||
$font-Flaticon-shuffle: "\f12b";
|
||||
$font-Flaticon-speaker: "\f12c";
|
||||
$font-Flaticon-star: "\f12d";
|
||||
$font-Flaticon-tag: "\f12e";
|
||||
$font-Flaticon-upload: "\f12f";
|
||||
$font-Flaticon-upload-1: "\f130";
|
||||
$font-Flaticon-vector: "\f131";
|
||||
@@ -1,81 +0,0 @@
|
||||
/*
|
||||
Flaticon icon font: Flaticon
|
||||
Creation date: 22/06/2016 15:35
|
||||
*/
|
||||
|
||||
@font-face {
|
||||
font-family: "Flaticon";
|
||||
src: url("./Flaticon.eot");
|
||||
src: url("./Flaticon.eot?#iefix") format("embedded-opentype"),
|
||||
url("./Flaticon.woff") format("woff"),
|
||||
url("./Flaticon.ttf") format("truetype"),
|
||||
url("./Flaticon.svg#Flaticon") format("svg");
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
@media screen and (-webkit-min-device-pixel-ratio:0) {
|
||||
@font-face {
|
||||
font-family: "Flaticon";
|
||||
src: url("./Flaticon.svg#Flaticon") format("svg");
|
||||
}
|
||||
}
|
||||
|
||||
[class^="flaticon-"]:before, [class*=" flaticon-"]:before,
|
||||
[class^="flaticon-"]:after, [class*=" flaticon-"]:after {
|
||||
font-family: Flaticon;
|
||||
font-size: 20px;
|
||||
font-style: normal;
|
||||
margin-left: 20px;
|
||||
}
|
||||
|
||||
.flaticon-avatar:before { content: "\f100"; }
|
||||
.flaticon-avatar-1:before { content: "\f101"; }
|
||||
.flaticon-back:before { content: "\f102"; }
|
||||
.flaticon-book:before { content: "\f103"; }
|
||||
.flaticon-cancel:before { content: "\f104"; }
|
||||
.flaticon-chat:before { content: "\f105"; }
|
||||
.flaticon-chat-1:before { content: "\f106"; }
|
||||
.flaticon-chat-2:before { content: "\f107"; }
|
||||
.flaticon-copy:before { content: "\f108"; }
|
||||
.flaticon-dislike:before { content: "\f109"; }
|
||||
.flaticon-download:before { content: "\f10a"; }
|
||||
.flaticon-download-1:before { content: "\f10b"; }
|
||||
.flaticon-edit:before { content: "\f10c"; }
|
||||
.flaticon-envelope:before { content: "\f10d"; }
|
||||
.flaticon-folder:before { content: "\f10e"; }
|
||||
.flaticon-garbage:before { content: "\f10f"; }
|
||||
.flaticon-glasses:before { content: "\f110"; }
|
||||
.flaticon-hand:before { content: "\f111"; }
|
||||
.flaticon-headphones:before { content: "\f112"; }
|
||||
.flaticon-heart:before { content: "\f113"; }
|
||||
.flaticon-house:before { content: "\f114"; }
|
||||
.flaticon-like:before { content: "\f115"; }
|
||||
.flaticon-link:before { content: "\f116"; }
|
||||
.flaticon-logout:before { content: "\f117"; }
|
||||
.flaticon-magnifying-glass:before { content: "\f118"; }
|
||||
.flaticon-monitor:before { content: "\f119"; }
|
||||
.flaticon-musical-note:before { content: "\f11a"; }
|
||||
.flaticon-next:before { content: "\f11b"; }
|
||||
.flaticon-next-1:before { content: "\f11c"; }
|
||||
.flaticon-padlock:before { content: "\f11d"; }
|
||||
.flaticon-paper-plane:before { content: "\f11e"; }
|
||||
.flaticon-phone-call:before { content: "\f11f"; }
|
||||
.flaticon-photo-camera:before { content: "\f120"; }
|
||||
.flaticon-pie-chart:before { content: "\f121"; }
|
||||
.flaticon-piggy-bank:before { content: "\f122"; }
|
||||
.flaticon-placeholder:before { content: "\f123"; }
|
||||
.flaticon-printer:before { content: "\f124"; }
|
||||
.flaticon-reload:before { content: "\f125"; }
|
||||
.flaticon-settings:before { content: "\f126"; }
|
||||
.flaticon-settings-1:before { content: "\f127"; }
|
||||
.flaticon-share:before { content: "\f128"; }
|
||||
.flaticon-shopping-bag:before { content: "\f129"; }
|
||||
.flaticon-shopping-cart:before { content: "\f12a"; }
|
||||
.flaticon-shuffle:before { content: "\f12b"; }
|
||||
.flaticon-speaker:before { content: "\f12c"; }
|
||||
.flaticon-star:before { content: "\f12d"; }
|
||||
.flaticon-tag:before { content: "\f12e"; }
|
||||
.flaticon-upload:before { content: "\f12f"; }
|
||||
.flaticon-upload-1:before { content: "\f130"; }
|
||||
.flaticon-vector:before { content: "\f131"; }
|
||||
@@ -1,705 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<!--
|
||||
Flaticon icon font: Flaticon
|
||||
Creation date: 22/06/2016 15:35
|
||||
-->
|
||||
<html>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<title>Flaticon WebFont</title>
|
||||
<link href="http://fonts.googleapis.com/css?family=Varela+Round" rel="stylesheet" type="text/css" />
|
||||
<link rel="stylesheet" type="text/css" href="flaticon.css">
|
||||
<meta charset="UTF-8">
|
||||
<style>
|
||||
html, body, div, span, applet, object, iframe,
|
||||
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
|
||||
a, abbr, acronym, address, big, cite, code,
|
||||
del, dfn, em, img, ins, kbd, q, s, samp,
|
||||
small, strike, strong, sub, sup, tt, var,
|
||||
b, u, i, center,
|
||||
dl, dt, dd, ol, ul, li,
|
||||
fieldset, form, label, legend,
|
||||
table, caption, tbody, tfoot, thead, tr, th, td,
|
||||
article, aside, canvas, details, embed,
|
||||
figure, figcaption, footer, header, hgroup,
|
||||
menu, nav, output, ruby, section, summary,
|
||||
time, mark, audio, video {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
border: 0;
|
||||
font-size: 100%;
|
||||
font: inherit;
|
||||
vertical-align: baseline;
|
||||
}
|
||||
/* HTML5 display-role reset for older browsers */
|
||||
article, aside, details, figcaption, figure,
|
||||
footer, header, hgroup, menu, nav, section {
|
||||
display: block;
|
||||
}
|
||||
body {
|
||||
line-height: 1;
|
||||
}
|
||||
ol, ul {
|
||||
list-style: none;
|
||||
}
|
||||
blockquote, q {
|
||||
quotes: none;
|
||||
}
|
||||
blockquote:before, blockquote:after,
|
||||
q:before, q:after {
|
||||
content: '';
|
||||
content: none;
|
||||
}
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0;
|
||||
}
|
||||
body {
|
||||
font-family: 'Varela Round', Helvetica, Arial, sans-serif;
|
||||
font-size: 16px;
|
||||
color: #222;
|
||||
}
|
||||
a {
|
||||
color: #333;
|
||||
border-bottom: 1px solid #a9fd00;
|
||||
font-weight: bold;
|
||||
text-decoration: none;
|
||||
}
|
||||
* {
|
||||
-moz-box-sizing: border-box;
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
[class^="flaticon-"]:before, [class*=" flaticon-"]:before, [class^="flaticon-"]:after, [class*=" flaticon-"]:after {
|
||||
font-family: Flaticon;
|
||||
font-size: 30px;
|
||||
font-style: normal;
|
||||
margin-left: 20px;
|
||||
color: #333;
|
||||
}
|
||||
.wrapper {
|
||||
max-width: 600px;
|
||||
margin: auto;
|
||||
padding: 0 1em;
|
||||
}
|
||||
.title {
|
||||
font-size: 1.25em;
|
||||
text-align: center;
|
||||
margin-bottom: 1em;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
header {
|
||||
text-align: center;
|
||||
background-color: #222;
|
||||
color: #fff;
|
||||
padding: 1em;
|
||||
}
|
||||
header .logo {
|
||||
width: 210px;
|
||||
height: 38px;
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
margin-right: 1em;
|
||||
border: none;
|
||||
}
|
||||
header strong {
|
||||
font-size: 1.95em;
|
||||
font-weight: bold;
|
||||
vertical-align: middle;
|
||||
margin-top: 5px;
|
||||
display: inline-block;
|
||||
}
|
||||
.demo {
|
||||
margin: 2em auto;
|
||||
line-height: 1.25em;
|
||||
}
|
||||
.demo ul li {
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
.demo ul li .num {
|
||||
color: #222;
|
||||
border-radius: 20px;
|
||||
display: inline-block;
|
||||
width: 26px;
|
||||
padding: 3px;
|
||||
height: 26px;
|
||||
text-align: center;
|
||||
margin-right: 0.5em;
|
||||
border: 1px solid #222;
|
||||
}
|
||||
.demo ul li code {
|
||||
background-color: #222;
|
||||
border-radius: 4px;
|
||||
padding: 0.25em 0.5em;
|
||||
display: inline-block;
|
||||
color: #fff;
|
||||
font-family: Consolas,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New, monospace;
|
||||
font-weight: lighter;
|
||||
margin-top: 1em;
|
||||
font-size: 0.8em;
|
||||
word-break: break-all;
|
||||
}
|
||||
.demo ul li code.big {
|
||||
padding: 1em;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
.demo ul li code .red {
|
||||
color: #EF3159;
|
||||
}
|
||||
.demo ul li code .green {
|
||||
color: #ACFF65;
|
||||
}
|
||||
.demo ul li code .yellow {
|
||||
color: #FFFF99;
|
||||
}
|
||||
.demo ul li code .blue {
|
||||
color: #99D3FF;
|
||||
}
|
||||
.demo ul li code .purple {
|
||||
color: #A295FF;
|
||||
}
|
||||
.demo ul li code .dots {
|
||||
margin-top: 0.5em;
|
||||
display: block;
|
||||
}
|
||||
#glyphs {
|
||||
border-bottom: 1px solid #ccc;
|
||||
padding: 2em 0;
|
||||
text-align: center;
|
||||
}
|
||||
.glyph {
|
||||
display: inline-block;
|
||||
width: 9em;
|
||||
margin: 1em;
|
||||
text-align: center;
|
||||
vertical-align: top;
|
||||
background: #FFF;
|
||||
}
|
||||
.glyph .glyph-icon {
|
||||
padding: 10px;
|
||||
display: block;
|
||||
font-family:"Flaticon";
|
||||
font-size: 64px;
|
||||
line-height: 1;
|
||||
}
|
||||
.glyph .glyph-icon:before {
|
||||
font-size: 64px;
|
||||
color: #222;
|
||||
margin-left: 0;
|
||||
}
|
||||
.class-name {
|
||||
font-size: 0.65em;
|
||||
background-color: #222;
|
||||
color: #fff;
|
||||
border-radius: 4px 4px 0 0;
|
||||
padding: 0.5em;
|
||||
color: #FFFF99;
|
||||
font-family: Consolas,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New, monospace;
|
||||
}
|
||||
.author-name {
|
||||
font-size: 0.6em;
|
||||
background-color: #fcfcfd;
|
||||
border: 1px solid #DEDEE4;
|
||||
border-top: 0;
|
||||
border-radius: 0 0 4px 4px;
|
||||
padding: 0.5em;
|
||||
}
|
||||
.class-name:last-child {
|
||||
font-size: 10px;
|
||||
color:#888;
|
||||
}
|
||||
.class-name:last-child a {
|
||||
font-size: 10px;
|
||||
color:#555;
|
||||
}
|
||||
.class-name:last-child a:hover {
|
||||
color:#a9fd00;
|
||||
}
|
||||
.glyph > input {
|
||||
display: block;
|
||||
width: 100px;
|
||||
margin: 5px auto;
|
||||
text-align: center;
|
||||
font-size: 12px;
|
||||
cursor: text;
|
||||
}
|
||||
.glyph > input.icon-input {
|
||||
font-family:"Flaticon";
|
||||
font-size: 16px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.attribution .title {
|
||||
margin-top: 2em;
|
||||
}
|
||||
.attribution textarea {
|
||||
background-color: #fcfcfd;
|
||||
padding: 1em;
|
||||
border: none;
|
||||
box-shadow: none;
|
||||
border: 1px solid #DEDEE4;
|
||||
border-radius: 4px;
|
||||
resize: none;
|
||||
width: 100%;
|
||||
height: 150px;
|
||||
font-size: 0.8em;
|
||||
font-family: Consolas,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New, monospace;
|
||||
-webkit-appearance: none;
|
||||
}
|
||||
.iconsuse {
|
||||
margin: 2em auto;
|
||||
text-align: center;
|
||||
max-width: 1200px;
|
||||
}
|
||||
.iconsuse:after {
|
||||
content: '';
|
||||
display: table;
|
||||
clear: both;
|
||||
}
|
||||
.iconsuse .image {
|
||||
float: left;
|
||||
width: 25%;
|
||||
padding: 0 1em;
|
||||
}
|
||||
.iconsuse .image p {
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
.iconsuse .image span {
|
||||
display: block;
|
||||
font-size: 0.65em;
|
||||
background-color: #222;
|
||||
color: #fff;
|
||||
border-radius: 4px;
|
||||
padding: 0.5em;
|
||||
color: #FFFF99;
|
||||
margin-top: 1em;
|
||||
font-family: Consolas,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New, monospace;
|
||||
}
|
||||
#footer {
|
||||
text-align: center;
|
||||
background-color: #4C5B5C;
|
||||
color: #7c9192;
|
||||
padding: 1em;
|
||||
}
|
||||
#footer a {
|
||||
border: none;
|
||||
color: #a9fd00;
|
||||
font-weight: normal;
|
||||
}
|
||||
@media (max-width: 960px) {
|
||||
.iconsuse .image {
|
||||
width: 50%;
|
||||
}
|
||||
}
|
||||
@media (max-width: 560px) {
|
||||
.iconsuse .image {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body class="characters-off">
|
||||
|
||||
<header>
|
||||
<a href="http://www.flaticon.com" target="_blank" class="logo">
|
||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/" viewBox="0 0 560.875 102.036" enable-background="new 0 0 560.875 102.036" xml:space="preserve">
|
||||
<defs>
|
||||
</defs>
|
||||
<g>
|
||||
<g class="letters">
|
||||
<path fill="#ffffff" d="M141.596,29.675c0-3.777,2.985-6.767,6.764-6.767h34.438c3.426,0,6.15,2.728,6.15,6.15
|
||||
c0,3.43-2.724,6.149-6.15,6.149h-27.674v13.091h23.719c3.429,0,6.151,2.724,6.151,6.15c0,3.43-2.723,6.149-6.151,6.149h-23.719
|
||||
v17.574c0,3.773-2.986,6.761-6.764,6.761c-3.779,0-6.764-2.989-6.764-6.761V29.675z"></path>
|
||||
<path fill="#ffffff" d="M193.844,29.149c0-3.781,2.985-6.767,6.764-6.767c3.776,0,6.763,2.985,6.763,6.767v42.957h25.039
|
||||
c3.426,0,6.149,2.726,6.149,6.153c0,3.425-2.723,6.15-6.149,6.15h-31.802c-3.779,0-6.764-2.986-6.764-6.768V29.149z"></path>
|
||||
<path fill="#ffffff" d="M241.891,75.71l21.438-48.407c1.492-3.341,4.215-5.357,7.906-5.357h0.792
|
||||
c3.686,0,6.323,2.017,7.815,5.357l21.439,48.407c0.436,0.967,0.701,1.845,0.701,2.723c0,3.602-2.809,6.501-6.414,6.501
|
||||
c-3.161,0-5.269-1.845-6.499-4.655l-4.132-9.661h-27.059l-4.301,10.102c-1.144,2.631-3.426,4.214-6.237,4.214
|
||||
c-3.517,0-6.24-2.81-6.24-6.325C241.1,77.64,241.451,76.677,241.891,75.71z M279.932,58.666l-8.521-20.297l-8.526,20.297H279.932
|
||||
z"></path>
|
||||
<path fill="#ffffff" d="M314.864,35.387H301.86c-3.429,0-6.239-2.813-6.239-6.238c0-3.429,2.811-6.24,6.239-6.24h39.533
|
||||
c3.426,0,6.237,2.811,6.237,6.24c0,3.425-2.811,6.238-6.237,6.238h-13.001v42.785c0,3.773-2.99,6.761-6.764,6.761
|
||||
c-3.779,0-6.764-2.989-6.764-6.761V35.387z"></path>
|
||||
<path fill="#A9FD00" d="M352.615,29.149c0-3.781,2.985-6.767,6.767-6.767c3.774,0,6.761,2.985,6.761,6.767v49.024
|
||||
c0,3.773-2.987,6.761-6.761,6.761c-3.781,0-6.767-2.989-6.767-6.761V29.149z"></path>
|
||||
<path fill="#A9FD00" d="M374.132,53.836v-0.179c0-17.481,13.178-31.801,32.065-31.801c9.22,0,15.459,2.458,20.557,6.238
|
||||
c1.402,1.054,2.637,2.985,2.637,5.357c0,3.692-2.985,6.59-6.681,6.59c-1.845,0-3.071-0.702-4.044-1.319
|
||||
c-3.776-2.813-7.729-4.393-12.562-4.393c-10.364,0-17.831,8.611-17.831,19.154v0.173c0,10.542,7.291,19.329,17.831,19.329
|
||||
c5.715,0,9.492-1.756,13.359-4.834c1.049-0.874,2.458-1.491,4.039-1.491c3.429,0,6.325,2.813,6.325,6.236
|
||||
c0,2.106-1.056,3.78-2.282,4.834c-5.539,4.834-12.036,7.733-21.878,7.733C387.572,85.464,374.132,71.493,374.132,53.836z"></path>
|
||||
<path fill="#A9FD00" d="M433.009,53.836v-0.179c0-17.481,13.79-31.801,32.766-31.801c18.981,0,32.592,14.143,32.592,31.628v0.173
|
||||
c0,17.483-13.785,31.807-32.769,31.807C446.625,85.464,433.009,71.32,433.009,53.836z M484.224,53.836v-0.179
|
||||
c0-10.539-7.725-19.326-18.626-19.326c-10.893,0-18.449,8.611-18.449,19.154v0.173c0,10.542,7.73,19.329,18.626,19.329
|
||||
C476.676,72.986,484.224,64.378,484.224,53.836z"></path>
|
||||
<path fill="#A9FD00" d="M506.233,29.321c0-3.774,2.99-6.763,6.767-6.763h1.401c3.252,0,5.183,1.583,7.029,3.953l26.093,34.265
|
||||
V29.059c0-3.692,2.99-6.677,6.681-6.677c3.683,0,6.671,2.985,6.671,6.677v48.934c0,3.78-2.987,6.765-6.764,6.765h-0.436
|
||||
c-3.257,0-5.188-1.581-7.034-3.953l-27.056-35.492v32.944c0,3.687-2.985,6.676-6.678,6.676c-3.683,0-6.673-2.989-6.673-6.676
|
||||
V29.321z"></path>
|
||||
</g>
|
||||
<g class="insignia">
|
||||
<path fill="#ffffff" d="M48.372,56.137h12.517l11.156-18.537H37.186L25.688,18.539h57.825L94.668,0H9.271
|
||||
C5.925,0,2.842,1.801,1.198,4.716c-1.644,2.907-1.593,6.482,0.134,9.343l50.38,83.501c1.678,2.781,4.689,4.476,7.938,4.476
|
||||
c3.246,0,6.257-1.695,7.935-4.476l2.898-4.804L48.372,56.137z"></path>
|
||||
<g class="i">
|
||||
<path fill="#A9FD00" d="M93.575,18.539h0.031v0.004l21.652,0.004l2.705-4.488c1.727-2.861,1.778-6.436,0.133-9.343
|
||||
C116.454,1.801,113.371,0,110.026,0h-5.294L93.575,18.539z"></path>
|
||||
<polygon fill="#A9FD00" points="88.291,27.356 64.725,66.486 75.519,84.404 109.942,27.356"></polygon>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
</a>
|
||||
<strong>Font Demo</strong>
|
||||
</header>
|
||||
|
||||
|
||||
<section class="demo wrapper">
|
||||
|
||||
<p class="title">Instructions</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<span class="num">1</span>Copy the "Fonts" files and CSS files to your website CSS folder.
|
||||
</li>
|
||||
<li>
|
||||
<span class="num">2</span>Add the CSS link to your website source code on header.
|
||||
<code class="big">
|
||||
<<span class="red">head</span>>
|
||||
<br/><span class="dots">...</span>
|
||||
<br/><<span class="red">link</span> <span class="green">rel</span>=<span class="yellow">"stylesheet"</span> <span class="green">type</span>=<span class="yellow">"text/css"</span> <span class="green">href</span>=<span class="yellow">"your_website_domain/css_root/flaticon.css"</span>>
|
||||
<br/><span class="dots">...</span>
|
||||
<br/></<span class="red">head</span>>
|
||||
</code>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<p>
|
||||
<span class="num">3</span>Use the icon class on <code>"<span class="blue">display</span>:<span class="purple"> inline</span>"</code> elements:
|
||||
<br />
|
||||
Use example: <code><<span class="red">i</span> <span class="green">class</span>=<span class="yellow">"flaticon-airplane49"</span>></<span class="red">i</span>></code> or <code><<span class="red">span</span> <span class="green">class</span>=<span class="yellow">"flaticon-airplane49"</span>></<span class="red">span</span>></code>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
|
||||
<section id="glyphs">
|
||||
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-avatar"></div>
|
||||
<div class="class-name">.flaticon-avatar</div>
|
||||
<div class="author-name">Author: <a data-file="avatar" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-avatar-1"></div>
|
||||
<div class="class-name">.flaticon-avatar-1</div>
|
||||
<div class="author-name">Author: <a data-file="avatar-1" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-back"></div>
|
||||
<div class="class-name">.flaticon-back</div>
|
||||
<div class="author-name">Author: <a data-file="back" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-book"></div>
|
||||
<div class="class-name">.flaticon-book</div>
|
||||
<div class="author-name">Author: <a data-file="book" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-cancel"></div>
|
||||
<div class="class-name">.flaticon-cancel</div>
|
||||
<div class="author-name">Author: <a data-file="cancel" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-chat"></div>
|
||||
<div class="class-name">.flaticon-chat</div>
|
||||
<div class="author-name">Author: <a data-file="chat" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-chat-1"></div>
|
||||
<div class="class-name">.flaticon-chat-1</div>
|
||||
<div class="author-name">Author: <a data-file="chat-1" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-chat-2"></div>
|
||||
<div class="class-name">.flaticon-chat-2</div>
|
||||
<div class="author-name">Author: <a data-file="chat-2" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-copy"></div>
|
||||
<div class="class-name">.flaticon-copy</div>
|
||||
<div class="author-name">Author: <a data-file="copy" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-dislike"></div>
|
||||
<div class="class-name">.flaticon-dislike</div>
|
||||
<div class="author-name">Author: <a data-file="dislike" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-download"></div>
|
||||
<div class="class-name">.flaticon-download</div>
|
||||
<div class="author-name">Author: <a data-file="download" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-download-1"></div>
|
||||
<div class="class-name">.flaticon-download-1</div>
|
||||
<div class="author-name">Author: <a data-file="download-1" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-edit"></div>
|
||||
<div class="class-name">.flaticon-edit</div>
|
||||
<div class="author-name">Author: <a data-file="edit" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-envelope"></div>
|
||||
<div class="class-name">.flaticon-envelope</div>
|
||||
<div class="author-name">Author: <a data-file="envelope" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-folder"></div>
|
||||
<div class="class-name">.flaticon-folder</div>
|
||||
<div class="author-name">Author: <a data-file="folder" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-garbage"></div>
|
||||
<div class="class-name">.flaticon-garbage</div>
|
||||
<div class="author-name">Author: <a data-file="garbage" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-glasses"></div>
|
||||
<div class="class-name">.flaticon-glasses</div>
|
||||
<div class="author-name">Author: <a data-file="glasses" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-hand"></div>
|
||||
<div class="class-name">.flaticon-hand</div>
|
||||
<div class="author-name">Author: <a data-file="hand" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-headphones"></div>
|
||||
<div class="class-name">.flaticon-headphones</div>
|
||||
<div class="author-name">Author: <a data-file="headphones" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-heart"></div>
|
||||
<div class="class-name">.flaticon-heart</div>
|
||||
<div class="author-name">Author: <a data-file="heart" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-house"></div>
|
||||
<div class="class-name">.flaticon-house</div>
|
||||
<div class="author-name">Author: <a data-file="house" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-like"></div>
|
||||
<div class="class-name">.flaticon-like</div>
|
||||
<div class="author-name">Author: <a data-file="like" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-link"></div>
|
||||
<div class="class-name">.flaticon-link</div>
|
||||
<div class="author-name">Author: <a data-file="link" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-logout"></div>
|
||||
<div class="class-name">.flaticon-logout</div>
|
||||
<div class="author-name">Author: <a data-file="logout" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-magnifying-glass"></div>
|
||||
<div class="class-name">.flaticon-magnifying-glass</div>
|
||||
<div class="author-name">Author: <a data-file="magnifying-glass" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-monitor"></div>
|
||||
<div class="class-name">.flaticon-monitor</div>
|
||||
<div class="author-name">Author: <a data-file="monitor" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-musical-note"></div>
|
||||
<div class="class-name">.flaticon-musical-note</div>
|
||||
<div class="author-name">Author: <a data-file="musical-note" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-next"></div>
|
||||
<div class="class-name">.flaticon-next</div>
|
||||
<div class="author-name">Author: <a data-file="next" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-next-1"></div>
|
||||
<div class="class-name">.flaticon-next-1</div>
|
||||
<div class="author-name">Author: <a data-file="next-1" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-padlock"></div>
|
||||
<div class="class-name">.flaticon-padlock</div>
|
||||
<div class="author-name">Author: <a data-file="padlock" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-paper-plane"></div>
|
||||
<div class="class-name">.flaticon-paper-plane</div>
|
||||
<div class="author-name">Author: <a data-file="paper-plane" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-phone-call"></div>
|
||||
<div class="class-name">.flaticon-phone-call</div>
|
||||
<div class="author-name">Author: <a data-file="phone-call" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-photo-camera"></div>
|
||||
<div class="class-name">.flaticon-photo-camera</div>
|
||||
<div class="author-name">Author: <a data-file="photo-camera" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-pie-chart"></div>
|
||||
<div class="class-name">.flaticon-pie-chart</div>
|
||||
<div class="author-name">Author: <a data-file="pie-chart" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-piggy-bank"></div>
|
||||
<div class="class-name">.flaticon-piggy-bank</div>
|
||||
<div class="author-name">Author: <a data-file="piggy-bank" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-placeholder"></div>
|
||||
<div class="class-name">.flaticon-placeholder</div>
|
||||
<div class="author-name">Author: <a data-file="placeholder" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-printer"></div>
|
||||
<div class="class-name">.flaticon-printer</div>
|
||||
<div class="author-name">Author: <a data-file="printer" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-reload"></div>
|
||||
<div class="class-name">.flaticon-reload</div>
|
||||
<div class="author-name">Author: <a data-file="reload" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-settings"></div>
|
||||
<div class="class-name">.flaticon-settings</div>
|
||||
<div class="author-name">Author: <a data-file="settings" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-settings-1"></div>
|
||||
<div class="class-name">.flaticon-settings-1</div>
|
||||
<div class="author-name">Author: <a data-file="settings-1" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-share"></div>
|
||||
<div class="class-name">.flaticon-share</div>
|
||||
<div class="author-name">Author: <a data-file="share" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-shopping-bag"></div>
|
||||
<div class="class-name">.flaticon-shopping-bag</div>
|
||||
<div class="author-name">Author: <a data-file="shopping-bag" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-shopping-cart"></div>
|
||||
<div class="class-name">.flaticon-shopping-cart</div>
|
||||
<div class="author-name">Author: <a data-file="shopping-cart" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-shuffle"></div>
|
||||
<div class="class-name">.flaticon-shuffle</div>
|
||||
<div class="author-name">Author: <a data-file="shuffle" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-speaker"></div>
|
||||
<div class="class-name">.flaticon-speaker</div>
|
||||
<div class="author-name">Author: <a data-file="speaker" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-star"></div>
|
||||
<div class="class-name">.flaticon-star</div>
|
||||
<div class="author-name">Author: <a data-file="star" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-tag"></div>
|
||||
<div class="class-name">.flaticon-tag</div>
|
||||
<div class="author-name">Author: <a data-file="tag" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-upload"></div>
|
||||
<div class="class-name">.flaticon-upload</div>
|
||||
<div class="author-name">Author: <a data-file="upload" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-upload-1"></div>
|
||||
<div class="class-name">.flaticon-upload-1</div>
|
||||
<div class="author-name">Author: <a data-file="upload-1" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
<div class="glyph"><div class="glyph-icon flaticon-vector"></div>
|
||||
<div class="class-name">.flaticon-vector</div>
|
||||
<div class="author-name">Author: <a data-file="vector" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a> </div>
|
||||
</div>
|
||||
|
||||
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
<section class="attribution wrapper" style="text-align:center;">
|
||||
|
||||
<div class="title">License and attribution:</div><div class="attrDiv">Font generated by <a href="http://www.flaticon.com">flaticon.com</a>. <div><p>Under <a href="http://creativecommons.org/licenses/by/3.0/">CC</a>: <a data-file="envelope" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a></p> </div>
|
||||
</div>
|
||||
<div class="title">Copy the Attribution License:</div>
|
||||
|
||||
<textarea onclick="this.focus();this.select();">Font generated by <a href="http://www.flaticon.com">flaticon.com</a>. <p>Under <a href="http://creativecommons.org/licenses/by/3.0/">CC</a>: <a data-file="envelope" href="http://www.flaticon.com/authors/gregor-cresnar">Gregor Cresnar</a></p>
|
||||
</textarea>
|
||||
|
||||
</section>
|
||||
|
||||
<section class="iconsuse">
|
||||
|
||||
<div class="title">Examples:</div>
|
||||
|
||||
<div class="image">
|
||||
<p>
|
||||
<i class="glyph-icon flaticon-avatar"></i>
|
||||
<span><i class="flaticon-avatar"></i></span>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="image">
|
||||
<p>
|
||||
<i class="glyph-icon flaticon-avatar-1"></i>
|
||||
<span><i class="flaticon-avatar-1"></i></span>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="image">
|
||||
<p>
|
||||
<i class="glyph-icon flaticon-back"></i>
|
||||
<span><i class="flaticon-back"></i></span>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="image">
|
||||
<p>
|
||||
<i class="glyph-icon flaticon-book"></i>
|
||||
<span><i class="flaticon-book"></i></span>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</section>
|
||||
|
||||
<div id="footer">
|
||||
<div>Generated by <a href="http://www.flaticon.com">flaticon.com</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
Before Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 9.8 KiB |
|
Before Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 20 KiB |
@@ -1,33 +0,0 @@
|
||||
{
|
||||
"theme_color": "#276890",
|
||||
"background_color": "#276890",
|
||||
"display": "browser",
|
||||
"scope": "/",
|
||||
"start_url": "/",
|
||||
"lang": "fr",
|
||||
"name": "decp.info",
|
||||
"short_name": "decp.info",
|
||||
"description": "Outil d'exploration et de t\u00e9l\u00e9chargemetn des donn\u00e9es de la commande publique.",
|
||||
"icons": [
|
||||
{
|
||||
"src": "/static/icons/icon-192x192.png",
|
||||
"sizes": "192x192",
|
||||
"type": "image/png"
|
||||
},
|
||||
{
|
||||
"src": "/static/icons/icon-256x256.png",
|
||||
"sizes": "256x256",
|
||||
"type": "image/png"
|
||||
},
|
||||
{
|
||||
"src": "/static/icons/icon-384x384.png",
|
||||
"sizes": "384x384",
|
||||
"type": "image/png"
|
||||
},
|
||||
{
|
||||
"src": "/static/icons/icon-512x512.png",
|
||||
"sizes": "512x512",
|
||||
"type": "image/png"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
<script>
|
||||
document.body.addEventListener('click', (ev) => {
|
||||
/* Close any open details elements that this click is outside of */
|
||||
var target = ev.target;
|
||||
var detailsClickedWithin = null;
|
||||
while (target && target.tagName != 'DETAILS') {
|
||||
target = target.parentNode;
|
||||
}
|
||||
if (target && target.tagName == 'DETAILS') {
|
||||
detailsClickedWithin = target;
|
||||
}
|
||||
Array.from(document.getElementsByTagName('details')).filter(
|
||||
(details) => details.open && details != detailsClickedWithin
|
||||
).forEach(details => details.open = false);
|
||||
});
|
||||
</script>
|
||||
@@ -1,14 +0,0 @@
|
||||
<script src="{{ base_url }}-/static/sql-formatter-2.3.3.min.js" defer></script>
|
||||
<script src="{{ base_url }}-/static/codemirror-5.57.0.min.js"></script>
|
||||
<link rel="stylesheet" href="{{ base_url }}-/static/codemirror-5.57.0.min.css" />
|
||||
<script src="{{ base_url }}-/static/codemirror-5.57.0-sql.min.js"></script>
|
||||
<script src="{{ base_url }}-/static/cm-resize-1.0.1.min.js"></script>
|
||||
<style>
|
||||
.CodeMirror { height: auto; min-height: 70px; width: 80%; border: 1px solid #ddd; }
|
||||
.cm-resize-handle {
|
||||
background: url("data:image/svg+xml,%3Csvg%20aria-labelledby%3D%22cm-drag-to-resize%22%20role%3D%22img%22%20fill%3D%22%23ccc%22%20stroke%3D%22%23ccc%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2016%2016%22%20width%3D%2216%22%20height%3D%2216%22%3E%0A%20%20%3Ctitle%20id%3D%22cm-drag-to-resize%22%3EDrag%20to%20resize%3C%2Ftitle%3E%0A%20%20%3Cpath%20fill-rule%3D%22evenodd%22%20d%3D%22M1%202.75A.75.75%200%20011.75%202h12.5a.75.75%200%20110%201.5H1.75A.75.75%200%20011%202.75zm0%205A.75.75%200%20011.75%207h12.5a.75.75%200%20110%201.5H1.75A.75.75%200%20011%207.75zM1.75%2012a.75.75%200%20100%201.5h12.5a.75.75%200%20100-1.5H1.75z%22%3E%3C%2Fpath%3E%0A%3C%2Fsvg%3E");
|
||||
background-repeat: no-repeat;
|
||||
box-shadow: none;
|
||||
cursor: ns-resize;
|
||||
}
|
||||
</style>
|
||||
@@ -1,38 +0,0 @@
|
||||
<script>
|
||||
window.onload = () => {
|
||||
const sqlFormat = document.querySelector("button#sql-format");
|
||||
const readOnly = document.querySelector("pre#sql-query");
|
||||
const sqlInput = document.querySelector("textarea#sql-editor");
|
||||
if (sqlFormat && !readOnly) {
|
||||
sqlFormat.hidden = false;
|
||||
}
|
||||
if (sqlInput) {
|
||||
var editor = CodeMirror.fromTextArea(sqlInput, {
|
||||
lineNumbers: true,
|
||||
mode: "text/x-sql",
|
||||
lineWrapping: true,
|
||||
});
|
||||
editor.setOption("extraKeys", {
|
||||
"Shift-Enter": function() {
|
||||
document.getElementsByClassName("sql")[0].submit();
|
||||
},
|
||||
Tab: false
|
||||
});
|
||||
if (sqlFormat) {
|
||||
sqlFormat.addEventListener("click", ev => {
|
||||
editor.setValue(sqlFormatter.format(editor.getValue()));
|
||||
})
|
||||
}
|
||||
cmResize(editor, {resizableWidth: false});
|
||||
}
|
||||
if (sqlFormat && readOnly) {
|
||||
const formatted = sqlFormatter.format(readOnly.innerHTML);
|
||||
if (formatted != readOnly.innerHTML) {
|
||||
sqlFormat.hidden = false;
|
||||
sqlFormat.addEventListener("click", ev => {
|
||||
readOnly.innerHTML = formatted;
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
@@ -1,30 +0,0 @@
|
||||
{% if metadata.description_html or metadata.description %}
|
||||
<div class="metadata-description">
|
||||
{% if metadata.description_html %}
|
||||
{{ metadata.description_html|safe }}
|
||||
{% else %}
|
||||
{{ metadata.description }}
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if metadata.license or metadata.license_url or metadata.source or metadata.source_url %}
|
||||
<p>
|
||||
{% if metadata.license or metadata.license_url %}Licence des données :
|
||||
{% if metadata.license_url %}
|
||||
<a href="{{ metadata.license_url }}">{{ metadata.license or metadata.license_url }}</a>
|
||||
{% else %}
|
||||
{{ metadata.license }}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% if metadata.source or metadata.source_url %}{% if metadata.license or metadata.license_url %}·{% endif %}
|
||||
Source des données : {% if metadata.source_url %}
|
||||
<a href="{{ metadata.source_url }}">
|
||||
{% endif %}{{ metadata.source or metadata.source_url }}{% if metadata.source_url %}</a>{% endif %}
|
||||
{% endif %}
|
||||
{% if metadata.about or metadata.about_url %}{% if metadata.license or metadata.license_url or metadata.source or metadata.source_url %}·{% endif %}
|
||||
Plus d'informations : {% if metadata.about_url %}
|
||||
<a href="{{ metadata.about_url }}">
|
||||
{% endif %}{{ metadata.about or metadata.about_url }}{% if metadata.about_url %}</a>{% endif %}
|
||||
{% endif %}
|
||||
</p>
|
||||
{% endif %}
|
||||
@@ -1,23 +0,0 @@
|
||||
Propulsé par <a href="https://datasette.io/" title="Datasette v{{ datasette_version }}">Datasette</a>
|
||||
<!-- {% if query_ms %}· Durée de la requ {{ query_ms|round(3) }}ms{% endif %} -->
|
||||
{% if metadata %}
|
||||
{% if metadata.license or metadata.license_url %}· Licence des données :
|
||||
{% if metadata.license_url %}
|
||||
<a href="{{ metadata.license_url }}">{{ metadata.license or metadata.license_url }}</a>
|
||||
{% else %}
|
||||
{{ metadata.license }}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% if metadata.source or metadata.source_url %}·
|
||||
Source des données : {% if metadata.source_url %}
|
||||
<a href="{{ metadata.source_url }}">
|
||||
{% endif %}{{ metadata.source or metadata.source_url }}{% if metadata.source_url %}</a>{% endif %}
|
||||
{% endif %}
|
||||
· Code source : <a href="https://github.com/ColinMaudry/decp.info">Github</a>
|
||||
{% if metadata.about or metadata.about_url %}·
|
||||
Plus d'informations : {% if metadata.about_url %}
|
||||
<a href="{{ metadata.about_url }}">
|
||||
{% endif %}{{ metadata.about or metadata.about_url }}{% if metadata.about_url %}</a>{% endif %}
|
||||
{% endif %}
|
||||
· <a href="/mentions-legales">Mentions légales</a>
|
||||
{% endif %}
|
||||
@@ -1,34 +0,0 @@
|
||||
{% if display_rows %}
|
||||
<div class="table-wrapper">
|
||||
<table class="rows-and-columns">
|
||||
<thead>
|
||||
<tr>
|
||||
{% for column in display_columns %}
|
||||
<th class="col-{{ column.name|to_css_class }}" scope="col" data-column="{{ column.name }}" data-column-type="{{ column.type }}" data-column-not-null="{{ column.notnull }}" data-is-pk="{% if column.is_pk %}1{% else %}0{% endif %}">
|
||||
{% if not column.sortable %}
|
||||
{{ metadata.column_labels[column.name] }}
|
||||
{% else %}
|
||||
{% if column.name == sort %}
|
||||
<a href="{{ path_with_replaced_args(request, {'_sort_desc': column.name, '_sort': None, '_next': None}) }}" rel="nofollow">{{ metadata.column_labels[column.name] }} ▼</a>
|
||||
{% else %}
|
||||
<a href="{{ path_with_replaced_args(request, {'_sort': column.name, '_sort_desc': None, '_next': None}) }}" rel="nofollow">{{ metadata.column_labels[column.name] }}{% if column.name == sort_desc %} ▲{% endif %}</a>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</th>
|
||||
{% endfor %}
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for row in display_rows %}
|
||||
<tr>
|
||||
{% for cell in row %}
|
||||
<td class="col-{{ cell.column|to_css_class }} type-{{ cell.value_type }}"><div>{% if cell.column == "titulaire.id" or cell.column == "acheteur.id" %}<a href="https://annuaire-entreprises.data.gouv.fr/etablissement/{{ cell.value }}" target="_blank">{{ cell.value }}</a>{% elif cell.column == "codeAPE" %} <a href="https://www.insee.fr/fr/metadonnees/nafr2/sousClasse/{{ cell.value }}?champRecherche=true" target="_blank">{{ cell.value }}</a> {% else %}{{ cell.value }}{% endif %}</div></td>
|
||||
{% endfor %}
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{% else %}
|
||||
<p class="zero-results">0 lignes</p>
|
||||
{% endif %}
|
||||
@@ -1,3 +0,0 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
<h1>Coucou</h1>
|
||||
@@ -1,58 +0,0 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}Debug allow rules{% endblock %}
|
||||
|
||||
{% block extra_head %}
|
||||
<style>
|
||||
textarea {
|
||||
height: 10em;
|
||||
width: 95%;
|
||||
box-sizing: border-box;
|
||||
padding: 0.5em;
|
||||
border: 2px dotted black;
|
||||
}
|
||||
.two-col {
|
||||
display: inline-block;
|
||||
width: 48%;
|
||||
}
|
||||
.two-col label {
|
||||
width: 48%;
|
||||
}
|
||||
p.message-warning {
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
@media only screen and (max-width: 576px) {
|
||||
.two-col {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<h1>Debug allow rules</h1>
|
||||
|
||||
<p>Use this tool to try out different actor and allow combinations. See <a href="https://docs.datasette.io/en/stable/authentication.html#defining-permissions-with-allow-blocks">Defining permissions with "allow" blocks</a> for documentation.</p>
|
||||
|
||||
<form action="{{ urls.path('-/allow-debug') }}" method="get">
|
||||
<div class="two-col">
|
||||
<p><label>Allow block</label></p>
|
||||
<textarea name="allow">{{ allow_input }}</textarea>
|
||||
</div>
|
||||
<div class="two-col">
|
||||
<p><label>Actor</label></p>
|
||||
<textarea name="actor">{{ actor_input }}</textarea>
|
||||
</div>
|
||||
<div style="margin-top: 1em;">
|
||||
<input type="submit" value="Apply allow block to actor">
|
||||
</div>
|
||||
</form>
|
||||
|
||||
{% if error %}<p class="message-warning">{{ error }}</p>{% endif %}
|
||||
|
||||
{% if result == "True" %}<p class="message-info">Result: allow</p>{% endif %}
|
||||
|
||||
{% if result == "False" %}<p class="message-error">Result: deny</p>{% endif %}
|
||||
|
||||
{% endblock %}
|
||||
@@ -1,94 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>{% block title %}{% endblock %}</title>
|
||||
<link rel="stylesheet" href="{{ urls.static('app.css') }}?{{ app_css_hash }}">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
<link rel="manifest" href="/static/manifest.webmanifest">
|
||||
{% for url in extra_css_urls %}
|
||||
<link rel="stylesheet" href="{{ url.url }}"{% if url.sri %} integrity="{{ url.sri }}" crossorigin="anonymous"{% endif %}>
|
||||
{% endfor %}
|
||||
{% for url in extra_js_urls %}
|
||||
<script {% if url.module %}type="module" {% endif %}src="{{ url.url }}"{% if url.sri %} integrity="{{ url.sri }}" crossorigin="anonymous"{% endif %}></script>
|
||||
{% endfor %}
|
||||
{% block extra_head %}{% endblock %}
|
||||
|
||||
<meta name="twitter:card" content="summary"></meta>
|
||||
<meta name="twitter:creator" content="@col1m" />
|
||||
<meta name="author" content="Colin Maudry" />
|
||||
|
||||
<meta property="og:type" content="website"/>
|
||||
<meta property="og:title" content="decp.info : exploration et téléchargement des données des marchés publics" />
|
||||
<meta name="description" property="og:description" content="decp.info vous permet de filtrer et trier les données sur les marchés publics français et de télécharger le résultat sous la forme d'un fichier que vous pourrez ouvrir dans un logiciel de tableur. Outil gratuit et libre." />
|
||||
<meta name="image" property="og:image" content="https://decp.info/static/images/capture.png" />
|
||||
|
||||
<link rel="shortcut icon" href="/static/icons/icon-192x192.png" />
|
||||
|
||||
<!-- Matomo -->
|
||||
<script type="text/javascript">
|
||||
var _paq = window._paq = window._paq || [];
|
||||
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
|
||||
_paq.push(['trackPageView']);
|
||||
_paq.push(['enableLinkTracking']);
|
||||
(function() {
|
||||
var u="//analytics.maudry.com/";
|
||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||
_paq.push(['setSiteId', '14']);
|
||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||
g.type='text/javascript'; g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
|
||||
})();
|
||||
</script>
|
||||
<!-- End Matomo Code -->
|
||||
|
||||
</head>
|
||||
<body class="{% block body_class %}{% endblock %}">
|
||||
<header><nav>{% block nav %}
|
||||
{% set links = menu_links() %}{% if links or show_logout %}
|
||||
<details class="nav-menu">
|
||||
<summary>Menu</summary>
|
||||
<div class="nav-menu-inner">
|
||||
{% if links %}
|
||||
<ul>
|
||||
{% for link in links %}
|
||||
<li><a href="{{ link.href }}">{{ link.label }}</a></li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endif %}
|
||||
{% if show_logout %}
|
||||
<form action="{{ urls.logout() }}" method="post">
|
||||
<input type="hidden" name="csrftoken" value="{{ csrftoken() }}">
|
||||
<button class="button-as-link">Déconnexion</button>
|
||||
</form>{% endif %}
|
||||
</div>
|
||||
</details>{% endif %}
|
||||
{% if actor %}
|
||||
<div class="actor">
|
||||
<strong>{{ display_actor(actor) }}</strong>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endblock %}</nav></header>
|
||||
|
||||
{% block messages %}
|
||||
{% if show_messages %}
|
||||
{% for message, message_type in show_messages() %}
|
||||
<p class="message-{% if message_type == 1 %}info{% elif message_type == 2 %}warning{% elif message_type == 3 %}error{% endif %}">{{ message }}</p>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
|
||||
<section class="content">
|
||||
{% block content %}
|
||||
{% endblock %}
|
||||
</section>
|
||||
|
||||
<footer class="ft">{% block footer %}{% include "_footer.html" %}{% endblock %}</footer>
|
||||
|
||||
{% include "_close_open_menus.html" %}
|
||||
|
||||
{% for body_script in body_scripts %}
|
||||
<script{% if body_script.module %} type="module"{% endif %}>{{ body_script.script }}</script>
|
||||
{% endfor %}
|
||||
|
||||
{% if select_templates %}<!-- Templates considered: {{ select_templates|join(", ") }} -->{% endif %}
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,113 +0,0 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}{{ database }}{% endblock %}
|
||||
|
||||
{% block extra_head %}
|
||||
{{ super() }}
|
||||
{% include "_codemirror.html" %}
|
||||
{% endblock %}
|
||||
|
||||
{% block body_class %}db db-{{ database|to_css_class }}{% endblock %}
|
||||
|
||||
{% block nav %}
|
||||
<p class="crumbs">
|
||||
<a href="{{ urls.instance() }}">accueil</a>
|
||||
</p>
|
||||
{{ super() }}
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
|
||||
<!-- <div class="page-header" style="border-color: #{{ database_color(database) }}">
|
||||
<h1>{{ metadata.title or database }}{% if private %} 🔒{% endif %}</h1>
|
||||
{% set links = database_actions() %}{% if links %}
|
||||
<details class="actions-menu-links">
|
||||
<summary><svg aria-labelledby="actions-menu-links-title" role="img"
|
||||
style="color: #666" xmlns="http://www.w3.org/2000/svg"
|
||||
width="28" height="28" viewBox="0 0 24 24" fill="none"
|
||||
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||
<title id="actions-menu-links-title">Table actions</title>
|
||||
<circle cx="12" cy="12" r="3"></circle>
|
||||
<path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"></path>
|
||||
</svg></summary>
|
||||
<div class="dropdown-menu">
|
||||
{% if links %}
|
||||
<ul>
|
||||
{% for link in links %}
|
||||
<li><a href="{{ link.href }}">{{ link.label }}</a></li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endif %}
|
||||
</div>
|
||||
</details>{% endif %}
|
||||
</div> -->
|
||||
|
||||
<!-- {% block description_source_license %}{% include "_description_source_license.html" %}{% endblock %} -->
|
||||
|
||||
|
||||
{% if attached_databases %}
|
||||
<div class="message-info">
|
||||
<p>The following databases are attached to this connection, and can be used for cross-database joins:</p>
|
||||
<ul class="bullets">
|
||||
{% for db_name in attached_databases %}
|
||||
<li><strong>{{ db_name }}</strong> - <a href="?sql=select+*+from+[{{ db_name }}].sqlite_master+where+type='table'">tables</a></li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<p class="db-presentation">decp.info vous permet d'explorer les données à travers différentes vues. Selon que vous soyez plutôt intéressé·e par le montant, les titulaires ou les caractériques d'un marché public, une vue vous sera plus utile qu'une autre.</p>
|
||||
|
||||
{% for table in tables %}
|
||||
{% if show_hidden or not table.hidden %}
|
||||
<div class="db-table">
|
||||
<h2><a href="{{ urls.table(database, table.name) }}">{{ metadata.tables[table.name].title }}</a>{% if table.private %} 🔒{% endif %}{% if table.hidden %}<em> (hidden)</em>{% endif %}</h2>
|
||||
<p>Description : {{ metadata.tables[table.name].description_html | safe }} (<a target="_blank" href="{{ metadata.tables[table.name].download }}">CSV</a>)</p>
|
||||
<p class="columns">Colonnes : {% for column in table.columns %}{{ column }}{% if not loop.last %}, {% endif %}{% endfor %}</p>
|
||||
<p>{% if table.count is none %}{% else %}{{ "{:,}".format(table.count) }} ligne{% if table.count == 1 %}{% else %}s{% endif %}{% endif %}</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
|
||||
{% if hidden_count and not show_hidden %}
|
||||
<p>... and <a href="{{ urls.database(database) }}?_show_hidden=1">{{ "{:,}".format(hidden_count) }} hidden table{% if hidden_count == 1 %}{% else %}s{% endif %}</a></p>
|
||||
{% endif %}
|
||||
|
||||
{% if views %}
|
||||
<h2 id="views">Views</h2>
|
||||
<ul class="bullets">
|
||||
{% for view in views %}
|
||||
<li><a href="{{ urls.database(database) }}/{{ view.name|urlencode }}">{{ view.name }}</a>{% if view.private %} 🔒{% endif %}</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endif %}
|
||||
|
||||
{% if queries %}
|
||||
<h2 id="queries">Queries</h2>
|
||||
<ul class="bullets">
|
||||
{% for query in queries %}
|
||||
<li><a href="{{ urls.query(database, query.name) }}{% if query.fragment %}#{{ query.fragment }}{% endif %}" title="{{ query.description or query.sql }}">{{ query.title or query.name }}</a>{% if query.private %} 🔒{% endif %}</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endif %}
|
||||
|
||||
|
||||
{% if allow_execute_sql %}
|
||||
<form class="sql" action="{{ urls.database(database) }}" method="get">
|
||||
<h3>Requête SQL personnalisée</h3>
|
||||
<p><textarea id="sql-editor" name="sql">{% if tables %}select * from {{ tables[0].name|escape_sqlite }}{% else %}select sqlite_version(){% endif %}</textarea></p>
|
||||
<p>
|
||||
<button id="sql-format" type="button" hidden>Formater le SQL</button>
|
||||
<input type="submit" value="Exécuter">
|
||||
</p>
|
||||
</form>
|
||||
{% endif %}
|
||||
|
||||
{% if allow_download %}
|
||||
<p class="download-sqlite">Download SQLite DB: <a href="{{ urls.database(database) }}.db">{{ database }}.db</a> <em>{{ format_bytes(size) }}</em></p>
|
||||
{% endif %}
|
||||
|
||||
{% include "_codemirror_foot.html" %}
|
||||
|
||||
{% endblock %}
|
||||
@@ -1,18 +0,0 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}{% if title %}{{ title }}{% else %}Error {{ status }}{% endif %}{% endblock %}
|
||||
|
||||
{% block nav %}
|
||||
<p class="crumbs">
|
||||
<a href="{{ urls.instance() }}">accueil</a>
|
||||
</p>
|
||||
{{ super() }}
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<h1>{% if title %}{{ title }}{% else %}Erreur {{ status }}{% endif %}</h1>
|
||||
|
||||
<div style="padding: 1em; margin: 1em 0; border: 3px solid red;">{{ error }}</div>
|
||||
|
||||
{% endblock %}
|
||||
@@ -1,38 +0,0 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}{{ metadata.title or "Datasette" }}: {% for database in databases %}{{ database.name }}{% if not loop.last %}, {% endif %}{% endfor %}{% endblock %}
|
||||
|
||||
{% block body_class %}index{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<h1>{{ metadata.title or "Datasette" }}{% if private %} 🔒{% endif %}</h1>
|
||||
|
||||
<!-- {% block description_source_license %}{% include "_description_source_license.html" %}{% endblock %}
|
||||
-->
|
||||
<p><a class="explore nodec" href="/db"><i class="flaticon-magnifying-glass"></i></a> <a class="explore" href="/db">Explorer les données</a></p>
|
||||
|
||||
<p><a class="explore nodec" href="https://teamopendata.org/t/decp-info-les-donnees-de-la-commande-publique-pour-tous-questions-reponses-discussions/2948"><i class="flaticon-chat-2"></i></a> <a href="https://teamopendata.org/t/decp-info-les-donnees-de-la-commande-publique-pour-tous-questions-reponses-discussions/2948">Présentation / FAQ / discussions</a></p>
|
||||
|
||||
<p><a class="explore nodec" href="/versions"><i class="flaticon-copy"></i></a> <a href="/versions">Notes de version</a></p>
|
||||
|
||||
<p><a class="explore nodec" href="/inscription"><i class="flaticon-paper-plane"></i></a> <a href="/inscription">Se tenir informé des nouveautés de decp.info</a></p>
|
||||
|
||||
<p><a class="explore nodec" href="mailto:colin+decp@maudry.com"><i class="flaticon-envelope"></i></a> <a href="mailto:colin+decp@maudry.com">colin+decp@maudry.com</a></p>
|
||||
|
||||
<!-- {% for database in databases %}
|
||||
<h2 style="padding-left: 10px; border-left: 10px solid #{{ database.color }}">
|
||||
<a href="{{ urls.database(database.name) }}">{{ database.name }}</a>{% if database.private %} 🔒{% endif %}</h2>
|
||||
<p>
|
||||
{% if database.show_table_row_counts %}{{ "{:,}".format(database.table_rows_sum) }} rows in {% endif %}{{ database.tables_count }} table{% if database.tables_count != 1 %}s{% endif %}{% if database.tables_count and database.hidden_tables_count %}, {% endif -%}
|
||||
{% if database.hidden_tables_count -%}
|
||||
{% if database.show_table_row_counts %}{{ "{:,}".format(database.hidden_table_rows_sum) }} rows in {% endif %}{{ database.hidden_tables_count }} hidden table{% if database.hidden_tables_count != 1 %}s{% endif -%}
|
||||
{% endif -%}
|
||||
{% if database.views_count -%}
|
||||
{% if database.tables_count or database.hidden_tables_count %}, {% endif -%}
|
||||
{{ "{:,}".format(database.views_count) }} view{% if database.views_count != 1 %}s{% endif %}
|
||||
{% endif %}
|
||||
</p>
|
||||
<p>{% for table in database.tables_and_views_truncated %}<a href="{{ urls.table(database.name, table.name) }}"{% if table.count %} title="{{ table.count }} rows"{% endif %}>{{ table.name }}</a>{% if table.private %} 🔒{% endif %}{% if not loop.last %}, {% endif %}{% endfor %}{% if database.tables_and_views_more %}, <a href="{{ urls.database(database.name) }}">...</a>{% endif %}</p>
|
||||
{% endfor %} -->
|
||||
|
||||
{% endblock %}
|
||||
@@ -1,25 +0,0 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}Log out{% endblock %}
|
||||
|
||||
{% block nav %}
|
||||
<p class="crumbs">
|
||||
<a href="{{ base_url }}">home</a>
|
||||
</p>
|
||||
{{ super() }}
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<h1>Log out</h1>
|
||||
|
||||
<p>You are logged in as <strong>{{ display_actor(actor) }}</strong></p>
|
||||
|
||||
<form action="{{ urls.logout() }}" method="post">
|
||||
<div>
|
||||
<input type="hidden" name="csrftoken" value="{{ csrftoken() }}">
|
||||
<input type="submit" value="Log out">
|
||||
</div>
|
||||
</form>
|
||||
|
||||
{% endblock %}
|
||||
@@ -1,27 +0,0 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}Debug messages{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<h1>Debug messages</h1>
|
||||
|
||||
<p>Set a message:</p>
|
||||
|
||||
<form action="{{ urls.path('-/messages') }}" method="post">
|
||||
<div>
|
||||
<input type="text" name="message" style="width: 40%">
|
||||
<div class="select-wrapper">
|
||||
<select name="message_type">
|
||||
<option>INFO</option>
|
||||
<option>WARNING</option>
|
||||
<option>ERROR</option>
|
||||
<option>all</option>
|
||||
</select>
|
||||
</div>
|
||||
<input type="hidden" name="csrftoken" value="{{ csrftoken() }}">
|
||||
<input type="submit" value="Add message">
|
||||
</div>
|
||||
</form>
|
||||
|
||||
{% endblock %}
|
||||
@@ -1,240 +0,0 @@
|
||||
{% extends "base.html" %}
|
||||
{% block title %}Se tenir informé{% endblock %}
|
||||
{% block nav %}
|
||||
<p class="crumbs">
|
||||
<a href="{{ urls.instance() }}">accueil</a>
|
||||
</p>
|
||||
{{ super() }}
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
|
||||
<h1>Se tenir informé des nouveautés de decp.info</h1>
|
||||
|
||||
<p><a href="/mentions-legales">Mentions légales et politique de confidentialité</a></p>
|
||||
|
||||
<!-- Begin Sendinblue Form -->
|
||||
<!-- START - We recommend to place the below code in head tag of your website html -->
|
||||
<style>
|
||||
@font-face {
|
||||
font-display: block;
|
||||
font-family: Roboto;
|
||||
src: url(https://assets.sendinblue.com/font/Roboto/Latin/normal/normal/7529907e9eaf8ebb5220c5f9850e3811.woff2) format("woff2"), url(https://assets.sendinblue.com/font/Roboto/Latin/normal/normal/25c678feafdc175a70922a116c9be3e7.woff) format("woff")
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-display: fallback;
|
||||
font-family: Roboto;
|
||||
font-weight: 600;
|
||||
src: url(https://assets.sendinblue.com/font/Roboto/Latin/medium/normal/6e9caeeafb1f3491be3e32744bc30440.woff2) format("woff2"), url(https://assets.sendinblue.com/font/Roboto/Latin/medium/normal/71501f0d8d5aa95960f6475d5487d4c2.woff) format("woff")
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-display: fallback;
|
||||
font-family: Roboto;
|
||||
font-weight: 700;
|
||||
src: url(https://assets.sendinblue.com/font/Roboto/Latin/bold/normal/3ef7cf158f310cf752d5ad08cd0e7e60.woff2) format("woff2"), url(https://assets.sendinblue.com/font/Roboto/Latin/bold/normal/ece3a1d82f18b60bcce0211725c476aa.woff) format("woff")
|
||||
}
|
||||
|
||||
#sib-container input:-ms-input-placeholder {
|
||||
text-align: left;
|
||||
font-family: "Helvetica", sans-serif;
|
||||
color: #c0ccda;
|
||||
}
|
||||
|
||||
#sib-container input::placeholder {
|
||||
text-align: left;
|
||||
font-family: "Helvetica", sans-serif;
|
||||
color: #c0ccda;
|
||||
}
|
||||
|
||||
#sib-container textarea::placeholder {
|
||||
text-align: left;
|
||||
font-family: "Helvetica", sans-serif;
|
||||
color: #c0ccda;
|
||||
}
|
||||
</style>
|
||||
<link rel="stylesheet" href="https://sibforms.com/forms/end-form/build/sib-styles.css">
|
||||
<!-- END - We recommend to place the above code in head tag of your website html -->
|
||||
|
||||
<!-- START - We recommend to place the below code where you want the form in your website html -->
|
||||
<div class="sib-form" style="text-align: center;
|
||||
background-color: #EFF2F7; ">
|
||||
<div id="sib-form-container" class="sib-form-container">
|
||||
<div id="error-message" class="sib-form-message-panel" style="font-size:16px; text-align:left; font-family:"Helvetica", sans-serif; color:#661d1d; background-color:#ffeded; border-radius:3px; border-color:#ff4949;max-width:540px;">
|
||||
<div class="sib-form-message-panel__text sib-form-message-panel__text--center">
|
||||
<svg viewBox="0 0 512 512" class="sib-icon sib-notification__icon">
|
||||
<path d="M256 40c118.621 0 216 96.075 216 216 0 119.291-96.61 216-216 216-119.244 0-216-96.562-216-216 0-119.203 96.602-216 216-216m0-32C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8zm-11.49 120h22.979c6.823 0 12.274 5.682 11.99 12.5l-7 168c-.268 6.428-5.556 11.5-11.99 11.5h-8.979c-6.433 0-11.722-5.073-11.99-11.5l-7-168c-.283-6.818 5.167-12.5 11.99-12.5zM256 340c-15.464 0-28 12.536-28 28s12.536 28 28 28 28-12.536 28-28-12.536-28-28-28z"
|
||||
/>
|
||||
</svg>
|
||||
<span class="sib-form-message-panel__inner-text">
|
||||
Il y a eu un problème lors de votre inscription.
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div></div>
|
||||
<div id="success-message" class="sib-form-message-panel" style="font-size:16px; text-align:left; font-family:"Helvetica", sans-serif; color:#085229; background-color:#F8FAFB; border-radius:3px; border-color:#13ce66;max-width:540px;">
|
||||
<div class="sib-form-message-panel__text sib-form-message-panel__text--center">
|
||||
<svg viewBox="0 0 512 512" class="sib-icon sib-notification__icon">
|
||||
<path d="M256 8C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8zm0 464c-118.664 0-216-96.055-216-216 0-118.663 96.055-216 216-216 118.664 0 216 96.055 216 216 0 118.663-96.055 216-216 216zm141.63-274.961L217.15 376.071c-4.705 4.667-12.303 4.637-16.97-.068l-85.878-86.572c-4.667-4.705-4.637-12.303.068-16.97l8.52-8.451c4.705-4.667 12.303-4.637 16.97.068l68.976 69.533 163.441-162.13c4.705-4.667 12.303-4.637 16.97.068l8.451 8.52c4.668 4.705 4.637 12.303-.068 16.97z"
|
||||
/>
|
||||
</svg>
|
||||
<span class="sib-form-message-panel__inner-text">
|
||||
Votre inscription à la lettre d'information de decp.info est confirmée !
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div></div>
|
||||
<div id="sib-container" class="sib-container--large sib-container--vertical" style="text-align:center; background-color:rgba(255,255,255,1); max-width:540px; border-radius:3px; border-width:1px; border-color:#C0CCD9; border-style:solid;">
|
||||
<form id="sib-form" method="POST" action="https://6254d9a3.sibforms.com/serve/MUIEAFh0B8R5fTSPBmKbkiziso8TBxEbUSvq4FaHCK9EL8CT6H41du2IXKnJZhVBXFYxxZgnOVqO7hribE8qPWpY5IE5yraVm7d7uKdlGqurkl0XgHUy4fILW8aPuGAcn60ZsZzJf7gxINtPUpSlrOsjZPcdl4vvWgsaAU51rM9cXCC8Mm_MrlvOkuZk_uah-YUNMjj6qLONk1WR"
|
||||
data-type="subscription">
|
||||
<div style="padding: 8px 0;">
|
||||
<div class="sib-form-block" style="font-size:16px; text-align:left; font-family:"Helvetica", sans-serif; color:#3C4858; background-color:transparent;">
|
||||
<div class="sib-text-form-block">
|
||||
<p>Inscrivez-vous à la lettre d'information de decp.info afin d'être informé·e de l'ajout de nouvelles fonctionnalités (2 mails par mois maximum).</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div style="padding: 8px 0;">
|
||||
<div class="sib-input sib-form-block">
|
||||
<div class="form__entry entry_block">
|
||||
<div class="form__label-row ">
|
||||
<label class="entry__label" style="font-size:16px; text-align:left; font-weight:700; font-family:"Helvetica", sans-serif; color:#3c4858;" for="EMAIL" data-required="*">
|
||||
Votre adresse email :
|
||||
</label>
|
||||
|
||||
<div class="entry__field">
|
||||
<input class="input" type="text" id="EMAIL" name="EMAIL" autocomplete="off" data-required="true" required />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<label class="entry__error entry__error--primary" style="font-size:16px; text-align:left; font-family:"Helvetica", sans-serif; color:#661d1d; background-color:#ffeded; border-radius:3px; border-color:#ff4949;">
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div style="padding: 8px 0;">
|
||||
<div class="sib-input sib-form-block">
|
||||
<div class="form__entry entry_block">
|
||||
<div class="form__label-row ">
|
||||
<label class="entry__label" style="font-size:16px; text-align:left; font-weight:700; font-family:"Helvetica", sans-serif; color:#3c4858;" for="NOM">
|
||||
Votre nom :
|
||||
</label>
|
||||
|
||||
<div class="entry__field">
|
||||
<input class="input" maxlength="200" type="text" id="NOM" name="NOM" autocomplete="off" placeholder="Optionnel" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<label class="entry__error entry__error--primary" style="font-size:16px; text-align:left; font-family:"Helvetica", sans-serif; color:#661d1d; background-color:#ffeded; border-radius:3px; border-color:#ff4949;">
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div style="padding: 8px 0;">
|
||||
<div class="sib-input sib-form-block">
|
||||
<div class="form__entry entry_block">
|
||||
<div class="form__label-row ">
|
||||
<label class="entry__label" style="font-size:16px; text-align:left; font-weight:700; font-family:"Helvetica", sans-serif; color:#3c4858;" for="ORGANISME">
|
||||
Votre organisme :
|
||||
</label>
|
||||
|
||||
<div class="entry__field">
|
||||
<input class="input" maxlength="200" type="text" id="ORGANISME" name="ORGANISME" autocomplete="off" placeholder="Optionnel" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<label class="entry__error entry__error--primary" style="font-size:16px; text-align:left; font-family:"Helvetica", sans-serif; color:#661d1d; background-color:#ffeded; border-radius:3px; border-color:#ff4949;">
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div style="padding: 8px 0;">
|
||||
<div class="sib-optin sib-form-block">
|
||||
<div class="form__entry entry_mcq">
|
||||
<div class="form__label-row ">
|
||||
<div class="entry__choice">
|
||||
<label>
|
||||
<input type="checkbox" class="input_replaced" value="1" id="OPT_IN" name="OPT_IN" />
|
||||
<span class="checkbox checkbox_tick_positive"></span><span style="font-size:14px; text-align:left; font-family:"Helvetica", sans-serif; color:#3C4858; background-color:transparent;"><p>J'accepte de recevoir vos e-mails et confirme avoir pris connaissance de votre politique de confidentialité et mentions légales.</p></span> </label>
|
||||
</div>
|
||||
</div>
|
||||
<label class="entry__error entry__error--primary" style="font-size:16px; text-align:left; font-family:"Helvetica", sans-serif; color:#661d1d; background-color:#ffeded; border-radius:3px; border-color:#ff4949;">
|
||||
</label>
|
||||
<label class="entry__specification" style="font-size:12px; text-align:left; font-family:"Helvetica", sans-serif; color:#8390A4;">
|
||||
Vous pouvez vous désinscrire à tout moment en cliquant sur le lien présent dans nos emails.
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div style="padding: 8px 0;">
|
||||
<div class="sib-form__declaration">
|
||||
<div class="declaration-block-icon">
|
||||
<svg class="icon__SVG" width="0" height="0" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<defs>
|
||||
<symbol id="svgIcon-sphere" viewBox="0 0 63 63">
|
||||
<path class="path1" d="M31.54 0l1.05 3.06 3.385-.01-2.735 1.897 1.05 3.042-2.748-1.886-2.738 1.886 1.044-3.05-2.745-1.897h3.393zm13.97 3.019L46.555 6.4l3.384.01-2.743 2.101 1.048 3.387-2.752-2.1-2.752 2.1 1.054-3.382-2.745-2.105h3.385zm9.998 10.056l1.039 3.382h3.38l-2.751 2.1 1.05 3.382-2.744-2.091-2.743 2.091 1.054-3.381-2.754-2.1h3.385zM58.58 27.1l1.04 3.372h3.379l-2.752 2.096 1.05 3.387-2.744-2.091-2.75 2.092 1.054-3.387-2.747-2.097h3.376zm-3.076 14.02l1.044 3.364h3.385l-2.743 2.09 1.05 3.392-2.744-2.097-2.743 2.097 1.052-3.377-2.752-2.117 3.385-.01zm-9.985 9.91l1.045 3.364h3.393l-2.752 2.09 1.05 3.393-2.745-2.097-2.743 2.097 1.05-3.383-2.751-2.1 3.384-.01zM31.45 55.01l1.044 3.043 3.393-.008-2.752 1.9L34.19 63l-2.744-1.895-2.748 1.891 1.054-3.05-2.743-1.9h3.384zm-13.934-3.98l1.036 3.364h3.402l-2.752 2.09 1.053 3.393-2.747-2.097-2.752 2.097 1.053-3.382-2.743-2.1 3.384-.01zm-9.981-9.91l1.045 3.364h3.398l-2.748 2.09 1.05 3.392-2.753-2.1-2.752 2.096 1.053-3.382-2.743-2.102 3.384-.009zM4.466 27.1l1.038 3.372H8.88l-2.752 2.097 1.053 3.387-2.743-2.09-2.748 2.09 1.053-3.387L0 30.472h3.385zm3.069-14.025l1.045 3.382h3.395L9.23 18.56l1.05 3.381-2.752-2.09-2.752 2.09 1.053-3.381-2.744-2.1h3.384zm9.99-10.056L18.57 6.4l3.393.01-2.743 2.1 1.05 3.373-2.754-2.092-2.751 2.092 1.053-3.382-2.744-2.1h3.384zm24.938 19.394l-10-4.22a2.48 2.48 0 00-1.921 0l-10 4.22A2.529 2.529 0 0019 24.75c0 10.47 5.964 17.705 11.537 20.057a2.48 2.48 0 001.921 0C36.921 42.924 44 36.421 44 24.75a2.532 2.532 0 00-1.537-2.336zm-2.46 6.023l-9.583 9.705a.83.83 0 01-1.177 0l-5.416-5.485a.855.855 0 010-1.192l1.177-1.192a.83.83 0 011.177 0l3.65 3.697 7.819-7.916a.83.83 0 011.177 0l1.177 1.191a.843.843 0 010 1.192z"
|
||||
fill="#0092FF"></path>
|
||||
</symbol>
|
||||
</defs>
|
||||
</svg>
|
||||
<svg class="svgIcon-sphere" style="width:63px; height:63px;">
|
||||
<use xlink:href="#svgIcon-sphere"></use>
|
||||
</svg>
|
||||
</div>
|
||||
<p style="font-size:14px; text-align:left; font-family:"Helvetica", sans-serif; color:#687484; background-color:transparent;">
|
||||
Nous utilisons Sendinblue en tant que plateforme marketing. En soumettant ce formulaire, vous reconnaissez que les informations que vous allez fournir seront transmises à Sendinblue en sa qualité de processeur de données; et ce conformément à ses
|
||||
<a target="_blank" class="clickable_link" href="https://fr.sendinblue.com/legal/termsofuse/">conditions générales d'utilisation</a>.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div style="padding: 8px 0;">
|
||||
<div class="sib-form-block" style="text-align: left">
|
||||
<button class="sib-form-block__button sib-form-block__button-with-loader" style="font-size:16px; text-align:left; font-weight:700; font-family:"Helvetica", sans-serif; color:#FFFFFF; background-color:#3E4857; border-radius:3px; border-width:0px;"
|
||||
form="sib-form" type="submit">
|
||||
<svg class="icon clickable__icon progress-indicator__icon sib-hide-loader-icon" viewBox="0 0 512 512">
|
||||
<path d="M460.116 373.846l-20.823-12.022c-5.541-3.199-7.54-10.159-4.663-15.874 30.137-59.886 28.343-131.652-5.386-189.946-33.641-58.394-94.896-95.833-161.827-99.676C261.028 55.961 256 50.751 256 44.352V20.309c0-6.904 5.808-12.337 12.703-11.982 83.556 4.306 160.163 50.864 202.11 123.677 42.063 72.696 44.079 162.316 6.031 236.832-3.14 6.148-10.75 8.461-16.728 5.01z"
|
||||
/>
|
||||
</svg>
|
||||
Je m'inscris
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<input type="text" name="email_address_check" value="" class="input--hidden">
|
||||
<input type="hidden" name="locale" value="fr">
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- END - We recommend to place the below code where you want the form in your website html -->
|
||||
|
||||
<!-- START - We recommend to place the below code in footer or bottom of your website html -->
|
||||
<script>
|
||||
window.REQUIRED_CODE_ERROR_MESSAGE = 'Veuillez choisir un code pays';
|
||||
|
||||
window.EMAIL_INVALID_MESSAGE = window.SMS_INVALID_MESSAGE = "Les informations que vous avez fournies ne sont pas valides. Veuillez vérifier votre adresse email et réessayer.";
|
||||
|
||||
window.REQUIRED_ERROR_MESSAGE = "Ce champ est obligatoire pour vous inscrire. ";
|
||||
|
||||
window.GENERIC_INVALID_MESSAGE = "Les informations que vous avez fournies ne sont pas valides. Veuillez vérifier votre adresse email et réessayer.";
|
||||
|
||||
|
||||
|
||||
|
||||
window.translation = {
|
||||
common: {
|
||||
selectedList: '{quantity} liste sélectionnée',
|
||||
selectedLists: '{quantity} listes sélectionnées'
|
||||
}
|
||||
};
|
||||
|
||||
var AUTOHIDE = Boolean(0);
|
||||
</script>
|
||||
<script src="https://sibforms.com/forms/end-form/build/main.js"></script>
|
||||
|
||||
|
||||
<!-- END - We recommend to place the above code in footer or bottom of your website html -->
|
||||
<!-- End Sendinblue Form -->
|
||||
|
||||
{% endblock %}
|
||||
@@ -1,53 +0,0 @@
|
||||
{% extends "base.html" %}
|
||||
{% block title %}Mentions légales{% endblock %}
|
||||
{% block nav %}
|
||||
<p class="crumbs">
|
||||
<a href="{{ urls.instance() }}">accueil</a>
|
||||
</p>
|
||||
{{ super() }}
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
|
||||
<div style="max-width: 700px;margin:auto">
|
||||
|
||||
<h1 id="mentionslgales">Mentions légales</h1>
|
||||
|
||||
<p>Le site decp.info est édité par Colin Maudry, inscrit au répertoire SIRENE sous le numéro 812 231 132, dont le siège social est situé à Rennes, et dont l'adresse email est <a href="mailto:colin@maudry.com">colin@maudry.com</a>.</p>
|
||||
<p>Le site est hébergé en France par :</p>
|
||||
|
||||
<p>Scaleway par ONLINE, SAS, au capital de 214 410,50 Euros<br/>
|
||||
Siège social : 8 rue de la ville l'Evêque-75008 PARIS<br/>
|
||||
RCS Paris B 433 115 904, TVA FR35433115904<br/>
|
||||
<a href="https://www.scaleway.com" rel="nofollow">https://www.scaleway.com</a></p>
|
||||
|
||||
<p>Les icônes de la page d'accueil ont été dessinées par <a href="https://www.flaticon.com/authors/gregor-cresnar" title="Gregor Cresnar">Gregor Cresnar</a> de <a href="https://www.flaticon.com/" title="Flaticon">www.flaticon.com</a></p>
|
||||
|
||||
|
||||
<h1 id="vieprive">Vie privée</h1>
|
||||
|
||||
<h2>Les cookies</h2>
|
||||
|
||||
|
||||
<p>Ce site dépose un petit fichier texte (un « cookie ») sur votre ordinateur lorsque vous le consultez (<a href="https://fr.wikipedia.org/wiki/Cookie_(informatique)">Wikipédia</a>). Cela me permet de mesurer le nombre de visites et de distinguer les nouveaux visiteurs des utilisateurs réguliers.</p>
|
||||
|
||||
<div style="background-color: #ccc;"><iframe style="border: 0; height: 200px; width: 100%;" title="Opt-out du cookie de suivi" src="https://analytics.maudry.com/index.php?module=CoreAdminHome&action=optOut&language=fr&backgroundColor=&fontColor=&fontSize=&fontFamily="></iframe></div>
|
||||
|
||||
<h3 id="cesitenaffichepasdebanniredeconsentementauxcookiespourquoi">Ce site n’affiche pas de bannière de consentement aux cookies, pourquoi ?</h3>
|
||||
|
||||
<p>C’est vrai, vous n’avez pas eu à cliquer sur un bloc qui recouvre la moitié de la page pour dire que vous êtes d’accord avec le dépôt de cookies.</p>
|
||||
|
||||
<p>Rien d’exceptionnel, je respecte simplement la loi, qui dit que certains outils de suivi d’audience, correctement configurés pour respecter la vie privée, sont exemptés d’autorisation préalable.</p>
|
||||
|
||||
<p>J’utilise pour cela <a href="https://matomo.org/">Matomo</a>, un outil <a href="https://matomo.org/free-software/">libre</a>, paramétré pour être en conformité avec la <a href="https://www.cnil.fr/fr/solutions-pour-les-cookies-de-mesure-daudience">recommandation « Cookies »</a> de la <a href="http://sigl.es/cnil">CNIL</a>. Cela signifie que votre adresse IP, par exemple, est anonymisée avant d’être enregistrée. Il m’est donc impossible d’associer vos visites sur ce site à votre personne.</p>
|
||||
<h2>La lettre d'information et conformité RGPD</h2>
|
||||
|
||||
Ce site <a href="/inscription">vous propose</a> de vous inscrire à une lettre d'information. Pour ce faire, vous devez donner votre accord par deux fois : au moment de remplir le formulaire, et en cliquant sur un lien dans le mail de confirmation.
|
||||
|
||||
Tous les emails qui vous sont envoyés dans le cadre de cette lettre d'information comportent un lien de désinscription.
|
||||
|
||||
Votre adresse email est stockée en France chez Sendinblue, entreprise française.
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
{% endblock %}
|
||||
@@ -1,98 +0,0 @@
|
||||
{% extends "base.html" %}
|
||||
{% block title %}Notes de version{% endblock %}
|
||||
{% block nav %}
|
||||
<p class="crumbs">
|
||||
<a href="{{ urls.instance() }}">accueil</a>
|
||||
</p>
|
||||
{{ super() }}
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
|
||||
<div style="max-width: 700px;margin:auto" class="versions">
|
||||
<h1>Notes de version</h1>
|
||||
|
||||
|
||||
<h3 id="14114062021">1.4.1 (14/06/2021)</h3>
|
||||
|
||||
<ul>
|
||||
<li>ajout des traductions des opérations de filtrage à toutes les vues, pas seulement /db/decp</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="14014062021">1.4.0 (14/06/2021)</h3>
|
||||
|
||||
<ul>
|
||||
<li>traduction des opérations de filtrage (ex : contains => contient)</li>
|
||||
|
||||
<li>élargissement des menus de filtrage</li>
|
||||
|
||||
<li>correction du titre de la page des notes de versions</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="13003062021">1.3.0 (03/06/2021)</h3>
|
||||
|
||||
<ul>
|
||||
<li>utilisation de noms de colonnes plus lisibles dans l'application</li>
|
||||
|
||||
<li>suppression des références à la licence et aux données source sur la page d'accueil</li>
|
||||
|
||||
<li>correction des liens vers le code source</li>
|
||||
|
||||
<li>correction de l'indentation des puces dans les notes de version</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<h3 id="12028052021">1.2.0 (28/05/2021)</h3>
|
||||
|
||||
<ul>
|
||||
<li>ajout d'une page "Notes de version"</li>
|
||||
|
||||
<li>meilleur lien pour la documentation des champs</li>
|
||||
|
||||
<li>déplacement du code de decp.info depuis <a href="https://github.com/ColinMaudry/decp-table-schema-utils">ColinMaudry/decp-table-schema-utils</a> vers <a href="https://github.com/ColinMaudry/decp.info">ColinMaudry/decp.info</a></li>
|
||||
</ul>
|
||||
|
||||
<h3 id="11025052021">1.1.0 (25/05/2021)</h3>
|
||||
|
||||
<ul>
|
||||
<li>ajout de nouvelles vues :
|
||||
|
||||
|
||||
<ul>
|
||||
<li>Marchés publics sans leurs titulaires : vue dédiée aux titulaires de marchés avec des données provenant du répertoire SIRENE</li>
|
||||
|
||||
<li>Données sur les titulaires et géolocalisation : vue sans les titulaires pour analyser les nombres de marchés et les montants</li></ul>
|
||||
</li>
|
||||
|
||||
<li>amélioration de la page d'accueil</li>
|
||||
|
||||
<li>développement de la page "db" avec description des vues et liste des colonnes</li>
|
||||
|
||||
<li>les codes APE sont cliquables</li>
|
||||
|
||||
<li>ajout des mentions légales</li>
|
||||
|
||||
<li>ajout d'un formulatire d'inscription à une lettre d'information</li>
|
||||
|
||||
<li>correction de bugs :
|
||||
|
||||
|
||||
<ul>
|
||||
<li>correction du format de certaines dates dans les données</li></ul>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="100">1.0.0</h3>
|
||||
|
||||
<ul>
|
||||
<li>publication sur https://decp.info</li>
|
||||
|
||||
<li>ajout d'une vue équivalente au format DECP réglementaire</li>
|
||||
|
||||
<li>personnalisation de datasette</li>
|
||||
|
||||
<li>script de conversion quotidien basé sur <a href="https://github.com/datahq/dataflows">dataflows</a></li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
@@ -1,495 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Datasette: Pattern Portfolio</title>
|
||||
<link rel="stylesheet" href="{{ base_url }}-/static/app.css?{{ app_css_hash }}">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
<meta name="robots" content="noindex">
|
||||
<style></style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<header><nav>
|
||||
<p class="crumbs">
|
||||
<a href="/">home</a>
|
||||
</p>
|
||||
<details class="nav-menu">
|
||||
<summary><svg aria-labelledby="nav-menu-svg-title" role="img"
|
||||
fill="currentColor" stroke="currentColor" xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 16 16" width="16" height="16">
|
||||
<title id="nav-menu-svg-title">Menu</title>
|
||||
<path fill-rule="evenodd" d="M1 2.75A.75.75 0 011.75 2h12.5a.75.75 0 110 1.5H1.75A.75.75 0 011 2.75zm0 5A.75.75 0 011.75 7h12.5a.75.75 0 110 1.5H1.75A.75.75 0 011 7.75zM1.75 12a.75.75 0 100 1.5h12.5a.75.75 0 100-1.5H1.75z"></path>
|
||||
</svg></summary>
|
||||
<div class="nav-menu-inner">
|
||||
<ul>
|
||||
<li><a href="/-/databases">Databases</a></li>
|
||||
<li><a href="/-/plugins">Installed plugins</a></li>
|
||||
<li><a href="/-/versions">Version info</a></li>
|
||||
</ul>
|
||||
<form action="/-/logout" method="post">
|
||||
<button class="button-as-link">Log out</button>
|
||||
</form>
|
||||
</div>
|
||||
</details>
|
||||
<div class="actor">
|
||||
<strong>root</strong>
|
||||
</div>
|
||||
</nav></header>
|
||||
|
||||
<section class="content">
|
||||
<h1>Pattern Portfolio</h1>
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
|
||||
<h2 class="pattern-heading">Header for /database/table/row and Messages</h2>
|
||||
|
||||
<header>
|
||||
<nav>
|
||||
<p class="crumbs">
|
||||
<a href="/">home</a> /
|
||||
<a href="/fixtures">fixtures</a> /
|
||||
<a href="/fixtures/attraction_characteristic">attraction_characteristic</a>
|
||||
</p>
|
||||
<div class="actor">
|
||||
<strong>testuser</strong>
|
||||
</div>
|
||||
</nav>
|
||||
</header>
|
||||
|
||||
<p class="message-info">Example message</p>
|
||||
<p class="message-warning">Example message</p>
|
||||
<p class="message-error">Example message</p>
|
||||
|
||||
<h2 class="pattern-heading">.bd for /</h2>
|
||||
<section class="content">
|
||||
<h1>Datasette Fixtures</h1>
|
||||
<div class="metadata-description">
|
||||
An example SQLite database demonstrating Datasette
|
||||
</div>
|
||||
<p>
|
||||
Data license:
|
||||
<a href="https://github.com/simonw/datasette/blob/main/LICENSE">Apache License 2.0</a>
|
||||
·
|
||||
Data source:
|
||||
<a href="https://github.com/simonw/datasette/blob/main/tests/fixtures.py">
|
||||
tests/fixtures.py</a>
|
||||
·
|
||||
About:
|
||||
<a href="https://github.com/simonw/datasette">
|
||||
About Datasette</a>
|
||||
</p>
|
||||
<h2 style="padding-left: 10px; border-left: 10px solid #9403e5"><a href="/fixtures">fixtures</a></h2>
|
||||
<p>
|
||||
1,258 rows in 24 tables, 206 rows in 5 hidden tables, 4 views
|
||||
</p>
|
||||
<p><a href="/fixtures/compound_three_primary_keys" title="1001 rows">compound_three_primary_keys</a>, <a href="/fixtures/sortable" title="201 rows">sortable</a>, <a href="/fixtures/facetable" title="15 rows">facetable</a>, <a href="/fixtures/roadside_attraction_characteristics" title="5 rows">roadside_attraction_characteristics</a>, <a href="/fixtures/simple_primary_key" title="4 rows">simple_primary_key</a>, <a href="/fixtures">...</a></p>
|
||||
<h2 style="padding-left: 10px; border-left: 10px solid #8d777f"><a href="/data">data</a></h2>
|
||||
<p>
|
||||
6 rows in 2 tables
|
||||
</p>
|
||||
<p><a href="/data/names" title="6 rows">names</a>, <a href="/data/foo">foo</a></p>
|
||||
</section>
|
||||
|
||||
<h2 class="pattern-heading">.bd for /database</h2>
|
||||
<section class="content">
|
||||
<div class="page-header" style="border-color: #ff0000">
|
||||
<h1>fixtures</h1>
|
||||
<details class="actions-menu-links">
|
||||
<summary><svg aria-labelledby="actions-menu-links-title" role="img"
|
||||
style="color: #666" xmlns="http://www.w3.org/2000/svg"
|
||||
width="28" height="28" viewBox="0 0 24 24" fill="none"
|
||||
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||
<title id="actions-menu-links-title">Table actions</title>
|
||||
<circle cx="12" cy="12" r="3"></circle>
|
||||
<path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"></path>
|
||||
</svg></summary>
|
||||
<div class="dropdown-menu">
|
||||
<ul>
|
||||
<li><a href="#">Database action</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</details>
|
||||
</div>
|
||||
|
||||
<div class="metadata-description">
|
||||
Test tables description
|
||||
</div>
|
||||
<p>
|
||||
Data license:
|
||||
<a href="https://github.com/simonw/datasette/blob/main/LICENSE">Apache License 2.0</a>
|
||||
·
|
||||
Data source:
|
||||
<a href="https://github.com/simonw/datasette/blob/main/tests/fixtures.py">
|
||||
tests/fixtures.py</a>
|
||||
·
|
||||
About:
|
||||
<a href="https://github.com/simonw/datasette">
|
||||
About Datasette</a>
|
||||
</p>
|
||||
<form class="sql" action="/fixtures" method="get">
|
||||
<h3>Custom SQL query</h3>
|
||||
<p><textarea id="sql-editor" name="sql">select * from [123_starts_with_digits]</textarea></p>
|
||||
<p>
|
||||
<button id="sql-format" type="button" hidden>Format SQL</button>
|
||||
<input type="submit" value="Run SQL">
|
||||
</p>
|
||||
</form>
|
||||
<div class="db-table">
|
||||
<h2><a href="/fixtures/123_starts_with_digits">123_starts_with_digits</a></h2>
|
||||
<p><em>content</em></p>
|
||||
<p>0 rows</p>
|
||||
</div>
|
||||
<div class="db-table">
|
||||
<h2><a href="/fixtures/Table+With+Space+In+Name">Table With Space In Name</a></h2>
|
||||
<p><em>pk, content</em></p>
|
||||
<p>0 rows</p>
|
||||
</div>
|
||||
<div class="db-table">
|
||||
<h2><a href="/fixtures/attraction_characteristic">attraction_characteristic</a></h2>
|
||||
<p><em>pk, name</em></p>
|
||||
<p>2 rows</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<h2 class="pattern-heading">.bd for /database/table</h2>
|
||||
|
||||
<section class="content">
|
||||
<div class="page-header" style="border-color: #ff0000">
|
||||
<h1>roadside_attraction_characteristics</h1>
|
||||
<details class="actions-menu-links">
|
||||
<summary><svg aria-labelledby="actions-menu-links-title" role="img"
|
||||
style="color: #666" xmlns="http://www.w3.org/2000/svg"
|
||||
width="28" height="28" viewBox="0 0 24 24" fill="none"
|
||||
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||
<title id="actions-menu-links-title">Table actions</title>
|
||||
<circle cx="12" cy="12" r="3"></circle>
|
||||
<path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"></path>
|
||||
</svg></summary>
|
||||
<div class="dropdown-menu">
|
||||
<ul>
|
||||
<li><a href="#">Table action</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</details>
|
||||
</div>
|
||||
|
||||
<p>
|
||||
Data license:
|
||||
<a href="https://github.com/simonw/datasette/blob/main/LICENSE">Apache License 2.0</a>
|
||||
·
|
||||
Data source:
|
||||
<a href="https://github.com/simonw/datasette/blob/main/tests/fixtures.py">
|
||||
tests/fixtures.py</a>
|
||||
·
|
||||
About:
|
||||
<a href="https://github.com/simonw/datasette">
|
||||
About Datasette</a>
|
||||
</p>
|
||||
<h3>3 rows
|
||||
where characteristic_id = 2
|
||||
</h3>
|
||||
<form class="filters" action="/fixtures/roadside_attraction_characteristics" method="get">
|
||||
<div class="search-row"><label for="_search">Search:</label><input id="_search" type="search" name="_search" value=""></div>
|
||||
<div class="filter-row">
|
||||
<div class="select-wrapper">
|
||||
<select name="_filter_column_1">
|
||||
<option value="">- remove filter -</option>
|
||||
<option>rowid</option>
|
||||
<option>attraction_id</option>
|
||||
<option selected>characteristic_id</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="select-wrapper filter-op">
|
||||
<select name="_filter_op_1">
|
||||
<option value="exact" selected>=</option>
|
||||
<option value="not">!=</option>
|
||||
<option value="contains">contains</option>
|
||||
<option value="endswith">ends with</option>
|
||||
<option value="startswith">starts with</option>
|
||||
<option value="gt">></option>
|
||||
<option value="gte">≥</option>
|
||||
<option value="lt"><</option>
|
||||
<option value="lte">≤</option>
|
||||
<option value="like">like</option>
|
||||
<option value="notlike">not like</option>
|
||||
<option value="glob">glob</option>
|
||||
<option value="in">in</option>
|
||||
<option value="notin">not in</option>
|
||||
<option value="arraycontains">array contains</option>
|
||||
<option value="date">date</option>
|
||||
<option value="isnull__1">is null</option>
|
||||
<option value="notnull__1">is not null</option>
|
||||
<option value="isblank__1">is blank</option>
|
||||
<option value="notblank__1">is not blank</option>
|
||||
</select>
|
||||
</div><input type="text" name="_filter_value_1" class="filter-value" value="2">
|
||||
</div>
|
||||
<div class="filter-row">
|
||||
<div class="select-wrapper">
|
||||
<select name="_filter_column">
|
||||
<option value="">- column -</option>
|
||||
<option>rowid</option>
|
||||
<option>attraction_id</option>
|
||||
<option>characteristic_id</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="select-wrapper filter-op">
|
||||
<select name="_filter_op">
|
||||
<option value="exact">=</option>
|
||||
<option value="not">!=</option>
|
||||
<option value="contains">contains</option>
|
||||
<option value="endswith">ends with</option>
|
||||
<option value="startswith">starts with</option>
|
||||
<option value="gt">></option>
|
||||
<option value="gte">≥</option>
|
||||
<option value="lt"><</option>
|
||||
<option value="lte">≤</option>
|
||||
<option value="like">like</option>
|
||||
<option value="notlike">not like</option>
|
||||
<option value="glob">glob</option>
|
||||
<option value="in">in</option>
|
||||
<option value="notin">not in</option>
|
||||
<option value="arraycontains">array contains</option>
|
||||
<option value="date">date</option>
|
||||
<option value="isnull__1">is null</option>
|
||||
<option value="notnull__1">is not null</option>
|
||||
<option value="isblank__1">is blank</option>
|
||||
<option value="notblank__1">is not blank</option>
|
||||
</select>
|
||||
</div><input type="text" name="_filter_value" class="filter-value">
|
||||
</div>
|
||||
<div class="filter-row">
|
||||
<div class="select-wrapper small-screen-only">
|
||||
<select name="_sort" id="sort_by">
|
||||
<option value="">Sort...</option>
|
||||
<option value="rowid" selected>Sort by rowid</option>
|
||||
<option value="attraction_id">Sort by attraction_id</option>
|
||||
<option value="characteristic_id">Sort by characteristic_id</option>
|
||||
</select>
|
||||
</div>
|
||||
<label class="sort_by_desc small-screen-only"><input type="checkbox" name="_sort_by_desc"> descending</label>
|
||||
<input type="submit" value="Apply">
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<div class="extra-wheres">
|
||||
<h3>2 extra where clauses</h3>
|
||||
<ul>
|
||||
|
||||
<li><code>planet_int=1</code> [<a href="/fixtures/facetable?_where=state%3D%27CA%27">remove</a>]</li>
|
||||
|
||||
<li><code>state='CA'</code> [<a href="/fixtures/facetable?_where=planet_int%3D1">remove</a>]</li>
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<p><a class="not-underlined" title="select rowid, attraction_id, characteristic_id from roadside_attraction_characteristics where "characteristic_id" = :p0 order by rowid limit 101" href="/fixtures?sql=select+rowid%2C+attraction_id%2C+characteristic_id+from+roadside_attraction_characteristics+where+%22characteristic_id%22+%3D+%3Ap0+order+by+rowid+limit+101&p0=2">✎ <span class="underlined">View and edit SQL</span></a></p>
|
||||
|
||||
<p class="export-links">This data as <a href="/fixtures/roadside_attraction_characteristics.json?characteristic_id=2&_labels=on">json</a>, <a href="/fixtures/roadside_attraction_characteristics.csv?characteristic_id=2&_labels=on&_size=max">CSV</a> (<a href="#export">advanced</a>)</p>
|
||||
|
||||
<p class="suggested-facets">
|
||||
Suggested facets: <a href="http://latest.datasette.io/fixtures/facetable?_where=planet_int%3D1&_where=state%3D%27CA%27&_facet=city_id&_facet=created&_facet=complex_array&_facet=tags#facet-tags">tags</a>, <a href="http://latest.datasette.io/fixtures/facetable?_where=planet_int%3D1&_where=state%3D%27CA%27&_facet=city_id&_facet=created&_facet=complex_array&_facet_date=created#facet-created">created</a> (date), <a href="http://latest.datasette.io/fixtures/facetable?_where=planet_int%3D1&_where=state%3D%27CA%27&_facet=city_id&_facet=created&_facet=complex_array&_facet_array=tags#facet-tags">tags</a> (array)
|
||||
</p>
|
||||
|
||||
<div class="facet-results">
|
||||
|
||||
<div class="facet-info facet-fixtures-facetable-tags" id="facet-tags">
|
||||
<p class="facet-info-name">
|
||||
<strong>tags (array)</strong>
|
||||
|
||||
<a href="/fixtures/facetable?_where=planet_int%3D1&_where=state%3D%27CA%27&_facet=city_id&_facet=created" class="cross">✖</a>
|
||||
|
||||
</p>
|
||||
<ul>
|
||||
|
||||
|
||||
<li><a href="http://latest.datasette.io/fixtures/facetable?_where=planet_int%3D1&_where=state%3D%27CA%27&_facet=city_id&_facet=created&_facet_array=tags&tags__arraycontains=tag1">tag1</a> 2</li>
|
||||
|
||||
|
||||
|
||||
<li><a href="http://latest.datasette.io/fixtures/facetable?_where=planet_int%3D1&_where=state%3D%27CA%27&_facet=city_id&_facet=created&_facet_array=tags&tags__arraycontains=tag2">tag2</a> 1</li>
|
||||
|
||||
|
||||
|
||||
<li><a href="http://latest.datasette.io/fixtures/facetable?_where=planet_int%3D1&_where=state%3D%27CA%27&_facet=city_id&_facet=created&_facet_array=tags&tags__arraycontains=tag3">tag3</a> 1</li>
|
||||
|
||||
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="facet-info facet-fixtures-facetable-created" id="facet-created">
|
||||
<p class="facet-info-name">
|
||||
<strong>created</strong>
|
||||
|
||||
<a href="/fixtures/facetable?_where=planet_int%3D1&_where=state%3D%27CA%27&_facet=city_id&_facet_array=tags" class="cross">✖</a>
|
||||
|
||||
</p>
|
||||
<ul>
|
||||
|
||||
|
||||
<li><a href="http://latest.datasette.io/fixtures/facetable?_where=planet_int%3D1&_where=state%3D%27CA%27&_facet=city_id&_facet=created&_facet_array=tags&created=2019-01-14+08%3A00%3A00">2019-01-14 08:00:00</a> 4</li>
|
||||
|
||||
|
||||
|
||||
<li><a href="http://latest.datasette.io/fixtures/facetable?_where=planet_int%3D1&_where=state%3D%27CA%27&_facet=city_id&_facet=created&_facet_array=tags&created=2019-01-15+08%3A00%3A00">2019-01-15 08:00:00</a> 4</li>
|
||||
|
||||
|
||||
|
||||
<li><a href="http://latest.datasette.io/fixtures/facetable?_where=planet_int%3D1&_where=state%3D%27CA%27&_facet=city_id&_facet=created&_facet_array=tags&created=2019-01-16+08%3A00%3A00">2019-01-16 08:00:00</a> 2</li>
|
||||
|
||||
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="facet-info facet-fixtures-facetable-city_id" id="facet-city_id">
|
||||
<p class="facet-info-name">
|
||||
<strong>city_id</strong>
|
||||
|
||||
<a href="/fixtures/facetable?_where=planet_int%3D1&_where=state%3D%27CA%27&_facet=created&_facet_array=tags" class="cross">✖</a>
|
||||
|
||||
</p>
|
||||
<ul>
|
||||
|
||||
|
||||
<li><a href="http://latest.datasette.io/fixtures/facetable?_where=planet_int%3D1&_where=state%3D%27CA%27&_facet=city_id&_facet=created&_facet_array=tags&city_id=1">San Francisco</a> 6</li>
|
||||
|
||||
|
||||
|
||||
<li><a href="http://latest.datasette.io/fixtures/facetable?_where=planet_int%3D1&_where=state%3D%27CA%27&_facet=city_id&_facet=created&_facet_array=tags&city_id=2">Los Angeles</a> 4</li>
|
||||
|
||||
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<table class="rows-and-columns">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="col-Link" scope="col">
|
||||
Link
|
||||
</th>
|
||||
<th class="col-rowid" scope="col">
|
||||
<a href="/fixtures/roadside_attraction_characteristics?characteristic_id=2&_sort_desc=rowid" rel="nofollow">rowid ▼</a>
|
||||
</th>
|
||||
<th class="col-attraction_id" scope="col">
|
||||
<a href="/fixtures/roadside_attraction_characteristics?characteristic_id=2&_sort=attraction_id" rel="nofollow">attraction_id</a>
|
||||
</th>
|
||||
<th class="col-characteristic_id" scope="col">
|
||||
<a href="/fixtures/roadside_attraction_characteristics?characteristic_id=2&_sort=characteristic_id" rel="nofollow">characteristic_id</a>
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="col-Link"><a href="/fixtures/roadside_attraction_characteristics/1">1</a></td>
|
||||
<td class="col-rowid">1</td>
|
||||
<td class="col-attraction_id"><a href="/fixtures/roadside_attractions/1">The Mystery Spot</a> <em>1</em></td>
|
||||
<td class="col-characteristic_id"><a href="/fixtures/attraction_characteristic/2">Paranormal</a> <em>2</em></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="col-Link"><a href="/fixtures/roadside_attraction_characteristics/2">2</a></td>
|
||||
<td class="col-rowid">2</td>
|
||||
<td class="col-attraction_id"><a href="/fixtures/roadside_attractions/2">Winchester Mystery House</a> <em>2</em></td>
|
||||
<td class="col-characteristic_id"><a href="/fixtures/attraction_characteristic/2">Paranormal</a> <em>2</em></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="col-Link"><a href="/fixtures/roadside_attraction_characteristics/3">3</a></td>
|
||||
<td class="col-rowid">3</td>
|
||||
<td class="col-attraction_id"><a href="/fixtures/roadside_attractions/4">Bigfoot Discovery Museum</a> <em>4</em></td>
|
||||
<td class="col-characteristic_id"><a href="/fixtures/attraction_characteristic/2">Paranormal</a> <em>2</em></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<div id="export" class="advanced-export">
|
||||
<h3>Advanced export</h3>
|
||||
<p>JSON shape:
|
||||
<a href="/fixtures/roadside_attraction_characteristics.json?characteristic_id=2&_labels=on">default</a>,
|
||||
<a href="/fixtures/roadside_attraction_characteristics.json?characteristic_id=2&_labels=on&_shape=array">array</a>,
|
||||
<a href="/fixtures/roadside_attraction_characteristics.json?characteristic_id=2&_labels=on&_shape=array&_nl=on">newline-delimited</a>
|
||||
</p>
|
||||
<form action="/fixtures/roadside_attraction_characteristics.csv" method="get">
|
||||
<p>
|
||||
CSV options:
|
||||
<label><input type="checkbox" name="_dl"> download file</label>
|
||||
<label><input type="checkbox" name="_labels" checked> expand labels</label>
|
||||
<input type="submit" value="Export CSV">
|
||||
<input type="hidden" name="characteristic_id" value="2">
|
||||
<input type="hidden" name="_size" value="max">
|
||||
</p>
|
||||
</form>
|
||||
</div>
|
||||
<pre class="wrapped-sql">CREATE TABLE roadside_attraction_characteristics (
|
||||
attraction_id INTEGER REFERENCES roadside_attractions(pk),
|
||||
characteristic_id INTEGER REFERENCES attraction_characteristic(pk)
|
||||
);</pre>
|
||||
</section>
|
||||
|
||||
<h2 class="pattern-heading">.bd for /database/table/row</h2>
|
||||
<section class="content">
|
||||
<h1 style="padding-left: 10px; border-left: 10px solid #ff0000">roadside_attractions: 2</h1>
|
||||
<p>This data as <a href="/fixtures/roadside_attractions/2.json">json</a></p>
|
||||
<table class="rows-and-columns">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="col-pk" scope="col">
|
||||
pk
|
||||
</th>
|
||||
<th class="col-name" scope="col">
|
||||
name
|
||||
</th>
|
||||
<th class="col-address" scope="col">
|
||||
address
|
||||
</th>
|
||||
<th class="col-latitude" scope="col">
|
||||
latitude
|
||||
</th>
|
||||
<th class="col-longitude" scope="col">
|
||||
longitude
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="col-pk">2</td>
|
||||
<td class="col-name">Winchester Mystery House</td>
|
||||
<td class="col-address">525 South Winchester Boulevard, San Jose, CA 95128</td>
|
||||
<td class="col-latitude">37.3184</td>
|
||||
<td class="col-longitude">-121.9511</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h2>Links from other tables</h2>
|
||||
<ul>
|
||||
<li>
|
||||
<a href="/fixtures/roadside_attraction_characteristics?attraction_id=2">
|
||||
1 row</a>
|
||||
from attraction_id in roadside_attraction_characteristics
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<h2 class="pattern-heading">.ft</h2>
|
||||
|
||||
<footer class="ft">Powered by <a href="https://datasette.io/" title="Datasette v0+unknown">Datasette</a>
|
||||
· Data license:
|
||||
<a href="https://github.com/simonw/datasette/blob/main/LICENSE">Apache License 2.0</a>
|
||||
·
|
||||
Data source:
|
||||
<a href="https://github.com/simonw/datasette/blob/main/tests/fixtures.py">
|
||||
tests/fixtures.py</a>
|
||||
·
|
||||
About:
|
||||
<a href="https://github.com/simonw/datasette">
|
||||
About Datasette</a>
|
||||
</footer>
|
||||
|
||||
{% include "_close_open_menus.html" %}
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,55 +0,0 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}Debug permissions{% endblock %}
|
||||
|
||||
{% block extra_head %}
|
||||
<style type="text/css">
|
||||
.check-result-true {
|
||||
color: green;
|
||||
}
|
||||
.check-result-false {
|
||||
color: red;
|
||||
}
|
||||
.check h2 {
|
||||
font-size: 1em
|
||||
}
|
||||
.check-action, .check-when, .check-result {
|
||||
font-size: 1.3em;
|
||||
}
|
||||
</style>
|
||||
{% endblock %}
|
||||
|
||||
{% block nav %}
|
||||
<p class="crumbs">
|
||||
<a href="{{ base_url }}">home</a>
|
||||
</p>
|
||||
{{ super() }}
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<h1>Recent permissions checks</h1>
|
||||
|
||||
{% for check in permission_checks %}
|
||||
<div class="check">
|
||||
<h2>
|
||||
<span class="check-action">{{ check.action }}</span>
|
||||
checked at
|
||||
<span class="check-when">{{ check.when }}</span>
|
||||
{% if check.result %}
|
||||
<span class="check-result check-result-true">✓</span>
|
||||
{% else %}
|
||||
<span class="check-result check-result-false">✗</span>
|
||||
{% endif %}
|
||||
{% if check.used_default %}
|
||||
<span class="check-used-default">(used default)</span>
|
||||
{% endif %}
|
||||
</h2>
|
||||
<p><strong>Actor:</strong> {{ check.actor|tojson }}</p>
|
||||
{% if check.resource %}
|
||||
<p><strong>Resource:</strong> {{ check.resource }}</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endfor %}
|
||||
|
||||
{% endblock %}
|
||||
@@ -1,87 +0,0 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}{{ database }}{% if query and query.sql %}: {{ query.sql }}{% endif %}{% endblock %}
|
||||
|
||||
{% block extra_head %}
|
||||
{{ super() }}
|
||||
{% if columns %}
|
||||
<style>
|
||||
@media only screen and (max-width: 576px) {
|
||||
{% for column in columns %}
|
||||
.rows-and-columns td:nth-of-type({{ loop.index }}):before { content: "{{ column|escape_css_string }}"; }
|
||||
{% endfor %}
|
||||
}
|
||||
</style>
|
||||
{% endif %}
|
||||
{% include "_codemirror.html" %}
|
||||
{% endblock %}
|
||||
|
||||
{% block body_class %}query db-{{ database|to_css_class }}{% if canned_query %} query-{{ canned_query|to_css_class }}{% endif %}{% endblock %}
|
||||
|
||||
{% block nav %}
|
||||
<p class="crumbs">
|
||||
<a href="{{ urls.instance() }}">home</a> /
|
||||
<a href="{{ urls.database(database) }}">{{ database }}</a>
|
||||
</p>
|
||||
{{ super() }}
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<h1 style="padding-left: 10px; border-left: 10px solid #{{ database_color(database) }}">{{ metadata.title or database }}{% if canned_query and not metadata.title %}: {{ canned_query }}{% endif %}{% if private %} 🔒{% endif %}</h1>
|
||||
|
||||
{% block description_source_license %}{% include "_description_source_license.html" %}{% endblock %}
|
||||
|
||||
<form class="sql" action="{{ urls.database(database) }}{% if canned_query %}/{{ canned_query }}{% endif %}" method="{% if canned_write %}post{% else %}get{% endif %}">
|
||||
<h3>Custom SQL query{% if display_rows %} returning {% if truncated %}more than {% endif %}{{ "{:,}".format(display_rows|length) }} row{% if display_rows|length == 1 %}{% else %}s{% endif %}{% endif %} <span class="show-hide-sql">{% if hide_sql %}(<a href="{{ path_with_removed_args(request, {'_hide_sql': '1'}) }}">show</a>){% else %}(<a href="{{ path_with_added_args(request, {'_hide_sql': '1'}) }}">hide</a>){% endif %}</span></h3>
|
||||
{% if not hide_sql %}
|
||||
{% if editable and allow_execute_sql %}
|
||||
<p><textarea id="sql-editor" name="sql">{% if query and query.sql %}{{ query.sql }}{% else %}select * from {{ tables[0].name|escape_sqlite }}{% endif %}</textarea></p>
|
||||
{% else %}
|
||||
<pre id="sql-query">{% if query %}{{ query.sql }}{% endif %}</pre>
|
||||
{% endif %}
|
||||
{% else %}
|
||||
<input type="hidden" name="sql" value="{% if query and query.sql %}{{ query.sql }}{% else %}select * from {{ tables[0].name|escape_sqlite }}{% endif %}">
|
||||
<input type="hidden" name="_hide_sql" value="1">
|
||||
{% endif %}
|
||||
{% if named_parameter_values %}
|
||||
<h3>Query parameters</h3>
|
||||
{% for name, value in named_parameter_values.items() %}
|
||||
<p><label for="qp{{ loop.index }}">{{ name }}</label> <input type="text" id="qp{{ loop.index }}" name="{{ name }}" value="{{ value }}"></p>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
<p>
|
||||
<button id="sql-format" type="button" hidden>Format SQL</button>
|
||||
{% if canned_write %}<input type="hidden" name="csrftoken" value="{{ csrftoken() }}">{% endif %}
|
||||
<input type="submit" value="Run SQL">
|
||||
{% if canned_query and edit_sql_url %}<a href="{{ edit_sql_url }}" class="canned-query-edit-sql">Edit SQL</a>{% endif %}
|
||||
</p>
|
||||
</form>
|
||||
|
||||
{% if display_rows %}
|
||||
<p class="export-links">This data as {% for name, url in renderers.items() %}<a href="{{ url }}">{{ name }}</a>{{ ", " if not loop.last }}{% endfor %}, <a href="{{ url_csv }}">CSV</a></p>
|
||||
<div class="table-wrapper"><table class="rows-and-columns">
|
||||
<thead>
|
||||
<tr>
|
||||
{% for column in columns %}<th class="col-{{ column|to_css_class }}" scope="col">{{ column }}</th>{% endfor %}
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for row in display_rows %}
|
||||
<tr>
|
||||
{% for column, td in zip(columns, row) %}
|
||||
<td class="col-{{ column|to_css_class }}">{{ td }}</td>
|
||||
{% endfor %}
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table></div>
|
||||
{% else %}
|
||||
{% if not canned_write %}
|
||||
<p class="zero-results">0 results</p>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
||||
{% include "_codemirror_foot.html" %}
|
||||
|
||||
{% endblock %}
|
||||
@@ -1,49 +0,0 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}{{ database }}: {{ table }}{% endblock %}
|
||||
|
||||
{% block extra_head %}
|
||||
{{ super() }}
|
||||
<style>
|
||||
@media only screen and (max-width: 576px) {
|
||||
{% for column in columns %}
|
||||
.rows-and-columns td:nth-of-type({{ loop.index }}):before { content: "{{ column|escape_css_string }}"; }
|
||||
{% endfor %}
|
||||
}
|
||||
</style>
|
||||
{% endblock %}
|
||||
|
||||
{% block body_class %}row db-{{ database|to_css_class }} table-{{ table|to_css_class }}{% endblock %}
|
||||
|
||||
{% block nav %}
|
||||
<p class="crumbs">
|
||||
<a href="{{ urls.instance() }}">accueil</a> /
|
||||
<a href="{{ urls.database(database) }}">{{ database }}</a> /
|
||||
<a href="{{ urls.table(database, table) }}">{{ table }}</a>
|
||||
</p>
|
||||
{{ super() }}
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<h1 style="padding-left: 10px; border-left: 10px solid #{{ database_color(database) }}">{{ table }}: {{ ', '.join(primary_key_values) }}</h1>
|
||||
|
||||
{% block description_source_license %}{% include "_description_source_license.html" %}{% endblock %}
|
||||
|
||||
<p>Télcharger ces données au format {% for name, url in renderers.items() %}<a href="{{ url }}">{{ name }}</a>{{ ", " if not loop.last }}{% endfor %}</p>
|
||||
|
||||
{% include custom_table_templates %}
|
||||
|
||||
{% if foreign_key_tables %}
|
||||
<h2>Liens depuis d'autres tables</h2>
|
||||
<ul>
|
||||
{% for other in foreign_key_tables %}
|
||||
<li>
|
||||
<a href="{{ urls.table(database, other.other_table) }}?{{ other.other_column }}={{ ', '.join(primary_key_values) }}">
|
||||
{{ "{:,}".format(other.count) }} row{% if other.count == 1 %}{% else %}s{% endif %}</a>
|
||||
from {{ other.other_column }} in {{ other.other_table }}
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endif %}
|
||||
|
||||
{% endblock %}
|
||||
@@ -1,19 +0,0 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}{{ filename }}{% endblock %}
|
||||
|
||||
{% block body_class %}show-json{% endblock %}
|
||||
|
||||
{% block nav %}
|
||||
<p class="crumbs">
|
||||
<a href="{{ urls.instance() }}">home</a>
|
||||
</p>
|
||||
{{ super() }}
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<h1>{{ filename }}</h1>
|
||||
|
||||
<pre>{{ data_json }}</pre>
|
||||
|
||||
{% endblock %}
|
||||
@@ -1,221 +0,0 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}{{ database }}: {{ table }}: {% if filtered_table_rows_count or filtered_table_rows_count == 0 %}{{ "{:,}".format(filtered_table_rows_count) }} ligne{% if filtered_table_rows_count == 1 %}{% else %}s{% endif %}{% endif %}
|
||||
{% if human_description_en %}où {{ human_description_en }}{% endif %}{% endblock %}
|
||||
|
||||
{% block extra_head %}
|
||||
{{ super() }}
|
||||
<script src="{{ urls.static('table.js') }}" defer></script>
|
||||
<style>
|
||||
@media only screen and (max-width: 576px) {
|
||||
{% for column in display_columns -%}
|
||||
.rows-and-columns td:nth-of-type({{ loop.index }}):before { content: "{{ column.name|escape_css_string }}"; }
|
||||
{% endfor %}}
|
||||
</style>
|
||||
{% endblock %}
|
||||
|
||||
|
||||
{% block body_class %}table db-{{ database|to_css_class }} table-{{ table|to_css_class }}{% endblock %}
|
||||
|
||||
{% block nav %}
|
||||
<p class="crumbs">
|
||||
<a href="{{ urls.instance() }}">accueil</a> /
|
||||
<a href="{{ urls.database(database) }}">{{ database }}</a>
|
||||
</p>
|
||||
{{ super() }}
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="page-header" style="border-color: #{{ database_color(database) }}">
|
||||
<h1>{{ metadata.title or table }}{% if is_view %} (view){% endif %}{% if private %} 🔒{% endif %}</h1>
|
||||
{% set links = table_actions() %}{% if links %}
|
||||
<details class="actions-menu-links">
|
||||
<summary><svg aria-labelledby="actions-menu-links-title" role="img"
|
||||
style="color: #666" xmlns="http://www.w3.org/2000/svg"
|
||||
width="28" height="28" viewBox="0 0 24 24" fill="none"
|
||||
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||
<title id="actions-menu-links-title">Actions</title>
|
||||
<circle cx="12" cy="12" r="3"></circle>
|
||||
<path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"></path>
|
||||
</svg></summary>
|
||||
<div class="dropdown-menu">
|
||||
{% if links %}
|
||||
<ul>
|
||||
{% for link in links %}
|
||||
<li><a href="{{ link.href }}">{{ link.label }}</a></li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endif %}
|
||||
</div>
|
||||
</details>{% endif %}
|
||||
</div>
|
||||
|
||||
{% block description_source_license %}{% include "_description_source_license.html" %}{% endblock %}
|
||||
|
||||
{% if filtered_table_rows_count or human_description_en %}
|
||||
<h4>{% if filtered_table_rows_count or filtered_table_rows_count == 0 %}{{ "{:,}".format(filtered_table_rows_count) }} ligne{% if filtered_table_rows_count == 1 %}{% else %}s{% endif %}{% endif %}
|
||||
<!-- {% if human_description_en %}{{ human_description_en }}{% endif %} -->
|
||||
</h4>
|
||||
{% endif %}
|
||||
|
||||
<form class="filters" action="{{ urls.table(database, table) }}" method="get">
|
||||
{% if supports_search %}
|
||||
<div class="search-row"><label for="_search">Rechercher :</label><input id="_search" type="search" name="_search" value="{{ search }}"></div>
|
||||
{% endif %}
|
||||
{% for column, lookup, value in filters.selections() %}
|
||||
<div class="filter-row">
|
||||
<div class="select-wrapper">
|
||||
<select name="_filter_column_{{ loop.index }}">
|
||||
<option value="">- supprimer le filtre -</option>
|
||||
{% for c in filter_columns %}
|
||||
<option{% if c == column %} selected{% endif %} value="{{ c }}">{{ metadata.column_labels[c] }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div><div class="select-wrapper filter-op">
|
||||
<select name="_filter_op_{{ loop.index }}">
|
||||
{% for key, display, no_argument in filters.lookups() %}
|
||||
{% if metadata.operation_labels[key] %}
|
||||
<option value="{{ key }}{% if no_argument %}__1{% endif %}"{% if key == lookup %} selected{% endif %}>{{ metadata.operation_labels[key] }}</option>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div><input type="text" name="_filter_value_{{ loop.index }}" class="filter-value" value="{{ value }}">
|
||||
</div>
|
||||
{% endfor %}
|
||||
<div class="filter-row">
|
||||
<div class="select-wrapper">
|
||||
<select name="_filter_column">
|
||||
<option value="">- colonne -</option>
|
||||
{% for column in filter_columns %}
|
||||
<option value="{{ column }}">{{ metadata.column_labels[column] }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div><div class="select-wrapper filter-op">
|
||||
<select name="_filter_op">
|
||||
{% for key, display, no_argument in filters.lookups() %}
|
||||
{% if metadata.operation_labels[key] %}
|
||||
<option value="{{ key }}{% if no_argument %}__1{% endif %}"{% if key == lookup %} selected{% endif %}>{{ metadata.operation_labels[key] }}</option>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div><input type="text" name="_filter_value" class="filter-value">
|
||||
</div>
|
||||
<div class="filter-row">
|
||||
{% if is_sortable %}
|
||||
<div class="select-wrapper small-screen-only">
|
||||
<select name="_sort" id="sort_by">
|
||||
<option value="">Trier...</option>
|
||||
{% for column in display_columns %}
|
||||
{% if column.sortable %}
|
||||
<option value="{{ column.name }}"{% if column.name == sort or column.name == sort_desc %} selected{% endif %}>Trier par {{ column.name }}</option>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
<label class="sort_by_desc small-screen-only"><input type="checkbox" name="_sort_by_desc"{% if sort_desc %} checked{% endif %}> décroissant</label>
|
||||
{% endif %}
|
||||
{% for key, value in form_hidden_args %}
|
||||
<input type="hidden" name="{{ key }}" value="{{ value }}">
|
||||
{% endfor %}
|
||||
<input type="submit" value="Filtrer">
|
||||
</div>
|
||||
</form>
|
||||
|
||||
{% if extra_wheres_for_ui %}
|
||||
<div class="extra-wheres">
|
||||
<h3>{{ extra_wheres_for_ui|length }} extra where clause{% if extra_wheres_for_ui|length != 1 %}s{% endif %}</h3>
|
||||
<ul>
|
||||
{% for extra_where in extra_wheres_for_ui %}
|
||||
<li><code>{{ extra_where.text }}</code> [<a href="{{ extra_where.remove_url }}">supprimer</a>]</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
|
||||
|
||||
<p class="export-links">Télécharger ces données au format <a href="{{ url_csv | replace('.csv','.xlsx')}}&_dl=1">Excel</a> ou <a href="{{ url_csv }}&_dl=1">CSV</a>{% if filtered_table_rows_count > 50000 %} (50 000 premières lignes){% endif %}.
|
||||
|
||||
{% if query.sql and allow_execute_sql %}
|
||||
- <a class="not-underlined" title="{{ query.sql }}" href="{{ urls.database(database) }}?{{ {'sql': query.sql}|urlencode|safe }}{% if query.params %}&{{ query.params|urlencode|safe }}{% endif %}">✎ <span class="underlined">Voir et éditer le SQL</span></a>
|
||||
{% endif %}
|
||||
{% if table == "decp-titulaires" %}Veuillez patienter pendant le chargement de la carte ci-dessous...{% endif %}
|
||||
</p>
|
||||
|
||||
<!-- {% if suggested_facets %}
|
||||
<p class="suggested-facets">
|
||||
Facettes suggérées : {% for facet in suggested_facets %}<a href="{{ facet.toggle_url }}#facet-{{ facet.name|to_css_class }}">{{ facet.name }}</a>{% if facet.type %} ({{ facet.type }}){% endif %}{% if not loop.last %}, {% endif %}{% endfor %}
|
||||
</p>
|
||||
{% endif %}
|
||||
|
||||
{% if facets_timed_out %}
|
||||
<p class="facets-timed-out">Ces facettes ont pris trop temps à être générées : {{ ", ".join(facets_timed_out) }}</p>
|
||||
{% endif %}
|
||||
|
||||
{% if facet_results %}
|
||||
<div class="facet-results">
|
||||
{% for facet_info in sorted_facet_results %}
|
||||
<div class="facet-info facet-{{ database|to_css_class }}-{{ table|to_css_class }}-{{ facet_info.name|to_css_class }}" id="facet-{{ facet_info.name|to_css_class }}">
|
||||
<p class="facet-info-name">
|
||||
<strong>{{ facet_info.name }}{% if facet_info.type != "column" %} ({{ facet_info.type }}){% endif %}</strong>
|
||||
{% if facet_info.hideable %}
|
||||
<a href="{{ facet_info.toggle_url }}" class="cross">✖</a>
|
||||
{% endif %}
|
||||
</p>
|
||||
<ul class="tight-bullets">
|
||||
{% for facet_value in facet_info.results %}
|
||||
{% if not facet_value.selected %}
|
||||
<li><a href="{{ facet_value.toggle_url }}">{{ (facet_value.label | string()) or "-" }}</a> {{ "{:,}".format(facet_value.count) }}</li>
|
||||
{% else %}
|
||||
<li>{{ facet_value.label or "-" }} · {{ "{:,}".format(facet_value.count) }} <a href="{{ facet_value.toggle_url }}" class="cross">✖</a></li>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% if facet_info.truncated %}
|
||||
<li>...</li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}-->
|
||||
|
||||
{% include custom_table_templates %}
|
||||
|
||||
{% if next_url %}
|
||||
<p><a href="{{ next_url }}">Page suivante</a></p>
|
||||
{% endif %}
|
||||
|
||||
<!-- {% if display_rows %}
|
||||
<div id="export" class="advanced-export">
|
||||
<h3>Export avancé</h3>
|
||||
<p>JSON shape:
|
||||
<a href="{{ renderers['json'] }}">par défaut</a>,
|
||||
<a href="{{ append_querystring(renderers['json'], '_shape=array') }}">array</a>,
|
||||
<a href="{{ append_querystring(renderers['json'], '_shape=array&_nl=on') }}">newline-delimited</a>{% if primary_keys %},
|
||||
<a href="{{ append_querystring(renderers['json'], '_shape=object') }}">objet</a>
|
||||
{% endif %}
|
||||
</p>
|
||||
<form action="{{ url_csv_path }}" method="get">
|
||||
<p>
|
||||
Options CSV :
|
||||
<label><input type="checkbox" name="_dl"> télécharger le fichier</label>
|
||||
{% if expandable_columns %}<label><input type="checkbox" name="_labels" checked> récupérer les libellés</label>{% endif %}
|
||||
{% if next_url and config.allow_csv_stream %}<label><input type="checkbox" name="_stream"> stream de lignes</label>{% endif %}
|
||||
<input type="submit" value="Exporter le CSV">
|
||||
{% for key, value in url_csv_hidden_args %}
|
||||
<input type="hidden" name="{{ key }}" value="{{ value }}">
|
||||
{% endfor %}
|
||||
</p>
|
||||
</form>
|
||||
</div>
|
||||
{% endif %} -->
|
||||
|
||||
<!-- {% if table_definition %}
|
||||
<pre class="wrapped-sql">{{ table_definition }}</pre>
|
||||
{% endif %}
|
||||
|
||||
{% if view_definition %}
|
||||
<pre class="wrapped-sql">{{ view_definition }}</pre>
|
||||
{% endif %} -->
|
||||
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,25 @@
|
||||
[project]
|
||||
name = "decp.info"
|
||||
description = "Interface d'exploration et d'analyse des marchés publics français."
|
||||
version = "2.1.4"
|
||||
requires-python = ">= 3.10"
|
||||
authors = [
|
||||
{ name = "Colin Maudry", email = "colin+decp@maudry.com" }
|
||||
]
|
||||
dependencies = [
|
||||
"dash==3.2.0",
|
||||
"dash[compress]",
|
||||
"polars",
|
||||
"gunicorn",
|
||||
"dash-bootstrap-components",
|
||||
"python-dotenv",
|
||||
"xlsxwriter",
|
||||
"plotly[express]",
|
||||
"httpx",
|
||||
"pandas" # utilisé pour la création de certains graphiques
|
||||
]
|
||||
|
||||
[project.optional-dependencies]
|
||||
dev = [
|
||||
"pre-commit",
|
||||
]
|
||||
@@ -0,0 +1,8 @@
|
||||
from src.app import app
|
||||
|
||||
# To use `gunicorn run:server` (prod)
|
||||
server = app.server
|
||||
|
||||
# To use `python run.py` (dev)
|
||||
if __name__ == "__main__":
|
||||
app.run(debug=True)
|
||||
@@ -1,9 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
echo "Get data..."
|
||||
wget -nv https://www.data.gouv.fr/fr/datasets/r/c6b08d03-7aa4-4132-b5b2-fd76633feecc -O datasette/db.db
|
||||
|
||||
datasette inspect datasette/*.db --inspect-file=datasette/inspect-data.json
|
||||
|
||||
echo "Starting datasette..."
|
||||
datasette datasette/ --port 9090 --cors | grep -v "/static/"
|
||||
@@ -0,0 +1,110 @@
|
||||
import logging
|
||||
|
||||
import dash_bootstrap_components as dbc
|
||||
import tomllib
|
||||
from dash import Dash, dcc, html, page_container, page_registry
|
||||
from dotenv import load_dotenv
|
||||
from flask import send_from_directory
|
||||
|
||||
load_dotenv()
|
||||
|
||||
app = Dash(
|
||||
external_stylesheets=[dbc.themes.SIMPLEX],
|
||||
title="decp.info",
|
||||
use_pages=True,
|
||||
compress=True,
|
||||
)
|
||||
# COSMO (belle font, blue),
|
||||
# UNITED (rouge, ubuntu font),
|
||||
# LUMEN (gros séparateur, blue clair),
|
||||
# SIMPLEX (rouge, séparateur)
|
||||
|
||||
|
||||
# robots.txt
|
||||
@app.server.route("/robots.txt")
|
||||
def robots():
|
||||
return send_from_directory("./assets", "robots.txt", mimetype="text/plain")
|
||||
|
||||
|
||||
logger = logging.getLogger("decp.info")
|
||||
logging.basicConfig(
|
||||
format="%(asctime)s %(levelname)-8s %(message)s",
|
||||
level=logging.INFO,
|
||||
datefmt="%Y-%m-%d %H:%M:%S",
|
||||
)
|
||||
|
||||
with open("./pyproject.toml", "rb") as f:
|
||||
pyproject = tomllib.load(f)
|
||||
version = "v" + pyproject["project"]["version"]
|
||||
|
||||
|
||||
app.index_string = """
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
<head>
|
||||
{%metas%}
|
||||
<title>{%title%}</title>
|
||||
{%favicon%}
|
||||
{%css%}
|
||||
</head>
|
||||
<body>
|
||||
{%app_entry%}
|
||||
<footer>
|
||||
{%config%}
|
||||
{%scripts%}
|
||||
{%renderer%}
|
||||
</footer>
|
||||
<script type="application/javascript">
|
||||
console.log("Matomo");
|
||||
var _paq = window._paq = window._paq || [];
|
||||
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
|
||||
_paq.push(['trackPageView']);
|
||||
_paq.push(['enableLinkTracking']);
|
||||
(function() {
|
||||
var u="//analytics.maudry.com/";
|
||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||
_paq.push(['setSiteId', '14']);
|
||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
"""
|
||||
|
||||
app.layout = html.Div(
|
||||
[
|
||||
html.Div(
|
||||
[
|
||||
html.Div(
|
||||
[
|
||||
html.A(children=html.H1("decp.info"), href="/"),
|
||||
html.P(
|
||||
children=html.A(
|
||||
version,
|
||||
href="https://github.com/ColinMaudry/decp.info?tab=readme-ov-file#notes-de-version",
|
||||
target="_blank",
|
||||
),
|
||||
className="version",
|
||||
),
|
||||
],
|
||||
className="logo",
|
||||
),
|
||||
html.Div(
|
||||
[
|
||||
dcc.Link(
|
||||
page["name"], href=page["relative_path"], className="nav"
|
||||
)
|
||||
for page in page_registry.values()
|
||||
if page["name"] not in ["Acheteur", "Titulaire", "Marché"]
|
||||
]
|
||||
),
|
||||
],
|
||||
className="navbar",
|
||||
),
|
||||
page_container,
|
||||
]
|
||||
)
|
||||
|
||||
if __name__ == "__main__":
|
||||
app.run(debug=True)
|
||||
|
After Width: | Height: | Size: 333 KiB |
@@ -0,0 +1,41 @@
|
||||
# START YOAST BLOCK
|
||||
# Copié depuis https://next.ink/robots.txt
|
||||
# ---------------------------
|
||||
User-agent: *
|
||||
Allow: /
|
||||
|
||||
# ---------------------------
|
||||
# END YOAST BLOCK
|
||||
|
||||
User-agent: GPTBot
|
||||
Disallow: /
|
||||
User-agent: ChatGPT-User
|
||||
Disallow: /
|
||||
User-agent: Google-Extended
|
||||
Disallow: /
|
||||
User-agent: PerplexityBot
|
||||
Disallow: /
|
||||
User-agent: Amazonbot
|
||||
Disallow: /
|
||||
User-agent: ClaudeBot
|
||||
Disallow: /
|
||||
User-Agent: FacebookBot
|
||||
Disallow: /
|
||||
User-Agent: Applebot
|
||||
Disallow: /
|
||||
User-agent: anthropic-ai
|
||||
Disallow: /
|
||||
User-agent: Bytespider
|
||||
Disallow: /
|
||||
User-agent: Claude-Web
|
||||
Disallow: /
|
||||
User-agent: Diffbot
|
||||
Disallow: /
|
||||
User-agent: ImagesiftBot
|
||||
Disallow: /
|
||||
User-agent: Omgilibot
|
||||
Disallow: /
|
||||
User-agent: Omgili
|
||||
Disallow: /
|
||||
User-agent: YouBot
|
||||
Disallow: /
|
||||
@@ -0,0 +1,240 @@
|
||||
/* Change la marge bout d'export */
|
||||
.table-menu {
|
||||
font-size: 16px;
|
||||
margin: 12px;
|
||||
height: 36px;
|
||||
}
|
||||
|
||||
.table-menu > * {
|
||||
margin: 8px;
|
||||
float: left;
|
||||
}
|
||||
|
||||
#source_table p {
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
#source_table {
|
||||
margin-bottom: 25px;
|
||||
}
|
||||
|
||||
#instructions {
|
||||
max-width: 1000px;
|
||||
}
|
||||
|
||||
details > div {
|
||||
padding-top: 24px;
|
||||
}
|
||||
|
||||
/* Logo et version */
|
||||
|
||||
div.logo {
|
||||
width: 230px;
|
||||
}
|
||||
|
||||
p.version {
|
||||
float: left;
|
||||
margin-top: 21px;
|
||||
margin-left: 12px;
|
||||
}
|
||||
|
||||
p.version > a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
div.logo h1 {
|
||||
float: left;
|
||||
}
|
||||
|
||||
div.logo > a {
|
||||
text-decoration: none;
|
||||
color: black;
|
||||
}
|
||||
|
||||
/* Réduire la taille du texte de la colonne Objet */
|
||||
|
||||
td[data-dash-column="objet"] {
|
||||
font-size: 85%;
|
||||
}
|
||||
|
||||
/* Couleur des en-têtes */
|
||||
.dash-table-container
|
||||
.dash-spreadsheet-container
|
||||
.dash-spreadsheet-inner
|
||||
th.dash-header {
|
||||
background-color: #b33821;
|
||||
color: white;
|
||||
font-family: sans-serif;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.dash-table-container
|
||||
.dash-spreadsheet-container
|
||||
.dash-spreadsheet-inner
|
||||
th.dash-filter {
|
||||
background-color: #f0afa3;
|
||||
}
|
||||
|
||||
.dash-table-container p {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.dash-filter--case {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.dash-tooltip,
|
||||
.dash-table-tooltip {
|
||||
color: #333;
|
||||
width: 400px !important;
|
||||
max-width: 400px !important;
|
||||
height: 150px !important;
|
||||
max-height: 150px !important;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.dash-tooltip pre,
|
||||
.dash-tooltip code {
|
||||
overflow: hidden;
|
||||
height: 150px;
|
||||
text-wrap: wrap;
|
||||
font-family: sans-serif;
|
||||
}
|
||||
|
||||
/* Menu de masquage des colonnes */
|
||||
.column-actions {
|
||||
margin-right: 8px;
|
||||
}
|
||||
|
||||
.column-header--hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.show-hide {
|
||||
position: relative;
|
||||
width: 180px;
|
||||
margin: 0 0 10px 10px;
|
||||
}
|
||||
|
||||
.show-hide::before {
|
||||
background: inherit;
|
||||
content: "Colonnes affichées";
|
||||
position: absolute;
|
||||
left: 5px;
|
||||
right: 5px;
|
||||
}
|
||||
|
||||
.show-hide-menu-item > input {
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
/* Alternance des couleurs pour les lignes */
|
||||
.marches_table {
|
||||
font-family: sans-serif;
|
||||
}
|
||||
.marches_table .cell-table tr:nth-child(even) td {
|
||||
background-color: #feeeee;
|
||||
font-family: sans-serif;
|
||||
}
|
||||
|
||||
#header > *,
|
||||
.dash-spreadsheet-menu button.export {
|
||||
margin: 0 0 20px 20px;
|
||||
}
|
||||
|
||||
/* Menu de navigation */
|
||||
|
||||
.navbar {
|
||||
width: 100%;
|
||||
height: 100px;
|
||||
padding: 0 10px;
|
||||
border: 0;
|
||||
border-bottom: solid 1px black;
|
||||
}
|
||||
|
||||
a.nav {
|
||||
float: left;
|
||||
margin-right: 40px;
|
||||
font-size: 120%;
|
||||
}
|
||||
|
||||
h3 {
|
||||
margin: 36px 0 24px 0;
|
||||
}
|
||||
|
||||
summary > h3 {
|
||||
margin: 0;
|
||||
display: inline;
|
||||
}
|
||||
|
||||
#_pages_content {
|
||||
padding-top: 28px;
|
||||
}
|
||||
|
||||
/* Vue acheteur/titulaire */
|
||||
.wrapper {
|
||||
display: grid;
|
||||
grid-gap: 10px;
|
||||
margin-bottom: 50px;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.wrapper > div {
|
||||
}
|
||||
|
||||
.org_title {
|
||||
grid-column: 1 / 3;
|
||||
grid-row: 1;
|
||||
}
|
||||
|
||||
.org_year {
|
||||
grid-column: 3;
|
||||
grid-row: 1;
|
||||
}
|
||||
|
||||
.org_infos {
|
||||
grid-column: 1;
|
||||
grid-row: 2;
|
||||
}
|
||||
|
||||
.org_infos > p {
|
||||
margin: 8px 0;
|
||||
}
|
||||
|
||||
.org_stats {
|
||||
grid-column: 2;
|
||||
grid-row: 2;
|
||||
}
|
||||
|
||||
.org_map {
|
||||
grid-column: 3;
|
||||
grid-row: 2;
|
||||
}
|
||||
|
||||
/* Vue marché */
|
||||
|
||||
.marche_infos p {
|
||||
margin-top: 6px;
|
||||
margin-bottom: 6px;
|
||||
}
|
||||
|
||||
.marche_title {
|
||||
grid-column: 1/3;
|
||||
grid-row: 1;
|
||||
}
|
||||
|
||||
.marche_map {
|
||||
grid-column: 3;
|
||||
grid-row: 2;
|
||||
width: 400px;
|
||||
}
|
||||
|
||||
.marche_infos_1 {
|
||||
grid-column: 1;
|
||||
grid-row: 2;
|
||||
}
|
||||
|
||||
.marche_infos_2 {
|
||||
grid-column: 2;
|
||||
grid-row: 2;
|
||||
}
|
||||
@@ -0,0 +1,194 @@
|
||||
import json
|
||||
|
||||
import plotly.express as px
|
||||
import polars as pl
|
||||
from dash import dash_table, dcc, html
|
||||
|
||||
|
||||
def get_map_count_marches(df: pl.DataFrame):
|
||||
lf = df.lazy()
|
||||
lf = lf.with_columns(
|
||||
pl.col("lieuExecution_code").str.head(2).str.zfill(2).alias("Département")
|
||||
)
|
||||
lf = (
|
||||
lf.select(["uid", "Département"])
|
||||
.drop_nulls()
|
||||
.unique(subset="uid")
|
||||
.group_by("Département")
|
||||
.len("uid")
|
||||
)
|
||||
# Suppression des infos pour les DOM/TOM pour l'instant
|
||||
lf = lf.remove(pl.col("Département").is_in(["97", "98"]))
|
||||
|
||||
with open("./data/departements-1000m.geojson") as f:
|
||||
departements = json.load(f)
|
||||
|
||||
# Ajout de feature.id
|
||||
for f in departements["features"]:
|
||||
f["id"] = f["properties"]["code"]
|
||||
|
||||
df = lf.collect(engine="streaming")
|
||||
|
||||
fig = px.choropleth(
|
||||
df,
|
||||
geojson=departements,
|
||||
locations="Département",
|
||||
color="uid",
|
||||
color_continuous_scale="Reds",
|
||||
title="Nombres de marchés attribués par département (lieu d'exécution)",
|
||||
range_color=(df["uid"].min(), df["uid"].max()),
|
||||
labels={"uid": "Marchés attribués"},
|
||||
scope="europe",
|
||||
width=900,
|
||||
height=700,
|
||||
)
|
||||
|
||||
fig.update_geos(fitbounds="locations", visible=False)
|
||||
fig.update_layout(
|
||||
mapbox={
|
||||
"style": "carto-positron",
|
||||
"center": {"lon": 10, "lat": 10},
|
||||
"zoom": 1,
|
||||
"domain": {"x": [0, 1], "y": [0, 1]},
|
||||
}
|
||||
)
|
||||
return fig
|
||||
|
||||
|
||||
def get_barchart_sources(df: pl.DataFrame, type_date: str):
|
||||
lf = df.lazy()
|
||||
labels = {
|
||||
"dateNotification": "notification",
|
||||
"datePublicationDonnees": "publication des données",
|
||||
}
|
||||
|
||||
lf = lf.select("uid", type_date, "sourceDataset")
|
||||
|
||||
lf = lf.unique("uid")
|
||||
|
||||
# Rassemblement des datasets Atexo pour ne pas surcharger le graphique
|
||||
lf = lf.with_columns(
|
||||
pl.when(pl.col("sourceDataset").str.starts_with("atexo"))
|
||||
.then(pl.lit("plateformes atexo"))
|
||||
.otherwise(pl.col("sourceDataset"))
|
||||
.alias("sourceDataset")
|
||||
)
|
||||
|
||||
# Rassemblement des datasets AWS pour ne pas surcharger le graphique
|
||||
lf = lf.with_columns(
|
||||
pl.when(pl.col("sourceDataset").str.contains(r"aws|marches\-publics.info"))
|
||||
.then(pl.lit("aws"))
|
||||
.otherwise(pl.col("sourceDataset"))
|
||||
.alias("sourceDataset")
|
||||
)
|
||||
|
||||
lf = lf.with_columns(pl.col(type_date).dt.year().alias("annee"))
|
||||
lf = lf.filter(
|
||||
pl.col(type_date).is_not_null() & pl.col("annee").is_between(2019, 2025)
|
||||
)
|
||||
lf = lf.with_columns(pl.col(type_date).cast(pl.String).str.head(7))
|
||||
lf = (
|
||||
lf.group_by([type_date, "sourceDataset"])
|
||||
.len()
|
||||
.sort(by=[type_date, "len"], descending=True)
|
||||
)
|
||||
|
||||
# lf = lf.with_columns(
|
||||
# pl.when(pl.col("sourceDataset").is_null()).then(
|
||||
# pl.lit("Source inconnue")).alias("sourceDataset")
|
||||
# )
|
||||
|
||||
lf = lf.sort(by=["sourceDataset"], descending=False)
|
||||
df: pl.DataFrame = lf.collect(engine="streaming")
|
||||
|
||||
fig = px.bar(
|
||||
df,
|
||||
x=type_date,
|
||||
y="len",
|
||||
color="sourceDataset",
|
||||
title=f"Nombre de marchés attribués par date de {labels[type_date]} et source de données",
|
||||
labels={
|
||||
"len": "Nombre de marchés",
|
||||
type_date: f"Mois de {labels[type_date]}",
|
||||
"sourceDataset": "Source de données",
|
||||
},
|
||||
)
|
||||
|
||||
return fig
|
||||
|
||||
|
||||
def get_sources_tables(source_path) -> html.Div:
|
||||
df = pl.read_csv(source_path)
|
||||
df = df.with_columns(
|
||||
(
|
||||
pl.lit('<a href = "')
|
||||
+ pl.col("url")
|
||||
+ pl.lit('">')
|
||||
+ pl.col("nom")
|
||||
+ pl.lit("</a>")
|
||||
).alias("nom")
|
||||
)
|
||||
df = df.drop("url")
|
||||
df = df.sort(by=["nb_marchés"], descending=True)
|
||||
|
||||
datatable = dash_table.DataTable(
|
||||
id="source_table",
|
||||
columns=[
|
||||
{
|
||||
"name": i,
|
||||
"id": i,
|
||||
"presentation": "markdown",
|
||||
"type": "text",
|
||||
"format": {"nully": "N/A"},
|
||||
}
|
||||
for i in df.schema.names()
|
||||
],
|
||||
style_cell_conditional=[
|
||||
{
|
||||
"if": {"column_id": ["nom", "organisation"]},
|
||||
"minWidth": "350px",
|
||||
"textAlign": "left",
|
||||
"overflow": "hidden",
|
||||
"lineHeight": "14px",
|
||||
"whiteSpace": "normal",
|
||||
},
|
||||
],
|
||||
sort_action="native",
|
||||
markdown_options={"html": True},
|
||||
)
|
||||
datatable.data = df.to_dicts()
|
||||
|
||||
return html.Div(children=datatable)
|
||||
|
||||
|
||||
def point_on_map(lat, lon):
|
||||
lat = float(lat)
|
||||
lon = float(lon)
|
||||
|
||||
# Create a scatter mapbox or choropleth map
|
||||
fig = px.scatter_map(
|
||||
lat=[lat], lon=[lon], height=300, width=400, color=[1], size=[1]
|
||||
)
|
||||
|
||||
fig.update_coloraxes(showscale=False)
|
||||
|
||||
# Set map style (you can use 'open-street-map', 'carto-positron', etc.)
|
||||
fig.update_layout(
|
||||
mapbox_style="light", # Light, clean background
|
||||
margin={"r": 0, "t": 0, "l": 0, "b": 0},
|
||||
)
|
||||
|
||||
# Optionally, center the map on France
|
||||
fig.update_geos(
|
||||
center=dict(lat=46.603354, lon=1.888334), # Center of France
|
||||
lataxis_range=[41, 51.5], # Latitude range for France
|
||||
lonaxis_range=[-5, 10], # Longitude range for France
|
||||
)
|
||||
|
||||
# But scatter_mapbox doesn't use geos, so better to control via zoom/center manually
|
||||
# Let's reset and use proper centering in scatter_mapbox instead:
|
||||
|
||||
fig.update_layout(map_center={"lat": 46.6, "lon": 1.89}, map_zoom=4)
|
||||
|
||||
graph = dcc.Graph(id="map", figure=fig)
|
||||
return graph
|
||||
@@ -0,0 +1,109 @@
|
||||
import os
|
||||
|
||||
from dash import dcc, html, register_page
|
||||
|
||||
from src.figures import get_sources_tables
|
||||
from src.utils import meta_content
|
||||
|
||||
name = "À propos"
|
||||
|
||||
register_page(
|
||||
__name__,
|
||||
path="/a-propos",
|
||||
title=meta_content["title"],
|
||||
name=name,
|
||||
description=meta_content["description"],
|
||||
image_url=meta_content["image_url"],
|
||||
order=5,
|
||||
)
|
||||
|
||||
layout = [
|
||||
html.Div(
|
||||
className="container",
|
||||
children=[
|
||||
html.H2(name),
|
||||
dcc.Markdown(
|
||||
"""Outil d'exploration libre et gratuit des données de marchés publics, développé par Colin Maudry.
|
||||
|
||||
Ce projet vise à démocratiser l'accès aux données des marchés publics et à un outil performant et gratuit. Si vous le trouvez utile
|
||||
j'aimerais beaucoup échanger avec vous pour comprendre vos cas d'usages et vos besoins. Cet outil ne peut rester performant que si je comprends les problèmes qu'il peut aider à résoudre. Ce projet ne peut rester gratuit que grâce au financement du développement de nouvelles fonctionnalités.
|
||||
|
||||
En effet, le potentiel des données d'attribution de marchés et des données qui peuvent les enrichir est très loin d'être exploité par
|
||||
les fonctionnalités actuelles de decp.info. Il est ainsi possible de rajouter
|
||||
|
||||
- de nombreuses visualisations de données (cartes, graphiques, tableaux) sur des thématiques variées (vivacité de la concurrence, secteurs d'activité, insertion par l'activité économique (IAE), distance acheteur-titulaire...)
|
||||
- la sauvegarde de filtres pour les retrouver plus tard et les partager
|
||||
- des alertes par email si des marchés correspondant à certains critères
|
||||
- le développement d'une API pour alimenter d'autres logiciels
|
||||
- ...et toutes les fonctionnalités auxquelles vous pourrez penser
|
||||
"""
|
||||
),
|
||||
html.H4("Pour contribuer", id="contribuer"),
|
||||
dcc.Markdown("""
|
||||
- via l'achat d'une prestation de service (devis, prestation, facture), vous pouvez financer le développement de [fonctionnalités prévues](https://github.com/ColinMaudry/decp.info/issues), ou d'autres !
|
||||
- ma société accepte aussi les dons (pas de réduction d'impôt possible)
|
||||
- [écrivez-moi](/contact) et on discute !
|
||||
|
||||
#### Pour explorer le projet
|
||||
|
||||
- ✉️ [inscription à la liste de diffusion](https://6254d9a3.sibforms.com/serve/MUIFAEonUVkoSVrdgey18CTgLyI16xw4yeu-M-YOUzhWE_AgfQfbgkyT7GvA_RYLro9MfuRqkzQxSvu7-uzbMSv2a2ZQPsliM7wtiiqIL8kR2zOvl6m11fb5qjcOxMAYsLiY_YBi3P7NY95CTJ8vRY4CpsDclF2iLooOElKkTgIgi5nePe7zAIrgiYM5v2EuALlGJZMEG9vBP-Cu) (annonces des mises à jour et évènements, maximum une fois par mois)
|
||||
- 💾 [données consolidées en Open Data](https://www.data.gouv.fr/datasets/donnees-essentielles-de-la-commande-publique-consolidees-format-tabulaire/)
|
||||
- 🗞️ [mon blog](https://colin.maudry.com)
|
||||
- 📔 [wiki du projet](https://github.com/ColinMaudry/decp-processing/wiki)
|
||||
- 🚰 code source
|
||||
- [de decp.info](https://github.com/ColinMaudry/decp.info)
|
||||
- [du traitement des données](https://github.com/ColinMaudry/decp-processing)
|
||||
"""),
|
||||
html.H4("Qualité et exhaustivité des données", id="qualite-exhausitivite"),
|
||||
dcc.Markdown("""Les données visibles sur ce site proviennent exclusivement de la publication de données ouvertes par les acheteurs publics ou en leur nom, régie par [l'arrêté du 22 décembre 2022](https://www.legifrance.gouv.fr/jorf/id/JORFTEXT000046850496). Leur qualité est donc principalement liée à la qualité de leur saisie par les agents publics, parfois peu aidé·es par la qualité des outils à leur disposition. Je pense que l'analyse de marchés individuels et le comptage de marchés sur des critères autres que financiers sont plutôt fiables. En revanche, certains montants de marché estimés à des valeurs farfelues ([1 euro](https://decp.info/marches/432766947000192025S01301), [1 milliard](https://decp.info/marches/2459004280001320210000000271)) faussent les calculs par aggrégation (sommes, moyennes, médianes) et donc la production de statistiques financières fiables. Acheteurs, acheteuses : s'il vous plaît, essayez d'estimer les montants des marchés publics attribués de manière plus précise.
|
||||
|
||||
Quant à l'exhaustivité, je consolide toutes les sources de données exploitables que j'ai pu identifier (voir [statistiques](/statistiques)). Certains profils d'acheteurs ne publient pas leurs données malgré l'obligation réglementaire :
|
||||
|
||||
- marches-securises.fr
|
||||
- klekoon.fr (ils y travaillent)
|
||||
|
||||
**marches-publics.gouv.fr** (PLACE, [AIFE](https://aife.economie.gouv.fr)), la plateforme des marchés de l'État, ne publie plus de données depuis le 1er janvier 2024 et l'entrée en vigueur de l'arrêté. Nous n'avons donc plus de données sur les marchés publics passés par les ministères, ainsi que sur ceux passés par les acheteurs clients d'[achatpublic.com](https://www.achatpublic.com), qui s'appuie sur les moyens de publication de l'AIFE.
|
||||
|
||||
**marches-publics.info** (AWS) publie ses données de manière assez sporadique depuis début 2023. Compte tenu de son poids dans le secteur, c'est assez dommageable pour la transparence des marchés publics.
|
||||
|
||||
Au milieu de ces mauvaises nouvelles, je tiens à souligner la belle continuité de la publication par la DGFiP des données des marchés publics remontées via le [protocole PES](https://www.collectivites-locales.gouv.fr/finances-locales/le-protocole-dechange-standard-pes). Merci à leurs équipes."""),
|
||||
html.H4("Sources de données ", id="qualite-exhausitivite"),
|
||||
get_sources_tables(os.getenv("SOURCE_STATS_CSV_PATH")),
|
||||
html.H4("Mentions légales", id="mentions-legales"),
|
||||
dcc.Markdown("""
|
||||
##### Publication
|
||||
|
||||
Site Web développé et édité par [SAS Colmo](https://annuaire-entreprises.data.gouv.fr/entreprise/colmo-989393350), 989 393 350 RCS Rennes au capital de 3 000 euros.
|
||||
|
||||
Siège social : 1 carrefour Jouaust, 35000 Rennes
|
||||
|
||||
Hébergement : serveur situé en France et administré par Scaleway, 8 rue de la Ville l’Evêque, 75008 Paris
|
||||
|
||||
##### Suivi d'audience
|
||||
|
||||
Ce site dépose un petit fichier texte (un « cookie ») sur votre ordinateur lorsque vous le consultez ([Wikipédia](https://fr.wikipedia.org/wiki/Cookie_(informatique))). Cela me permet de mesurer le nombre de visites, de distinguer les nouveaux visiteurs des utilisateurs réguliers et ainsi de communiquer sur l'impact de decp.info.
|
||||
|
||||
**Ce site n’affiche pas de bannière de consentement aux cookies, pourquoi ?**
|
||||
|
||||
C’est vrai, vous n’avez pas eu à cliquer sur un bloc qui recouvre la moitié de la page pour dire que vous êtes d’accord avec le dépôt de cookies.
|
||||
|
||||
Rien d’exceptionnel, je respecte simplement la loi, qui dit que certains outils de suivi d’audience, correctement configurés pour respecter la vie privée, sont exemptés d’autorisation préalable.
|
||||
|
||||
J’utilise pour cela [Matomo](https://matomo.org/), un outil [libre](https://matomo.org/free-software/), paramétré pour être en conformité avec [la recommandation « Cookies »](https://www.cnil.fr/fr/solutions-pour-les-cookies-de-mesure-daudience) de la CNIL. Cela signifie que votre adresse IP, par exemple, est anonymisée avant d’être enregistrée. Il m’est donc impossible d’associer vos visites sur ce site à votre personne."""),
|
||||
# Matomo propose cependant ce formulaire si vous souhaitez totalement désactiver le suivi de vos sessions sur ce site :"""),
|
||||
# html.Div(
|
||||
# id="matomo-opt-out",
|
||||
# style={
|
||||
# "border": "1pt solid lightgrey",
|
||||
# "padding": "12px",
|
||||
# "margin": "auto 0 auto 12px",
|
||||
# "width": "80%",
|
||||
# },
|
||||
# children=["Vous utilisez un bloqueur de suivi de trafic."],
|
||||
# ),
|
||||
# html.Script(
|
||||
# src="https://analytics.maudry.com/index.php?module=CoreAdminHome&action=optOutJS&divId=matomo-opt-out&language=auto&showIntro=1"
|
||||
# ),
|
||||
],
|
||||
)
|
||||
]
|
||||
@@ -0,0 +1,276 @@
|
||||
import datetime
|
||||
|
||||
import polars as pl
|
||||
from dash import Input, Output, State, callback, dash_table, dcc, html, register_page
|
||||
|
||||
from src.figures import point_on_map
|
||||
from src.utils import (
|
||||
add_links_in_dict,
|
||||
df,
|
||||
format_montant,
|
||||
format_number,
|
||||
get_annuaire_data,
|
||||
get_departement_region,
|
||||
meta_content,
|
||||
setup_table_columns,
|
||||
)
|
||||
|
||||
register_page(
|
||||
__name__,
|
||||
path_template="/acheteurs/<acheteur_id>",
|
||||
title=meta_content["title"],
|
||||
name="Acheteur",
|
||||
description=meta_content["description"],
|
||||
image_url=meta_content["image_url"],
|
||||
order=5,
|
||||
)
|
||||
|
||||
layout = [
|
||||
dcc.Store(id="acheteur_data", storage_type="memory"),
|
||||
dcc.Location(id="url", refresh="callback-nav"),
|
||||
html.Div(
|
||||
className="container",
|
||||
children=[
|
||||
html.Div(
|
||||
className="wrapper",
|
||||
children=[
|
||||
html.H2(
|
||||
className="org_title",
|
||||
children=[
|
||||
html.Span(id="acheteur_siret"),
|
||||
" - ",
|
||||
html.Span(id="acheteur_nom"),
|
||||
],
|
||||
),
|
||||
html.Div(
|
||||
className="org_year",
|
||||
children=dcc.Dropdown(
|
||||
id="acheteur_year",
|
||||
options=["Toutes"]
|
||||
+ [
|
||||
str(year)
|
||||
for year in range(
|
||||
2018, int(datetime.date.today().year) + 1
|
||||
)
|
||||
],
|
||||
placeholder="Année",
|
||||
),
|
||||
),
|
||||
html.Div(
|
||||
className="org_infos",
|
||||
children=[
|
||||
# TODO: ajouter le type d'acheteur : commune, CD, CR, etc.
|
||||
html.P(["Commune : ", html.Strong(id="acheteur_commune")]),
|
||||
html.P(
|
||||
[
|
||||
"Département : ",
|
||||
html.Strong(id="acheteur_departement"),
|
||||
]
|
||||
),
|
||||
html.P(["Région : ", html.Strong(id="acheteur_region")]),
|
||||
html.A(
|
||||
id="acheteur_lien_annuaire",
|
||||
children="Plus de détails sur l'Annuaire des entreprises",
|
||||
target="_blank",
|
||||
),
|
||||
],
|
||||
),
|
||||
html.Div(
|
||||
className="org_stats",
|
||||
children=[
|
||||
html.P(id="acheteur_titre_stats"),
|
||||
html.P(id="acheteur_marches_attribues"),
|
||||
html.P(id="acheteur_titulaires_differents"),
|
||||
html.Button(
|
||||
"Téléchargement au format Excel",
|
||||
id="btn-download-acheteur-data",
|
||||
),
|
||||
dcc.Download(id="download-acheteur-data"),
|
||||
],
|
||||
),
|
||||
html.Div(className="org_map", id="acheteur_map"),
|
||||
],
|
||||
),
|
||||
# récupérer les données de l'acheteur sur l'api annuaire
|
||||
html.H3("Derniers marchés publics attribués"),
|
||||
html.Div(id="acheteur_last_marches", children=""),
|
||||
],
|
||||
),
|
||||
]
|
||||
|
||||
|
||||
@callback(
|
||||
Output(component_id="acheteur_siret", component_property="children"),
|
||||
Output(component_id="acheteur_nom", component_property="children"),
|
||||
Output(component_id="acheteur_commune", component_property="children"),
|
||||
Output(component_id="acheteur_map", component_property="children"),
|
||||
Output(component_id="acheteur_departement", component_property="children"),
|
||||
Output(component_id="acheteur_region", component_property="children"),
|
||||
Output(component_id="acheteur_lien_annuaire", component_property="href"),
|
||||
Input(component_id="url", component_property="pathname"),
|
||||
)
|
||||
def update_acheteur_infos(url):
|
||||
acheteur_siret = url.split("/")[-1]
|
||||
if len(acheteur_siret) != 14:
|
||||
acheteur_siret = (
|
||||
f"Le SIRET renseigné doit faire 14 caractères ({acheteur_siret})"
|
||||
)
|
||||
data = get_annuaire_data(acheteur_siret)
|
||||
data_etablissement = data["matching_etablissements"][0]
|
||||
acheteur_map = point_on_map(
|
||||
data_etablissement["latitude"], data_etablissement["longitude"]
|
||||
)
|
||||
code_departement, nom_departement, nom_region = get_departement_region(
|
||||
data_etablissement["code_postal"]
|
||||
)
|
||||
departement = f"{nom_departement} ({code_departement})"
|
||||
lien_annuaire = (
|
||||
f"https://annuaire-entreprises.data.gouv.fr/etablissement/{acheteur_siret}"
|
||||
)
|
||||
return (
|
||||
acheteur_siret,
|
||||
data["nom_raison_sociale"],
|
||||
data_etablissement["libelle_commune"],
|
||||
acheteur_map,
|
||||
departement,
|
||||
nom_region,
|
||||
lien_annuaire,
|
||||
)
|
||||
|
||||
|
||||
@callback(
|
||||
Output(component_id="acheteur_marches_attribues", component_property="children"),
|
||||
Output(
|
||||
component_id="acheteur_titulaires_differents", component_property="children"
|
||||
),
|
||||
Input(component_id="acheteur_data", component_property="data"),
|
||||
)
|
||||
def update_acheteur_stats(data):
|
||||
df = pl.DataFrame(data)
|
||||
if df.height == 0:
|
||||
df = pl.DataFrame(schema=df.collect_schema())
|
||||
df_marches = df.unique("id")
|
||||
nb_marches = format_number(df_marches.height)
|
||||
# somme_marches = format_number(int(df_marches.select(pl.sum("montant")).item()))
|
||||
marches_attribues = [html.Strong(nb_marches), " marchés et accord-cadres attribués"]
|
||||
# + ", pour un total de ", html.Strong(somme_marches + " €")]
|
||||
del df_marches
|
||||
|
||||
nb_titulaires = df.unique("titulaire_id").height
|
||||
nb_titulaires = [
|
||||
html.Strong(format_number(nb_titulaires)),
|
||||
" titulaires (SIRET) différents",
|
||||
]
|
||||
del df
|
||||
|
||||
return marches_attribues, nb_titulaires
|
||||
|
||||
|
||||
@callback(
|
||||
Output(component_id="acheteur_data", component_property="data"),
|
||||
Input(component_id="url", component_property="pathname"),
|
||||
Input(component_id="acheteur_year", component_property="value"),
|
||||
)
|
||||
def get_acheteur_marches_data(url, acheteur_year: str) -> list[dict]:
|
||||
acheteur_siret = url.split("/")[-1]
|
||||
lff = df.lazy()
|
||||
lff = lff.filter(pl.col("acheteur_id") == acheteur_siret)
|
||||
lff = lff.fill_null("")
|
||||
lff = lff.select(
|
||||
"id",
|
||||
"uid",
|
||||
"objet",
|
||||
"dateNotification",
|
||||
"titulaire_id",
|
||||
"titulaire_typeIdentifiant",
|
||||
"titulaire_nom",
|
||||
"montant",
|
||||
"codeCPV",
|
||||
"dureeMois",
|
||||
)
|
||||
if acheteur_year and acheteur_year != "Toutes":
|
||||
lff = lff.filter(
|
||||
pl.col("dateNotification").cast(pl.String).str.starts_with(acheteur_year)
|
||||
)
|
||||
lff = lff.sort(["dateNotification", "id"], descending=True, nulls_last=True)
|
||||
|
||||
data = lff.collect(engine="streaming").to_dicts()
|
||||
return data
|
||||
|
||||
|
||||
@callback(
|
||||
Output(component_id="acheteur_last_marches", component_property="children"),
|
||||
Input(component_id="acheteur_data", component_property="data"),
|
||||
)
|
||||
def get_last_marches_table(data) -> html.Div:
|
||||
dff = pl.DataFrame(data)
|
||||
dff = format_montant(dff)
|
||||
columns, tooltip = setup_table_columns(
|
||||
dff,
|
||||
hideable=False,
|
||||
exclude=["titulaire_id", "titulaire_typeIdentifiant", "uid"],
|
||||
)
|
||||
data = dff.to_dicts()
|
||||
data = add_links_in_dict(data, "titulaire")
|
||||
|
||||
table = html.Div(
|
||||
className="marches_table",
|
||||
id="acheteur_datatable",
|
||||
children=dash_table.DataTable(
|
||||
data=data,
|
||||
markdown_options={"html": True},
|
||||
page_action="native",
|
||||
filter_action="native",
|
||||
filter_options={"case": "insensitive", "placeholder_text": "Filtrer..."},
|
||||
columns=columns,
|
||||
tooltip_header=tooltip,
|
||||
tooltip_duration=8000,
|
||||
tooltip_delay=350,
|
||||
cell_selectable=False,
|
||||
page_size=10,
|
||||
style_cell_conditional=[
|
||||
{
|
||||
"if": {"column_id": "objet"},
|
||||
"minWidth": "300px",
|
||||
"textAlign": "left",
|
||||
"overflow": "hidden",
|
||||
"lineHeight": "14px",
|
||||
"whiteSpace": "normal",
|
||||
},
|
||||
{
|
||||
"if": {"column_id": "titulaire_nom"},
|
||||
"minWidth": "200px",
|
||||
"textAlign": "left",
|
||||
"overflow": "hidden",
|
||||
"lineHeight": "18px",
|
||||
"whiteSpace": "normal",
|
||||
},
|
||||
],
|
||||
),
|
||||
)
|
||||
return table
|
||||
|
||||
|
||||
@callback(
|
||||
Output("download-acheteur-data", "data"),
|
||||
Input("btn-download-acheteur-data", "n_clicks"),
|
||||
State(component_id="acheteur_data", component_property="data"),
|
||||
State(component_id="acheteur_nom", component_property="children"),
|
||||
State(component_id="acheteur_year", component_property="value"),
|
||||
prevent_initial_call=True,
|
||||
)
|
||||
def download_acheteur_data(
|
||||
n_clicks,
|
||||
data: [dict],
|
||||
acheteur_nom: str,
|
||||
annee: str,
|
||||
):
|
||||
df_to_download = pl.DataFrame(data)
|
||||
|
||||
def to_bytes(buffer):
|
||||
df_to_download.write_excel(
|
||||
buffer, worksheet="DECP" if annee in ["Toutes", None] else annee
|
||||
)
|
||||
|
||||
date = datetime.datetime.now().strftime("%Y-%m-%d_%H:%M:%S")
|
||||
return dcc.send_bytes(to_bytes, filename=f"decp_{acheteur_nom}_{date}.xlsx")
|
||||
@@ -0,0 +1,170 @@
|
||||
import os
|
||||
import re
|
||||
import smtplib
|
||||
import time
|
||||
from email.mime.multipart import MIMEMultipart
|
||||
from email.mime.text import MIMEText
|
||||
|
||||
from dash import Input, Output, State, callback, dcc, html, register_page
|
||||
from flask import request
|
||||
|
||||
from src.utils import meta_content
|
||||
|
||||
name = "Contact"
|
||||
register_page(
|
||||
__name__,
|
||||
path="/contact",
|
||||
title=meta_content["title"],
|
||||
name=name,
|
||||
description=meta_content["description"],
|
||||
image_url=meta_content["image_url"],
|
||||
order=6,
|
||||
)
|
||||
|
||||
layout = html.Div(
|
||||
className="container",
|
||||
children=[
|
||||
html.H2("Contact", id="contact"),
|
||||
html.P(
|
||||
"Votre message arrivera directement dans ma boîte mail, et je reviendrai vers vous rapidement."
|
||||
),
|
||||
html.Div(
|
||||
[
|
||||
html.Label("Votre nom"),
|
||||
dcc.Input(
|
||||
id="input-name",
|
||||
type="text",
|
||||
style={"width": "100%", "padding": "8px", "margin": "8px 0"},
|
||||
),
|
||||
html.Label("Votre adresse email"),
|
||||
dcc.Input(
|
||||
id="input-email",
|
||||
type="email",
|
||||
style={"width": "100%", "padding": "8px", "margin": "8px 0"},
|
||||
),
|
||||
html.Label("Message"),
|
||||
dcc.Textarea(
|
||||
id="input-message",
|
||||
style={
|
||||
"width": "100%",
|
||||
"height": 200,
|
||||
"padding": "8px",
|
||||
"margin": "8px 0",
|
||||
},
|
||||
),
|
||||
html.Button(
|
||||
"Envoyer ",
|
||||
id="submit-button",
|
||||
n_clicks=0,
|
||||
style={"marginTop": "10px"},
|
||||
),
|
||||
html.Div(
|
||||
id="output-message", style={"marginTop": "10px", "color": "green"}
|
||||
),
|
||||
],
|
||||
style={
|
||||
"maxWidth": "600px",
|
||||
"margin": "auto",
|
||||
"padding": "20px",
|
||||
"lineHeight": "20px",
|
||||
},
|
||||
),
|
||||
dcc.Markdown("""
|
||||
- Bluesky : [@col1m.bsky.social](https://bsky.app/profile/col1m.bsky.social)
|
||||
- Mastodon : [col1m@mamot.fr](https://mamot.fr/@col1m)
|
||||
- LinkedIn : [colinmaudry](https://www.linkedin.com/in/colinmaudry/)
|
||||
- venez discuter de la transparence de la commande publique [sur le forum teamopendata.org](https://teamopendata.org/c/commande-publique/101)
|
||||
"""),
|
||||
],
|
||||
)
|
||||
|
||||
rate_limit_store = {} # {ip: last_timestamp}
|
||||
RATE_LIMIT_WINDOW = 300 # 5 minutes
|
||||
|
||||
|
||||
def is_rate_limited():
|
||||
ip = request.remote_addr
|
||||
now = time.time()
|
||||
last_time = rate_limit_store.get(ip)
|
||||
|
||||
if last_time and (now - last_time) < RATE_LIMIT_WINDOW:
|
||||
return True # rate limited !
|
||||
rate_limit_store[ip] = now # màj du timestamp
|
||||
return False
|
||||
|
||||
|
||||
def sanitize_email(email):
|
||||
return re.match(r"[^@]+@[^@]+\.[^@]+", email)
|
||||
|
||||
|
||||
@callback(
|
||||
Output("output-message", "children"),
|
||||
Input("submit-button", "n_clicks"),
|
||||
State("input-name", "value"),
|
||||
State("input-email", "value"),
|
||||
State("input-message", "value"),
|
||||
prevent_initial_call=True,
|
||||
)
|
||||
def send_email(n_clicks, form_name, form_email, form_message):
|
||||
if not all([form_name, form_email, form_message]):
|
||||
return html.Div(
|
||||
"Veuillez s'il vous plaît remplir tous les champs.", style={"color": "red"}
|
||||
)
|
||||
|
||||
client_ip = request.remote_addr
|
||||
if is_rate_limited():
|
||||
wait_time = int(RATE_LIMIT_WINDOW - (time.time() - rate_limit_store[client_ip]))
|
||||
return html.Div(
|
||||
f"⏳ J'ai mis en place une protection contre le spam, et vous m'avez écrit il y a moins de 5 minutes. "
|
||||
f"Veuillez s'il vous plaît attendre {wait_time} secondes avant de renvoyer un message.",
|
||||
style={"color": "black"},
|
||||
)
|
||||
|
||||
try:
|
||||
# Configuration du serveur SMTP
|
||||
smtp_server = os.getenv("SENDER_SERVER_DOMAIN")
|
||||
smtp_port = 587
|
||||
login_email = os.getenv("LOGIN_EMAIL")
|
||||
from_email = os.getenv("FROM_EMAIL")
|
||||
to_email = os.getenv("TO_EMAIL", from_email)
|
||||
login_password = os.getenv("LOGIN_PASSWORD")
|
||||
|
||||
print(
|
||||
smtp_server,
|
||||
smtp_port,
|
||||
login_email,
|
||||
from_email,
|
||||
to_email,
|
||||
login_password,
|
||||
sep="\n",
|
||||
)
|
||||
|
||||
# Création de l'email
|
||||
email = MIMEMultipart()
|
||||
email["From"] = from_email
|
||||
email["To"] = to_email
|
||||
email["Subject"] = f"[decp.info] Message de {form_name}"
|
||||
|
||||
body = f"""
|
||||
Nom : {form_name}
|
||||
Email : {form_email}
|
||||
|
||||
Message :
|
||||
{form_message}
|
||||
"""
|
||||
email.attach(MIMEText(body, "plain"))
|
||||
|
||||
# Send email
|
||||
server = smtplib.SMTP(smtp_server, smtp_port)
|
||||
server.starttls()
|
||||
server.login(login_email, login_password)
|
||||
server.sendmail(from_email, to_email, email.as_string())
|
||||
server.quit()
|
||||
|
||||
return html.Div("✅ Envoi réussi", style={"color": "green"})
|
||||
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return html.Div(
|
||||
f"❌ Échec de l'envoi du message : {str(e)}", style={"color": "red"}
|
||||
)
|
||||
@@ -0,0 +1,190 @@
|
||||
from datetime import datetime
|
||||
|
||||
import polars as pl
|
||||
from dash import Input, Output, callback, dcc, html, register_page
|
||||
from polars import selectors as cs
|
||||
|
||||
from src.utils import data_schema, df, format_montant, meta_content
|
||||
|
||||
register_page(
|
||||
__name__,
|
||||
path_template="/marches/<uid>",
|
||||
title=meta_content["title"],
|
||||
name="Marché",
|
||||
description=meta_content["description"],
|
||||
image_url=meta_content["image_url"],
|
||||
order=7,
|
||||
)
|
||||
|
||||
layout = [
|
||||
dcc.Store(id="marche_data"),
|
||||
dcc.Store(id="titulaires_data"),
|
||||
dcc.Location(id="url", refresh="callback-nav"),
|
||||
html.Div(
|
||||
className="container marche_infos",
|
||||
children=[
|
||||
html.P("Vous consultez un résumé des données de ce marché public"),
|
||||
html.Ul(
|
||||
[
|
||||
html.Li(
|
||||
"après son attribution aux titulaires qui l'ont remporté à la suite d'un appel d'offres (ou sans appel d'offres via une attribution directe)"
|
||||
),
|
||||
html.Li(
|
||||
"après avoir appliqué les éventuelles modifications de montant, durée ou titulaires renseignées par l'acheteur"
|
||||
),
|
||||
]
|
||||
),
|
||||
html.P(
|
||||
"Le montant total payé aux titulaires, la durée du marché et la liste des titulaires peuvent cependant encore évoluer jusqu'à la fin de l'exécution du marché."
|
||||
),
|
||||
html.Div(
|
||||
className="wrapper",
|
||||
children=[
|
||||
html.Div(
|
||||
className="marche_map",
|
||||
id="marche_map",
|
||||
children=[
|
||||
html.H4("Titulaires"),
|
||||
html.Ul(id="marche_infos_titulaires"),
|
||||
],
|
||||
),
|
||||
html.Div(className="marche_infos_1", id="marche_infos_1"),
|
||||
html.Div(className="marche_infos_2", id="marche_infos_2"),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
]
|
||||
|
||||
|
||||
@callback(
|
||||
Output("marche_data", "data"),
|
||||
Output("titulaires_data", "data"),
|
||||
Input(component_id="url", component_property="pathname"),
|
||||
)
|
||||
def get_marche_data(url) -> tuple[dict, list]:
|
||||
marche_uid = url.split("/")[-1]
|
||||
|
||||
# Récupération des données du marché à partir du df global
|
||||
lff = df.lazy()
|
||||
lff = lff.filter(pl.col("uid") == pl.lit(marche_uid))
|
||||
|
||||
# Données des titulaires du marché
|
||||
dff_titulaires = lff.select(cs.starts_with("titulaire")).collect(engine="streaming")
|
||||
|
||||
# Données du marché
|
||||
dff_marche = (
|
||||
lff.select(~cs.starts_with("titulaires")).unique().collect(engine="streaming")
|
||||
)
|
||||
dff_marche = format_montant(dff_marche)
|
||||
|
||||
assert dff_marche.height == 1
|
||||
|
||||
return dff_marche.to_dicts()[0], dff_titulaires.to_dicts()
|
||||
|
||||
|
||||
@callback(
|
||||
Output("marche_infos_1", "children"),
|
||||
Output("marche_infos_2", "children"),
|
||||
Output("marche_infos_titulaires", "children"),
|
||||
Input("marche_data", "data"),
|
||||
Input("titulaires_data", "data"),
|
||||
)
|
||||
def update_marche_info(marche, titulaires):
|
||||
def make_parameter(col):
|
||||
column_object = data_schema.get(col)
|
||||
print(column_object)
|
||||
column_name = column_object.get("title") if column_object else col
|
||||
|
||||
if marche[col]:
|
||||
if col == "acheteur_nom":
|
||||
value = html.A(
|
||||
href=f"/acheteurs/{marche['acheteur_id']}",
|
||||
children=marche["acheteur_nom"],
|
||||
)
|
||||
elif col == "sourceDataset":
|
||||
value = html.A(
|
||||
href=marche["sourceFile"], children=marche["sourceDataset"]
|
||||
)
|
||||
column_name = "Source des données"
|
||||
|
||||
# Dates
|
||||
elif col in ["dateNotification", "datePublicationDonnees"]:
|
||||
print(marche[col])
|
||||
|
||||
value = datetime.fromisoformat(marche[col]).strftime("%d/%m/%Y")
|
||||
|
||||
# Listes
|
||||
elif (
|
||||
col
|
||||
in [
|
||||
"techniques",
|
||||
"typesPrix",
|
||||
"considerationsSociales",
|
||||
"considerationsEnvironnementales",
|
||||
]
|
||||
and "," in marche[col]
|
||||
):
|
||||
col_values = marche[col].split(", ")
|
||||
lines = []
|
||||
for val in col_values:
|
||||
lines.append(html.Li(val))
|
||||
_content = html.Div(
|
||||
[html.P([column_name, " : "]), html.Ul(children=lines)]
|
||||
)
|
||||
return _content
|
||||
else:
|
||||
value = marche.get(col)
|
||||
else:
|
||||
value = ""
|
||||
|
||||
param_content = html.P([column_name, " : ", html.Strong(value)])
|
||||
return param_content
|
||||
|
||||
marche_infos = [
|
||||
make_parameter("id"),
|
||||
make_parameter("objet"),
|
||||
make_parameter("dateNotification"), # date
|
||||
make_parameter("nature"),
|
||||
make_parameter("acheteur_nom"), # lien
|
||||
make_parameter("montant"),
|
||||
make_parameter("codeCPV"),
|
||||
make_parameter("procedure"),
|
||||
make_parameter("techniques"), # list
|
||||
make_parameter("dureeMois"),
|
||||
make_parameter("offresRecues"),
|
||||
make_parameter("datePublicationDonnees"), # date
|
||||
make_parameter("formePrix"),
|
||||
make_parameter("typesPrix"), # list
|
||||
make_parameter("attributionAvance"),
|
||||
make_parameter("tauxAvance"),
|
||||
make_parameter("marcheInnovant"), # label
|
||||
make_parameter("modalitesExecution"),
|
||||
make_parameter("considerationsSociales"), # list
|
||||
make_parameter("considerationsEnvironnementales"), # list
|
||||
make_parameter("ccag"),
|
||||
make_parameter("sousTraitanceDeclaree"),
|
||||
make_parameter("typeGroupementOperateurs"),
|
||||
make_parameter("origineFrance"),
|
||||
make_parameter("origineUE"),
|
||||
make_parameter("idAccordCadre"),
|
||||
make_parameter("sourceDataset"), # lien
|
||||
]
|
||||
|
||||
half = round(len(marche_infos) / 2)
|
||||
# pas inclus pour l'instant : lieu d'exécution, modifications
|
||||
|
||||
titulaires_lines = []
|
||||
for titulaire in titulaires:
|
||||
if titulaire["titulaire_typeIdentifiant"] == "SIRET":
|
||||
content = html.Li(
|
||||
html.A(
|
||||
href=f"/titulaires/{titulaire['titulaire_id']}",
|
||||
children=titulaire["titulaire_nom"],
|
||||
)
|
||||
)
|
||||
else:
|
||||
content = html.Li(titulaire["titulaire_nom"])
|
||||
titulaires_lines.append(content)
|
||||
|
||||
return marche_infos[:half], marche_infos[half:], titulaires_lines
|
||||
@@ -0,0 +1,55 @@
|
||||
from dash import dcc, html, register_page
|
||||
|
||||
from src.figures import get_barchart_sources, get_map_count_marches
|
||||
from src.utils import df, meta_content
|
||||
|
||||
name = "Statistiques"
|
||||
|
||||
register_page(
|
||||
__name__,
|
||||
path="/statistiques",
|
||||
title=meta_content["title"],
|
||||
name=name,
|
||||
description=meta_content["description"],
|
||||
image_url=meta_content["image_url"],
|
||||
order=3,
|
||||
)
|
||||
|
||||
|
||||
layout = [
|
||||
html.Div(
|
||||
className="container",
|
||||
children=[
|
||||
html.H2(name),
|
||||
dcc.Loading(
|
||||
overlay_style={"visibility": "visible", "filter": "blur(2px)"},
|
||||
id="loading-statistques",
|
||||
type="default",
|
||||
children=[
|
||||
html.Div(
|
||||
children=[
|
||||
dcc.Markdown("""
|
||||
La publication de données essentielles de marchés publics (DECP) est souvent effectuée par
|
||||
les plateformes de marchés publics (profils d'acheteurs). Cependant, certaines plateformes ne publient pas,
|
||||
ou publient d'une manière qui rend la récupération des données compliquée. Les données présentées sur ce site
|
||||
ne représentent donc pas tous les marchés attribués en France, seulement une partie significative.
|
||||
|
||||
L'ajout de nouvelles plateformes [est en cours](https://github.com/ColinMaudry/decp-processing/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22source%20de%20donn%C3%A9es%22),
|
||||
toutes les [contributions](/a-propos#contribuer) sont les bienvenues pour atteindre l'exhaustivité.
|
||||
"""),
|
||||
dcc.Graph(figure=get_map_count_marches(df)),
|
||||
dcc.Graph(
|
||||
figure=get_barchart_sources(df, "dateNotification")
|
||||
),
|
||||
dcc.Graph(
|
||||
figure=get_barchart_sources(
|
||||
df, "datePublicationDonnees"
|
||||
)
|
||||
),
|
||||
],
|
||||
)
|
||||
],
|
||||
),
|
||||
],
|
||||
)
|
||||
]
|
||||
@@ -0,0 +1,258 @@
|
||||
import os
|
||||
from datetime import datetime
|
||||
|
||||
import polars as pl
|
||||
from dash import Input, Output, State, callback, dash_table, dcc, html, register_page
|
||||
|
||||
from src.utils import (
|
||||
add_links,
|
||||
add_resource_link,
|
||||
df,
|
||||
filter_table_data,
|
||||
format_montant,
|
||||
format_number,
|
||||
meta_content,
|
||||
setup_table_columns,
|
||||
sort_table_data,
|
||||
)
|
||||
|
||||
update_date = os.path.getmtime(os.getenv("DATA_FILE_PARQUET_PATH"))
|
||||
update_date = datetime.fromtimestamp(update_date).strftime("%d/%m/%Y")
|
||||
|
||||
schema = df.collect_schema()
|
||||
|
||||
name = "Tableau"
|
||||
register_page(
|
||||
__name__,
|
||||
path="/",
|
||||
title=meta_content["title"],
|
||||
name=name,
|
||||
description=meta_content["description"],
|
||||
image_url=meta_content["image_url"],
|
||||
order=1,
|
||||
)
|
||||
|
||||
datatable = html.Div(
|
||||
className="marches_table",
|
||||
children=dash_table.DataTable(
|
||||
cell_selectable=False,
|
||||
id="table",
|
||||
page_size=20,
|
||||
page_current=0,
|
||||
page_action="custom",
|
||||
filter_action="custom",
|
||||
filter_options={"case": "insensitive", "placeholder_text": "Filtrer..."},
|
||||
sort_action="custom",
|
||||
sort_mode="multi",
|
||||
sort_by=[],
|
||||
row_deletable=False,
|
||||
style_cell_conditional=[
|
||||
{
|
||||
"if": {"column_id": "objet"},
|
||||
"minWidth": "350px",
|
||||
"textAlign": "left",
|
||||
"overflow": "hidden",
|
||||
"lineHeight": "14px",
|
||||
"whiteSpace": "normal",
|
||||
},
|
||||
{
|
||||
"if": {"column_id": "acheteur_nom"},
|
||||
"minWidth": "250px",
|
||||
"textAlign": "left",
|
||||
"overflow": "hidden",
|
||||
"lineHeight": "14px",
|
||||
"whiteSpace": "normal",
|
||||
},
|
||||
{
|
||||
"if": {"column_id": "titulaire_nom"},
|
||||
"minWidth": "250px",
|
||||
"textAlign": "left",
|
||||
"overflow": "hidden",
|
||||
"lineHeight": "14px",
|
||||
"whiteSpace": "normal",
|
||||
},
|
||||
],
|
||||
data_timestamp=0,
|
||||
markdown_options={"html": True},
|
||||
tooltip_duration=8000,
|
||||
tooltip_delay=350,
|
||||
),
|
||||
)
|
||||
|
||||
layout = [
|
||||
html.Div(
|
||||
html.Details(
|
||||
children=[
|
||||
html.Summary(
|
||||
html.H3("Mode d'emploi", style={"text-decoration": "underline"}),
|
||||
),
|
||||
dcc.Markdown(
|
||||
"""
|
||||
##### Définition des colonnes
|
||||
|
||||
Pour voir la définition d'une colonne, passez votre souris sur son en-tête.
|
||||
|
||||
##### Filtres
|
||||
|
||||
Vous pouvez appliquer un filtre pour chaque colonne en entrant du texte sous le nom de la colonne, puis en tapant sur `Entrée`.
|
||||
|
||||
- Champs textuels : la recherche est insensible à la casse (majuscules/minuscules) et retourne les valeurs qui contiennent
|
||||
le texte recherché. Exemple : `rennes` retourne "RENNES METROPOLE".
|
||||
- Champs numériques : vous pouvez soit taper un nombre pour trouver les valeurs égales, soit le précéder de **>** ou **<** pour filtrer les valeurs supérieures ou inférieures. Exemple pour les offres reçues : `> 4` retourne les marchés ayant reçu plus de 4 offres.
|
||||
- Champs date : vous pouvez également utiliser **>** ou **<**. Exemples : `< 2024-01-31` pour "avant le 31 janvier 2024",
|
||||
`2024` pour "en 2024", `> 2022` pour "à partir de 2022"
|
||||
|
||||
Vous pouvez filtrer plusieurs colonnes à la fois. Vos filtres sont remis à zéro quand vous rafraîchissez la page.
|
||||
|
||||
##### Tri
|
||||
|
||||
Pour trier une colonne, utilisez les flèches grises à côté des noms de colonnes. Chaque clic change le tri dans cet ordre : tri ascendant, tri descendant, pas de tri.
|
||||
|
||||
##### Télécharger le résultat
|
||||
|
||||
Vous pouvez télécharger le résultat de vos filtres et tris, pour les colonnes affichées, en cliquant sur **Télécharger au format Excel**.
|
||||
|
||||
##### Liens
|
||||
|
||||
Les liens dans les colonnes Identifiant unique, Acheteur et Titulaire vous permettent de consulter une vue qui leur est dédiée
|
||||
(informations, marchés attribués/remportés, etc.)
|
||||
|
||||
"""
|
||||
),
|
||||
],
|
||||
id="instructions",
|
||||
),
|
||||
id="header",
|
||||
),
|
||||
# html.Div(
|
||||
# [
|
||||
# "Recherche dans objet : ",
|
||||
# dcc.Input(id="search", value="", type="text"),
|
||||
# ]
|
||||
# )]),
|
||||
dcc.Loading(
|
||||
overlay_style={"visibility": "visible", "filter": "blur(2px)"},
|
||||
id="loading-home",
|
||||
type="default",
|
||||
children=[
|
||||
html.Div(
|
||||
[
|
||||
html.P("lignes", id="nb_rows"),
|
||||
html.Button(
|
||||
"Téléchargement désactivé au-delà de 65 000 lignes",
|
||||
id="btn-download-data",
|
||||
disabled=True,
|
||||
),
|
||||
dcc.Download(id="download-data"),
|
||||
dcc.Store(id="filtered_data", storage_type="memory"),
|
||||
html.P("Données mises à jour le " + str(update_date)),
|
||||
],
|
||||
className="table-menu",
|
||||
),
|
||||
datatable,
|
||||
],
|
||||
),
|
||||
]
|
||||
|
||||
|
||||
@callback(
|
||||
Output("table", "data"),
|
||||
Output("table", "columns"),
|
||||
Output("table", "tooltip_header"),
|
||||
Output("table", "data_timestamp"),
|
||||
Output("nb_rows", "children"),
|
||||
Output("btn-download-data", "disabled"),
|
||||
Output("btn-download-data", "children"),
|
||||
Output("btn-download-data", "title"),
|
||||
Input("table", "page_current"),
|
||||
Input("table", "page_size"),
|
||||
Input("table", "filter_query"),
|
||||
Input("table", "sort_by"),
|
||||
State("table", "data_timestamp"),
|
||||
)
|
||||
def update_table(page_current, page_size, filter_query, sort_by, data_timestamp):
|
||||
if os.getenv("DEVELOPMENT").lower() == "true":
|
||||
print(" + + + + + + + + + + + + + + + + + + ")
|
||||
|
||||
# Application des filtres
|
||||
lff: pl.LazyFrame = df.lazy() # start from the original data
|
||||
if filter_query:
|
||||
lff = filter_table_data(lff, filter_query)
|
||||
|
||||
if len(sort_by) > 0:
|
||||
lff = sort_table_data(lff, sort_by)
|
||||
|
||||
# Remplace les strings null par "", mais pas les numeric null
|
||||
lff = lff.fill_null("")
|
||||
|
||||
# Matérialisation des filtres
|
||||
dff: pl.DataFrame = lff.collect()
|
||||
|
||||
height = dff.height
|
||||
nb_rows = f"{format_number(height)} lignes ({format_number(dff.select('uid').unique().height)} marchés)"
|
||||
|
||||
# Pagination des données
|
||||
start_row = page_current * page_size
|
||||
# end_row = (page_current + 1) * page_size
|
||||
dff = dff.slice(start_row, page_size)
|
||||
|
||||
# Ajout des liens vers l'annuaire des entreprises
|
||||
dff = add_links(dff)
|
||||
|
||||
# Ajout des liens vers les fichiers Open Data
|
||||
dff = add_resource_link(dff)
|
||||
|
||||
# Formatage des montants
|
||||
dff = format_montant(dff)
|
||||
|
||||
columns, tooltip = setup_table_columns(dff)
|
||||
|
||||
dicts = dff.to_dicts()
|
||||
|
||||
if height > 65000:
|
||||
download_disabled = True
|
||||
download_text = "Téléchargement désactivé au-delà de 65 000 lignes"
|
||||
download_title = "Excel ne supporte pas d'avoir plus de 65 000 URLs dans une même feuille de calcul. Contactez-moi pour me présenter votre besoin en téléchargement afin que je puisse adapter la solution."
|
||||
else:
|
||||
download_disabled = False
|
||||
download_text = "Télécharger au format Excel"
|
||||
download_title = ""
|
||||
|
||||
return (
|
||||
dicts,
|
||||
columns,
|
||||
tooltip,
|
||||
data_timestamp + 1,
|
||||
nb_rows,
|
||||
download_disabled,
|
||||
download_text,
|
||||
download_title,
|
||||
)
|
||||
|
||||
|
||||
@callback(
|
||||
Output("download-data", "data"),
|
||||
Input("btn-download-data", "n_clicks"),
|
||||
State("table", "filter_query"),
|
||||
State("table", "sort_by"),
|
||||
State("table", "hidden_columns"),
|
||||
prevent_initial_call=True,
|
||||
)
|
||||
def download_data(n_clicks, filter_query, sort_by, hidden_columns: list = None):
|
||||
lff: pl.LazyFrame = df # start from the original data
|
||||
|
||||
# Les colonnes masquées sont supprimées
|
||||
if hidden_columns:
|
||||
lff = lff.drop(hidden_columns)
|
||||
|
||||
if filter_query:
|
||||
lff = filter_table_data(lff, filter_query)
|
||||
|
||||
if len(sort_by) > 0:
|
||||
lff = sort_table_data(lff, sort_by)
|
||||
|
||||
def to_bytes(buffer):
|
||||
lff.collect(engine="streaming").write_excel(buffer, worksheet="DECP")
|
||||
|
||||
date = datetime.now().strftime("%Y-%m-%d_%H:%M:%S")
|
||||
return dcc.send_bytes(to_bytes, filename=f"decp_{date}.xlsx")
|
||||
@@ -0,0 +1,290 @@
|
||||
import datetime
|
||||
|
||||
import polars as pl
|
||||
from dash import Input, Output, State, callback, dash_table, dcc, html, register_page
|
||||
|
||||
from src.figures import point_on_map
|
||||
from src.utils import (
|
||||
add_links_in_dict,
|
||||
df,
|
||||
format_montant,
|
||||
format_number,
|
||||
get_annuaire_data,
|
||||
get_departement_region,
|
||||
meta_content,
|
||||
setup_table_columns,
|
||||
)
|
||||
|
||||
register_page(
|
||||
__name__,
|
||||
path_template="/titulaires/<titulaire_id>",
|
||||
title=meta_content["title"],
|
||||
name="Titulaire",
|
||||
description=meta_content["description"],
|
||||
image_url=meta_content["image_url"],
|
||||
order=5,
|
||||
)
|
||||
|
||||
# 21690123100011
|
||||
|
||||
layout = [
|
||||
dcc.Store(id="titulaire_data", storage_type="memory"),
|
||||
dcc.Location(id="url", refresh="callback-nav"),
|
||||
html.Div(
|
||||
className="container",
|
||||
children=[
|
||||
html.Div(
|
||||
className="wrapper",
|
||||
children=[
|
||||
html.H2(
|
||||
className="org_title",
|
||||
children=[
|
||||
html.Span(id="titulaire_siret"),
|
||||
" - ",
|
||||
html.Span(id="titulaire_nom"),
|
||||
],
|
||||
),
|
||||
html.Div(
|
||||
className="org_year",
|
||||
children=dcc.Dropdown(
|
||||
id="titulaire_year",
|
||||
options=["Toutes"]
|
||||
+ [
|
||||
str(year)
|
||||
for year in range(
|
||||
2018, int(datetime.date.today().year) + 1
|
||||
)
|
||||
],
|
||||
placeholder="Année",
|
||||
),
|
||||
),
|
||||
html.Div(
|
||||
className="org_infos",
|
||||
children=[
|
||||
# TODO: ajouter le type d'acheteur : commune, CD, CR, etc.
|
||||
html.P(["Commune : ", html.Strong(id="titulaire_commune")]),
|
||||
html.P(
|
||||
[
|
||||
"Département : ",
|
||||
html.Strong(id="titulaire_departement"),
|
||||
]
|
||||
),
|
||||
html.P(["Région : ", html.Strong(id="titulaire_region")]),
|
||||
html.A(
|
||||
id="titulaire_lien_annuaire",
|
||||
children="Plus de détails sur l'Annuaire des entreprises",
|
||||
target="_blank",
|
||||
),
|
||||
],
|
||||
),
|
||||
html.Div(
|
||||
className="org_stats",
|
||||
children=[
|
||||
html.P(id="titulaire_titre_stats"),
|
||||
html.P(id="titulaire_marches_remportes"),
|
||||
html.P(id="titulaire_acheteurs_differents"),
|
||||
html.Button(
|
||||
"Téléchargement au format Excel",
|
||||
id="btn-download-titulaire-data",
|
||||
),
|
||||
dcc.Download(id="download-titulaire-data"),
|
||||
],
|
||||
),
|
||||
html.Div(className="org_map", id="titulaire_map"),
|
||||
],
|
||||
),
|
||||
# récupérer les données de l'acheteur sur l'api annuaire
|
||||
html.H3("Derniers marchés publics remportés"),
|
||||
html.Div(id="titulaire_last_marches", children=""),
|
||||
],
|
||||
),
|
||||
]
|
||||
|
||||
|
||||
@callback(
|
||||
Output(component_id="titulaire_siret", component_property="children"),
|
||||
Output(component_id="titulaire_nom", component_property="children"),
|
||||
Output(component_id="titulaire_commune", component_property="children"),
|
||||
Output(component_id="titulaire_map", component_property="children"),
|
||||
Output(component_id="titulaire_departement", component_property="children"),
|
||||
Output(component_id="titulaire_region", component_property="children"),
|
||||
Output(component_id="titulaire_lien_annuaire", component_property="href"),
|
||||
Input(component_id="url", component_property="pathname"),
|
||||
)
|
||||
def update_titulaire_infos(url):
|
||||
titulaire_siret = url.split("/")[-1]
|
||||
if len(titulaire_siret) != 14:
|
||||
titulaire_siret = (
|
||||
f"Le SIRET renseigné doit faire 14 caractères ({titulaire_siret})"
|
||||
)
|
||||
data = get_annuaire_data(titulaire_siret)
|
||||
data_etablissement = data["matching_etablissements"][0]
|
||||
titulaire_map = point_on_map(
|
||||
data_etablissement["latitude"], data_etablissement["longitude"]
|
||||
)
|
||||
code_departement, nom_departement, nom_region = get_departement_region(
|
||||
data_etablissement["code_postal"]
|
||||
)
|
||||
departement = f"{nom_departement} ({code_departement})"
|
||||
lien_annuaire = (
|
||||
f"https://annuaire-entreprises.data.gouv.fr/etablissement/{titulaire_siret}"
|
||||
)
|
||||
return (
|
||||
titulaire_siret,
|
||||
data["nom_raison_sociale"],
|
||||
data_etablissement["libelle_commune"],
|
||||
titulaire_map,
|
||||
departement,
|
||||
nom_region,
|
||||
lien_annuaire,
|
||||
)
|
||||
|
||||
|
||||
@callback(
|
||||
Output(component_id="titulaire_marches_remportes", component_property="children"),
|
||||
Output(
|
||||
component_id="titulaire_acheteurs_differents", component_property="children"
|
||||
),
|
||||
Input(component_id="titulaire_data", component_property="data"),
|
||||
)
|
||||
def update_titulaire_stats(data):
|
||||
dff = pl.DataFrame(data)
|
||||
if dff.height == 0:
|
||||
dff = pl.DataFrame(schema=dff.collect_schema())
|
||||
df_marches = dff.unique("uid")
|
||||
nb_marches = format_number(df_marches.height)
|
||||
# somme_marches = format_number(int(df_marches.select(pl.sum("montant")).item()))
|
||||
marches_remportes = [html.Strong(nb_marches), " marchés et accord-cadres remportés"]
|
||||
# + ", pour un total de ", html.Strong(somme_marches + " €")]
|
||||
del df_marches
|
||||
|
||||
nb_acheteurs = dff.unique("acheteur_id").height
|
||||
nb_acheteurs = [
|
||||
html.Strong(format_number(nb_acheteurs)),
|
||||
" titulaires (SIRET) différents",
|
||||
]
|
||||
del dff
|
||||
|
||||
return marches_remportes, nb_acheteurs
|
||||
|
||||
|
||||
@callback(
|
||||
Output(component_id="titulaire_data", component_property="data"),
|
||||
Input(component_id="url", component_property="pathname"),
|
||||
Input(component_id="titulaire_year", component_property="value"),
|
||||
)
|
||||
def get_titulaire_marches_data(url, titulaire_year: str) -> list[dict]:
|
||||
titulaire_siret = url.split("/")[-1]
|
||||
lff = df.lazy()
|
||||
lff = lff.filter(
|
||||
(pl.col("titulaire_id") == titulaire_siret)
|
||||
& (pl.col("titulaire_typeIdentifiant") == "SIRET")
|
||||
)
|
||||
lff = lff.fill_null("")
|
||||
lff = lff.select(
|
||||
"id",
|
||||
"uid",
|
||||
"objet",
|
||||
"dateNotification",
|
||||
"acheteur_id",
|
||||
"acheteur_nom",
|
||||
"montant",
|
||||
"codeCPV",
|
||||
"dureeMois",
|
||||
)
|
||||
if titulaire_year and titulaire_year != "Toutes":
|
||||
lff = lff.filter(
|
||||
pl.col("dateNotification").cast(pl.String).str.starts_with(titulaire_year)
|
||||
)
|
||||
lff = lff.sort(["dateNotification", "uid"], descending=True, nulls_last=True)
|
||||
|
||||
data = lff.collect(engine="streaming").to_dicts()
|
||||
return data
|
||||
|
||||
|
||||
@callback(
|
||||
Output(component_id="titulaire_last_marches", component_property="children"),
|
||||
Input(component_id="titulaire_data", component_property="data"),
|
||||
)
|
||||
def get_last_marches_table(data) -> html.Div:
|
||||
columns = [
|
||||
"uid",
|
||||
"objet",
|
||||
"dateNotification",
|
||||
"acheteur_nom",
|
||||
"montant",
|
||||
"codeCPV",
|
||||
"dureeMois",
|
||||
]
|
||||
|
||||
dff = pl.DataFrame(data)
|
||||
dff = format_montant(dff)
|
||||
columns, tooltip = setup_table_columns(
|
||||
dff, hideable=False, exclude=["acheteur_id", "id"]
|
||||
)
|
||||
data = dff.to_dicts()
|
||||
# Idéalement on utiliserait add_org_links(), mais le résultat attendu
|
||||
# est différent de home.py (Tableau)
|
||||
data = add_links_in_dict(data, "acheteur")
|
||||
|
||||
table = html.Div(
|
||||
className="marches_table",
|
||||
id="titulaire_datatable",
|
||||
children=dash_table.DataTable(
|
||||
data=data,
|
||||
markdown_options={"html": True},
|
||||
page_action="native",
|
||||
filter_action="native",
|
||||
filter_options={"case": "insensitive", "placeholder_text": "Filtrer..."},
|
||||
columns=columns,
|
||||
tooltip_header=tooltip,
|
||||
tooltip_duration=8000,
|
||||
tooltip_delay=350,
|
||||
cell_selectable=False,
|
||||
page_size=10,
|
||||
style_cell_conditional=[
|
||||
{
|
||||
"if": {"column_id": "objet"},
|
||||
"minWidth": "300px",
|
||||
"textAlign": "left",
|
||||
"overflow": "hidden",
|
||||
"lineHeight": "14px",
|
||||
"whiteSpace": "normal",
|
||||
},
|
||||
{
|
||||
"if": {"column_id": "acheteur_nom"},
|
||||
"maxWidth": "400px",
|
||||
"textAlign": "left",
|
||||
"overflow": "hidden",
|
||||
"lineHeight": "18px",
|
||||
"whiteSpace": "normal",
|
||||
},
|
||||
],
|
||||
),
|
||||
)
|
||||
return table
|
||||
|
||||
|
||||
@callback(
|
||||
Output("download-titulaire-data", "data"),
|
||||
Input("btn-download-titulaire-data", "n_clicks"),
|
||||
State(component_id="titulaire_data", component_property="data"),
|
||||
State(component_id="titulaire_nom", component_property="children"),
|
||||
State(component_id="titulaire_year", component_property="value"),
|
||||
prevent_initial_call=True,
|
||||
)
|
||||
def download_titulaire_data(
|
||||
n_clicks,
|
||||
data: [dict],
|
||||
titulaire_nom: str,
|
||||
annee: str,
|
||||
):
|
||||
df_to_download = pl.DataFrame(data)
|
||||
|
||||
def to_bytes(buffer):
|
||||
df_to_download.write_excel(
|
||||
buffer, worksheet="DECP" if annee in ["Toutes", None] else annee
|
||||
)
|
||||
|
||||
date = datetime.datetime.now().strftime("%Y-%m-%d_%H:%M:%S")
|
||||
return dcc.send_bytes(to_bytes, filename=f"decp_{titulaire_nom}_{date}.xlsx")
|
||||
@@ -0,0 +1,338 @@
|
||||
import json
|
||||
import logging
|
||||
import os
|
||||
from time import sleep
|
||||
|
||||
import polars as pl
|
||||
import polars.selectors as cs
|
||||
from httpx import get
|
||||
from polars.exceptions import ComputeError
|
||||
|
||||
operators = [
|
||||
["s<", "<"],
|
||||
["s>", ">"],
|
||||
["i<", "<"],
|
||||
["i>", ">"],
|
||||
["icontains", "contains"],
|
||||
]
|
||||
|
||||
logger = logging.getLogger("decp.info")
|
||||
logging.basicConfig(
|
||||
format="%(asctime)s %(levelname)-8s %(message)s",
|
||||
level=logging.INFO,
|
||||
datefmt="%Y-%m-%d %H:%M:%S",
|
||||
)
|
||||
|
||||
|
||||
def split_filter_part(filter_part):
|
||||
print("filter part", filter_part)
|
||||
for operator_group in operators:
|
||||
if operator_group[0] in filter_part:
|
||||
name_part, value_part = filter_part.split(operator_group[0], 1)
|
||||
name_part = name_part.strip()
|
||||
value = value_part.strip()
|
||||
name = name_part[name_part.find("{") + 1 : name_part.rfind("}")]
|
||||
print("=>", name, operator_group[1], value)
|
||||
|
||||
return name, operator_group[1], value
|
||||
|
||||
return [None] * 3
|
||||
|
||||
|
||||
def add_resource_link(dff: pl.DataFrame) -> pl.DataFrame:
|
||||
dff = dff.with_columns(
|
||||
(
|
||||
'<a href="' + pl.col("sourceFile") + '">' + pl.col("sourceDataset") + "</a>"
|
||||
).alias("sourceDataset")
|
||||
)
|
||||
dff = dff.drop(["sourceFile"])
|
||||
return dff
|
||||
|
||||
|
||||
def add_links(dff: pl.DataFrame):
|
||||
dff = dff.with_columns(
|
||||
pl.when(pl.col("titulaire_typeIdentifiant") == "SIRET")
|
||||
.then(
|
||||
'<a href = "/titulaires/'
|
||||
+ pl.col("titulaire_id")
|
||||
+ '">'
|
||||
+ pl.col("titulaire_id")
|
||||
+ "</a>"
|
||||
)
|
||||
.otherwise(pl.col("titulaire_id"))
|
||||
.alias("titulaire_id")
|
||||
)
|
||||
|
||||
for column, path in [("acheteur_id", "acheteurs"), ("uid", "marches")]:
|
||||
dff = dff.with_columns(
|
||||
(
|
||||
f'<a href = "/{path}/'
|
||||
+ pl.col(column)
|
||||
+ '" target="_blank">'
|
||||
+ pl.col(column)
|
||||
+ "</a>"
|
||||
).alias(column)
|
||||
)
|
||||
return dff
|
||||
|
||||
|
||||
def add_links_in_dict(data: list, org_type: str) -> list:
|
||||
new_data = []
|
||||
for marche in data:
|
||||
org_id = marche[org_type + "_id"]
|
||||
marche[org_type + "_nom"] = (
|
||||
f'<a href="/{org_type}s/{org_id}">{marche[org_type + "_nom"]}</a>'
|
||||
)
|
||||
marche["id"] = f'<a href="/marches/{marche["uid"]}">{marche["id"]}</a>'
|
||||
marche["uid"] = f'<a href="/marches/{marche["uid"]}">{marche["uid"]}</a>'
|
||||
new_data.append(marche)
|
||||
return new_data
|
||||
|
||||
|
||||
def booleans_to_strings(lff: pl.LazyFrame) -> pl.LazyFrame:
|
||||
"""
|
||||
Convert all boolean columns to string type.
|
||||
"""
|
||||
lff = lff.with_columns(
|
||||
pl.col(cs.Boolean)
|
||||
.cast(pl.String)
|
||||
.str.replace("true", "oui")
|
||||
.str.replace("false", "non")
|
||||
)
|
||||
return lff
|
||||
|
||||
|
||||
def numbers_to_strings(lff: pl.LazyFrame) -> pl.LazyFrame:
|
||||
"""
|
||||
Convert all numeric columns to string type.
|
||||
"""
|
||||
lff = lff.with_columns(pl.col(pl.Float64, pl.Int16).cast(pl.String).fill_null(""))
|
||||
return lff
|
||||
|
||||
|
||||
def dates_to_strings(lff: pl.LazyFrame, column: str) -> pl.LazyFrame:
|
||||
"""
|
||||
Convert a date column to string type.
|
||||
"""
|
||||
lff = lff.with_columns(pl.col(column).cast(pl.String).fill_null(""))
|
||||
return lff
|
||||
|
||||
|
||||
def format_number(number) -> str:
|
||||
number = "{:,}".format(number).replace(",", " ")
|
||||
return number
|
||||
|
||||
|
||||
def format_montant(dff: pl.DataFrame) -> pl.DataFrame:
|
||||
def format_function(expr, scale=None):
|
||||
# https://stackoverflow.com/a/78636786
|
||||
expr = expr.cast(pl.String).str.splitn(".", 2)
|
||||
|
||||
num = expr.struct[0]
|
||||
frac = expr.struct[1]
|
||||
|
||||
# Ajout des espaces
|
||||
num = (
|
||||
num.str.reverse()
|
||||
.str.replace_all(r"\d{3}", "$0 ")
|
||||
.str.reverse()
|
||||
.str.replace(r"^ ", "")
|
||||
)
|
||||
|
||||
frac: pl.Expr = (
|
||||
pl.when(frac.is_not_null() & ~frac.is_in(["0"]))
|
||||
.then("," + frac)
|
||||
.otherwise(pl.lit(""))
|
||||
)
|
||||
|
||||
return num + frac + pl.lit(" €")
|
||||
|
||||
dff = dff.with_columns(pl.col("montant").pipe(format_function).alias("montant"))
|
||||
return dff
|
||||
|
||||
|
||||
def get_annuaire_data(siret: str) -> dict:
|
||||
url = f"https://recherche-entreprises.api.gouv.fr/search?q={siret}"
|
||||
response = get(url)
|
||||
return response.json()["results"][0]
|
||||
|
||||
|
||||
def get_decp_data() -> pl.DataFrame:
|
||||
# Chargement du fichier parquet
|
||||
# Le fichier est chargé en mémoire, ce qui est plus rapide qu'une base de données pour le moment.
|
||||
# On utilise polars pour la rapidité et la facilité de manipulation des données.
|
||||
|
||||
try:
|
||||
logger.info(
|
||||
f"Lecture du fichier parquet ({os.getenv('DATA_FILE_PARQUET_PATH')})..."
|
||||
)
|
||||
lff: pl.LazyFrame = pl.scan_parquet(os.getenv("DATA_FILE_PARQUET_PATH"))
|
||||
except ComputeError:
|
||||
# Le fichier est probablement en cours de mise à jour
|
||||
logger.info("Échec, nouvelle tentative dans 10s...")
|
||||
sleep(10)
|
||||
lff: pl.LazyFrame = pl.scan_parquet(os.getenv("DATA_FILE_PARQUET_PATH"))
|
||||
|
||||
# Tri des marchés par date de notification
|
||||
lff = lff.sort(by=["dateNotification", "uid"], descending=True, nulls_last=True)
|
||||
|
||||
# Uniquement les données actuelles, pas les anciennes versions de marchés
|
||||
lff = lff.filter(pl.col("donneesActuelles")).drop("donneesActuelles")
|
||||
|
||||
# Convertir les colonnes booléennes en chaînes de caractères
|
||||
lff = booleans_to_strings(lff)
|
||||
|
||||
# Bizarrement je ne peux pas faire lff = lff.fill_null("") ici
|
||||
# ça génère une erreur dans la page acheteur (acheteur_data.table) :
|
||||
# AttributeError: partially initialized module 'pandas' has no attribute 'NaT' (most likely due to a circular import)
|
||||
|
||||
return lff.collect()
|
||||
|
||||
|
||||
def get_departements() -> dict:
|
||||
with open("data/departements.json", "rb") as f:
|
||||
data = json.load(f)
|
||||
return data
|
||||
|
||||
|
||||
def get_departement_region(code_postal):
|
||||
if code_postal > "97000":
|
||||
code_departement = code_postal[:3]
|
||||
else:
|
||||
code_departement = code_postal[:2]
|
||||
nom_departement = departements[code_departement]["departement"]
|
||||
nom_region = departements[code_departement]["region"]
|
||||
return code_departement, nom_departement, nom_region
|
||||
|
||||
|
||||
def filter_table_data(lff: pl.LazyFrame, filter_query: str) -> pl.LazyFrame:
|
||||
debug = os.getenv("DEVELOPMENT", "False").lower() == "true"
|
||||
schema = lff.collect_schema()
|
||||
filtering_expressions = filter_query.split(" && ")
|
||||
for filter_part in filtering_expressions:
|
||||
col_name, operator, filter_value = split_filter_part(filter_part)
|
||||
|
||||
col_type = str(schema[col_name])
|
||||
if debug:
|
||||
print("filter_value:", filter_value)
|
||||
print("filter_value_type:", type(filter_value))
|
||||
print("col_type:", col_type)
|
||||
|
||||
if col_type == "Date":
|
||||
# Convertir la colonne en chaînes de caractères
|
||||
lff = dates_to_strings(lff, col_name)
|
||||
|
||||
if operator in ("<", "<=", ">", ">="):
|
||||
lff = lff.filter(
|
||||
pl.col(col_name).is_not_null() & (pl.col(col_name) != pl.lit(""))
|
||||
)
|
||||
if operator == "<":
|
||||
lff = lff.filter(pl.col(col_name) < filter_value)
|
||||
elif operator == ">":
|
||||
lff = lff.filter(pl.col(col_name) > filter_value)
|
||||
elif operator == ">=":
|
||||
lff = lff.filter(pl.col(col_name) >= filter_value)
|
||||
elif operator == "<=":
|
||||
lff = lff.filter(pl.col(col_name) <= filter_value)
|
||||
|
||||
elif col_type.startswith("Int") or col_type.startswith("Float"):
|
||||
try:
|
||||
filter_value = int(filter_value)
|
||||
except ValueError:
|
||||
logger.error(f"Invalid numeric filter value: {filter_value}")
|
||||
continue
|
||||
lff = lff.filter(pl.col(col_name) == filter_value)
|
||||
|
||||
elif operator == "contains" and col_type in ["String", "Date"]:
|
||||
lff = lff.filter(pl.col(col_name).str.contains("(?i)" + filter_value))
|
||||
|
||||
# elif operator == 'datestartswith':
|
||||
# lff = lff.filter(pl.col(col_name).str.startswith(filter_value)")
|
||||
|
||||
return lff
|
||||
|
||||
|
||||
def sort_table_data(lff: pl.LazyFrame, sort_by: list) -> pl.LazyFrame:
|
||||
lff = lff.sort(
|
||||
[col["column_id"] for col in sort_by],
|
||||
descending=[col["direction"] == "desc" for col in sort_by],
|
||||
nulls_last=True,
|
||||
)
|
||||
print(sort_by)
|
||||
return lff
|
||||
|
||||
|
||||
def setup_table_columns(dff, hideable: bool = True, exclude: list = None) -> tuple:
|
||||
# Liste finale de colonnes
|
||||
columns = []
|
||||
tooltip = {}
|
||||
for column_id in dff.columns:
|
||||
if exclude and column_id in exclude:
|
||||
continue
|
||||
column_object = data_schema.get(column_id)
|
||||
if column_object:
|
||||
column_name = column_object.get("title", column_id)
|
||||
else:
|
||||
column_name = column_id
|
||||
|
||||
column = {
|
||||
"name": column_name,
|
||||
"id": column_id,
|
||||
"presentation": "markdown",
|
||||
"type": "text",
|
||||
"format": {"nully": "N/A"},
|
||||
"hideable": hideable,
|
||||
}
|
||||
columns.append(column)
|
||||
|
||||
if column_object:
|
||||
tooltip[column_id] = {
|
||||
"value": f"""**{column_object.get("title")}** ({column_id})
|
||||
|
||||
"""
|
||||
+ column_object["description"],
|
||||
"type": "markdown",
|
||||
}
|
||||
return columns, tooltip
|
||||
|
||||
|
||||
def get_data_schema() -> dict:
|
||||
# Récupération du schéma des données tabulaires
|
||||
path = os.getenv("DATA_SCHEMA_PATH")
|
||||
if path.startswith("http"):
|
||||
original_schema: dict = get(
|
||||
os.getenv("DATA_SCHEMA_PATH"), follow_redirects=True
|
||||
).json()
|
||||
elif os.path.exists(path):
|
||||
with open(path) as f:
|
||||
original_schema: dict = json.load(f)
|
||||
else:
|
||||
raise Exception(f"Chemin vers le schéma invalide: {path}")
|
||||
|
||||
new_schema = {}
|
||||
|
||||
for col in original_schema["fields"]:
|
||||
new_schema[col["name"]] = col
|
||||
|
||||
new_schema["sourceDataset"] = {
|
||||
"description": "Code de la source des données, avec un lien vers le fichier Open Data dont proviennent les données de ce marché public.",
|
||||
"title": "Source des données",
|
||||
"short_name": "Source",
|
||||
}
|
||||
return new_schema
|
||||
|
||||
|
||||
df: pl.DataFrame = get_decp_data()
|
||||
departements = get_departements()
|
||||
domain_name = (
|
||||
"test.decp.info" if os.getenv("DEVELOPMENT").lower() == "true" else "decp.info"
|
||||
)
|
||||
meta_content = {
|
||||
"image_url": f"https://{domain_name}/assets/decp.info.png",
|
||||
"title": "decp.info - exploration des marchés publics français",
|
||||
"description": (
|
||||
"Explorez et analysez les données des marchés publics français avec cet outil libre et gratuit. "
|
||||
"Pour une commande publique accessible à toutes et tous."
|
||||
),
|
||||
}
|
||||
data_schema = get_data_schema()
|
||||