pax_global_header00006660000000000000000000000064141544205010014506gustar00rootroot0000000000000052 comment=ae93b9feaeb2188aecf6f18ab0a1eadd2d4a0649 django-allauth-0.47.0/000077500000000000000000000000001415442050100144705ustar00rootroot00000000000000django-allauth-0.47.0/.dir-locals.el000066400000000000000000000001501415442050100171150ustar00rootroot00000000000000;;; This file contains project-specific emacs configuration ((nil . ((python-sort-imports-on-save t)))) django-allauth-0.47.0/.editorconfig000066400000000000000000000005231415442050100171450ustar00rootroot00000000000000# http://editorconfig.org root = true [*] charset = utf-8 indent_style = space indent_size = 2 end_of_line = lf insert_final_newline = true trim_trailing_whitespace = true [*.ini] indent_size = 4 [*.py] indent_size = 4 [Makefile] indent_style = tab indent_size = 8 [*.md] insert_final_newline = false trim_trailing_whitespace = false django-allauth-0.47.0/.github/000077500000000000000000000000001415442050100160305ustar00rootroot00000000000000django-allauth-0.47.0/.github/FUNDING.yml000066400000000000000000000012021415442050100176400ustar00rootroot00000000000000# These are supported funding model platforms github: pennersr 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 otechie: # Replace with a single Otechie username custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] django-allauth-0.47.0/.github/pull_request_template.md000066400000000000000000000016211415442050100227710ustar00rootroot00000000000000# Submitting Pull Requests ## General - [ ] Make sure you use [semantic commit messages](https://seesparkbox.com/foundry/semantic_commit_messages). Examples: `"fix(google): Fixed foobar bug"`, `"feat(accounts): Added foobar feature"`. - [ ] All Python code must formatted using Black, and clean from pep8 and isort issues. - [ ] JavaScript code should adhere to [StandardJS](https://standardjs.com). - [ ] If your changes are significant, please update `ChangeLog.rst`. - [ ] If your change is substantial, feel free to add yourself to `AUTHORS`. ## Provider Specifics In case you add a new provider: - [ ] Make sure unit tests are available. - [ ] Add an entry of your provider in `test_settings.py::INSTALLED_APPS` and `docs/installation.rst::INSTALLED_APPS`. - [ ] Add documentation to `docs/providers.rst`. - [ ] Add an entry to the list of supported providers over at `docs/overview.rst`. django-allauth-0.47.0/.github/workflows/000077500000000000000000000000001415442050100200655ustar00rootroot00000000000000django-allauth-0.47.0/.github/workflows/ci.yml000066400000000000000000000047621415442050100212140ustar00rootroot00000000000000name: CI on: push: branches: [ master ] pull_request: branches: [ master ] jobs: testenv: runs-on: ubuntu-latest strategy: fail-fast: false matrix: python-version: ['3.5', '3.6', '3.7', '3.8', '3.9'] django-version: ['master', '2.0', '2.1', '2.2', '3.0', '3.1', '3.2', '4.0'] exclude: - python-version: '3.8' django-version: '2.0' - python-version: '3.9' django-version: '2.0' - python-version: '3.8' django-version: '2.1' - python-version: '3.9' django-version: '2.1' - python-version: '3.5' django-version: '3.0' - python-version: '3.5' django-version: '3.1' - python-version: '3.5' django-version: '3.2' - python-version: '3.5' django-version: '4.0' - python-version: '3.6' django-version: '4.0' - python-version: '3.7' django-version: '4.0' - python-version: '3.5' django-version: 'master' - python-version: '3.6' django-version: 'master' - python-version: '3.7' django-version: 'master' - python-version: '3.8' django-version: 'master' steps: - uses: actions/checkout@v2 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v2 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: | python -m pip install --upgrade pip pip install tox tox-gh-actions coveralls - name: Tox Test run: tox env: PYTHON_VER: ${{ matrix.python-version }} DJANGO: ${{ matrix.django-version }} - name: Coverage (Coveralls) if: ${{ success() }} run: coveralls --service=github env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} extra: runs-on: ubuntu-latest strategy: matrix: extra-env: ['docs', 'checkqa', 'standardjs'] steps: - uses: actions/checkout@v2 - uses: actions/setup-node@v2 if: ${{ matrix.extra-env == 'standardjs' }} with: node-version: '8' - name: Set up Python 3.7 uses: actions/setup-python@v2 with: python-version: '3.7' - name: Install dependencies run: | python -m pip install --upgrade pip pip install tox - name: Tox Test run: tox env: TOXENV: ${{ matrix.extra-env }} django-allauth-0.47.0/.gitignore000066400000000000000000000004461415442050100164640ustar00rootroot00000000000000*.pyc *~ .idea .project .pydevproject *.geany docs/_build build dist *.egg* example/local_settings.py node_modules/ # Unit test / coverage reports htmlcov/ .tox/ .coverage .coverage.* coverage.xml .ropeproject/* pep8.txt *.bak .#* \#* *.db *.tmp virtualenv .DS_Store *.prefs *.mo /.stfolder django-allauth-0.47.0/.isort.cfg000066400000000000000000000004171415442050100163710ustar00rootroot00000000000000[settings] indent=4 combine_star=1 combine_as_imports=1 include_trailing_comma=1 multi_line_output=3 lines_after_imports=2 known_django=django extra_standard_library=types,requests known_first_party=allauth sections=FUTURE,STDLIB,DJANGO,THIRDPARTY,FIRSTPARTY,LOCALFOLDER django-allauth-0.47.0/AUTHORS000066400000000000000000000050641415442050100155450ustar00rootroot00000000000000django-allauth was started by Raymond Penners ( or @pennersr) in October 2010, inspired by and partly based on existing projects such as Pinax (account app), Django-Socialauth, django-socialregistration. Contributors ============ Aaron van Derlip Abhinav Johri Abhishek Kumar Jaiswal Adam McKerlie Agustin Perez Paladini Ahmet Emre Aladağ Aldiantoro Nugroho Alexander Gaevsky Andrean Franc Andrew Chen Wang Andrey Akolpakov Andrey Balandin Andy Matthews Ani Vera Anna Sirota Antonin Delpeuch Aron Griffis Bas ten Berge Basil Shubin Ben Timby Benjamin Jorand Benjamin Howes Bhavani Ravi Biel Massot Björn Andersson Bojan Mihelac Bruno Alla Chris Beaven Chris Davis Christian Carter Christopher Grebs Dani Hodovic Daniel Eriksson Daniel Widerin David Ascher David Cain David Evans David Friedman David Hummel Dimitris Tsimpitas Egor Poderyagin Eran Rundstein Eric Amador Eric Delord Fabio Caritas Barrionuevo da Luz Facundo Gaich Francis Brito Frantisek Malina Fred Palmer Fábio Santos George Whewell Griffith Rees Guignard Javier Guilhem Saurel Guillaume Vincent Guoyu Hao Haesung Park Hatem Nassrat Hyunwoo Shim Ignacio Ocampo J. Erm J. Fernando Sánchez Jack Shedd Jakob Gerhard Martinussen James Rivett-Carnac James Thompson Jannis Leidel Jannis Vajen Jeff Bowen Jeff Triplett Jeremy Satterfield Jerome Leclanche Jesse Gerard Brands Jihoon Park Jiyoon Ha Joe Vanderstelt Joel Fernandes John Bazik John Whitlock Jonas Aule JoonHwan Kim Josh Owen Josh Wright Joshua Butler Joshua Sorenson Julen Ruiz Aizpuru Justin Michalicek Justin Pogrob Kevin Dice Koichi Harakawa Lee Semel Lev Predan Kowarski Luis Diego García Luiz Guilherme Pais dos Santos Luke Burden Luke Crouch Maksim Rukomoynikov Marcin Skarbek Marcin Spoczynski Marco Fucci Marjori Pomarole Markus Kaiserswerth Markus Thielen Martin Bächtold Matt Nishi-Broach Mauro Stettler Morgante Pell Nariman Gharib Nathan Strobbe Niklas A Emanuelsson Oleg Sergeev Patrick Paul Paul Juergen Fischer Paulo Eduardo Neves Pavel Savchenko Peter Bittner Peter Rowlands Peter Stein Philip John James Rabi Alam Radek Czajka Rense VanderHoek Rick Westera Robert Balfre Roberto Novaes Rod Xavier Bondoc Roman Tomjak Roumen Antonov Ryan Jarvis Ryan Verner Safwan Rahman Sam Solomon Sanghyeok Lee Seizan Shimazaki Serafeim Papastefanos Sergey Silaev Shane Rice Stuart Ross Terry Jones Tiago Loureiro Tim Gates Tom Hacohen Tomas Babej Tomas Marcik Trey Corple Tuk Bredsdorff Udi Oron Victor Semionov Volodymyr Yatsyk Vuong Nguyen Vlad Dmitrievich Wendy Edwards Will Gordon Will Ross William Li Yaroslav Muravsky Yuri Kriachko Youcef Mammar django-allauth-0.47.0/ChangeLog.rst000066400000000000000000001463721415442050100170660ustar00rootroot000000000000000.47.0 (2021-12-09) ******************* Note worthy changes ------------------- - New providers: Gumroad. Backwards incompatible changes ------------------------------ - Added a new setting `SOCIALACCOUNT_LOGIN_ON_GET` that controls whether or not the endpoints for initiating a social login (for example, "/accounts/google/login/") require a POST request to initiate the handshake. As requiring a POST is more secure, the default of this new setting is `False`. Security notice --------------- Automatically signing in users into their account and connecting additional third party accounts via a simple redirect ("/accounts/facebook/login/") can lead to unexpected results and become a security issue especially when the redirect is triggered from a malicious web site. For example, if an attacker prepares a malicious website that (ab)uses the Facebook password recovery mechanism to first sign into his/her own Facebook account, followed by a redirect to connect a new social account, you may end up with the attacker's Facebook account added to the account of the victim. To mitigate this, `SOCIALACCOUNT_LOGIN_ON_GET` is introduced. 0.46.0 (2021-11-15) ******************* Note worthy changes ------------------- - New providers: Gitea, MediaWiki. - New translations: Georgian, Mongolian. - Django 3.2 compatibility. 0.45.0 (2021-07-11) ******************* Note worthy changes ------------------- - New providers: Feishu, NetIQ, Frontier, CILogin. 0.44.0 (2020-11-25) ******************* Security notice --------------- In previous versions, the mechanism to prevent too many failed login attempts (``ACCOUNT_LOGIN_ATTEMPTS_LIMIT``) could be bypassed by changing the casing of the login. Backwards incompatible changes ------------------------------ - The ``certificate`` key part of the ``SOCIALACCOUNT_PROVIDERS`` configuration has been renamed to ``certificate_key``. This is done to prevent the key from being displayed without being masked in Django debug pages. 0.44.0 ****** - Better compatibility with Django 3.2 0.43.0 (2020-10-15) ******************* Note worthy changes ------------------- - New translation: Slovenian. - If ``ACCOUNT_LOGIN_ATTEMPTS_LIMIT`` is set and the user successfully resets their password, the timeout is cleared to allow immediate login. - You can now limit the amount of email addresses a user can associate to his account by setting ``ACCOUNT_MAX_EMAIL_ADDRESSES``. - New providers: Apple, Okta, Stocktwits, Zoho, Zoom. - If email verification is set to mandatory, the email address you use to login with must now be verified as well. In previous versions, it was sufficient if the account had at least one verified email address, not necessarily the one used to login with. - Added a new setting: ``ACCOUNT_SIGNUP_REDIRECT_URL`` -- the URL (or URL name) to redirect to directly after signing up. Backwards incompatible changes ------------------------------ - In previous versions, the ``allauth`` app included a ``base.html`` template. This template could conflict with an equally named template at project level. Therefore, ``base.html`` has now been moved to ``account/base.html`` -- you will need to check your templates and likely override ``account/base.html`` within your project. 0.42.0 (2020-05-24) ******************* Note worthy changes ------------------- - New providers: EDX, Yandex, Mixer. - Fixed Twitch ``get_avatar_url()`` method to use the profile picture retrieved by new user details endpoint introduced in version 0.40.0. - The Facebook API version now defaults to v7.0. 0.41.0 (2019-12-18) ******************* Security notice --------------- - See `CVE-2019-19844 `_. Note worthy changes ------------------- - New providers: Exist.io., YNAB, Amazon Cognito. - You can now store OAuth credentials directly in your ``settings.SOCIALACCOUNT_PROVIDERS`` settings instead of storing them in the database using a ``SocialApp`` record. - Adding Keycloak Provider Backwards incompatible changes ------------------------------ - Dropped Python 2 and Django 1 compatibility. 0.40.0 (2019-08-29) ******************* Note worthy changes ------------------- - The ``instagram`` provider now extracts the user's full name. - New provider: NextCloud (OAuth2) - Added an ``SDK_URL`` setting for customizing the loading of the Facebook JavaScript SDK. - Updated Twitch provider to use new authentication endpoints (``https://id.twitch.tv``) over deprecated v5 endpoints (``https://api.twitch.tv/kraken``) - Added support for Patreon API v2, with API v1 set as default for backwards compatibility. Backwards incompatible changes ------------------------------ - ``Twitch``: The new API's profile data is different in both structure and content than the old V5 endpoint. Any project that relies on data from ``SocialAccount.extra_data`` should refer to the new API user endpoint documentation: https://dev.twitch.tv/docs/api/reference/#get-users 0.39.1 (2019-02-28) ******************* Note worthy changes ------------------- - The ``linkedin_oauth2`` provider now gracefully deals with old V1 data that might still be present in ``SocialAccount.extra_data``. Backwards incompatible changes ------------------------------ - The ``globus`` provider's ``extract_uid`` now uses the openid required field ``sub`` instead of the ``create_time`` field. 0.39.0 (2019-02-26) ******************* Note worthy changes ------------------- - New providers: JupyterHub (OAuth2), Steam (OpenID) - Refactor translations: Portuguese (Portugal). - Add testing for Django 2.2 (no code changes required) Backwards incompatible changes ------------------------------ - ``linkedin_oauth2``: As the LinkedIn V1 API is deprecated, the user info endpoint has been moved over to use the API V2. The format of the user ``extra_data`` is different and the profile picture is absent by default. 0.38.0 (2018-10-03) ******************* Security notice --------------- The ``{% user_display user %}`` tag did not escape properly. Depending on the username validation rules, this could lead to XSS issues. Note worthy changes ------------------- - New provider: Vimeo (OAuth2). - New translations: Basque. 0.37.1 (2018-08-27) ******************* Backwards incompatible changes ------------------------------ - Dropped the ``x-li-src: msdk`` headers from the ``linkedin_oauth2`` handshake. This header is only required for mobile tokens, and breaks the regular flow. Use the ``HEADERS`` setting to add this header if you need it. 0.37.0 (2018-08-27) ******************* Note worthy changes ------------------- - The Battle.net login backend now recognizes ``apac`` as a valid region. - User model using a ``UUIDField`` as it's primary key can now be logged in upon email confirmation (if using ``ACCOUNT_LOGIN_ON_EMAIL_CONFIRMATION``). - New providers: Agave, Cern, Disqus, Globus. - New translation: Danish. 0.36.0 (2018-05-08) ******************* Note worthy changes ------------------- - New providers: Telegram, QuickBooks. - The Facebook API version now defaults to v2.12. - ORCID upgraded to use API v2.1. Security notice --------------- - In previous versions, the authentication backend did not invoke the ``user_can_authenticate()`` method, potentially allowing users with ``is_active=False`` to authenticate when the allauth authentication backend was used in a non allauth context. 0.35.0 (2018-02-02) ******************* Note worthy changes ------------------- - Add support for Django 2.0 Security notice --------------- - As an extra security measure on top of what the standard Django password reset token generator is already facilitating, allauth now adds the user email address to the hash such that whenever the user's email address changes the token is invalidated. Backwards incompatible changes ------------------------------ - Drop support for Django 1.8 and Django 1.10. Note worthy changes ------------------- - New provider: Azure, Microsoft Graph, Salesforce, Yahoo. 0.34.0 (2017-10-29) ******************* Security notice --------------- - The "Set Password" view did not properly check whether or not the user already had a usable password set. This allowed an attacker to set the password without providing the current password, but only in case the attacker already gained control over the victim's session. Note worthy changes ------------------- - New provider: Meetup. 0.33.0 (2017-08-20) ******************* Note worthy changes ------------------- - Security: password reset tokens are now prevented from being leaked through the password reset URL. - New providers: Patreon, Authentiq, Dataporten. - Dropbox has been upgraded to API V2. - New translation: Norwegian. Backwards incompatible changes ------------------------------ - Dropped support for Django 1.9. 0.32.0 (2017-04-27) ******************* Note worthy changes ------------------- - Improved AJAX support: the account management views (change/set password, manage e-mail addresses and social connections) now support AJAX GET requests. These views hand over all the required data for you to build your frontend application upon. - New providers: Dwolla, Trello. - Shopify: support for per-user access mode. Backwards incompatible changes ------------------------------ - In previous versions, the views only responded with JSON responses when issuing AJAX requests of type POST. Now, the views also respond in JSON when making AJAX GET requests. - The structure of the response for AJAX requests has changed. Previously, it contained a ``form_errors`` key containing all form validation errors, if any. Now, it contains a ``form`` key that describes the complete form, including the fields. Field specific errors are placed in ``form.fields['some_field'].errors``, non-field errors in ``form.errors``. - The parameters passed to the Facebook JS SDK ``FB.init()`` method used to contain ``cookie``, ``status``, and ``xfbml``, all set to ``true``. These parameters are no longer explicitly passed. You can use the newly introduced ``INIT_PARAMS`` provider setting to provide your own values. 0.31.0 (2017-02-28) ******************* Note worthy changes ------------------- - Added a new ``user_logged_out`` signal. - OpenId: Added support for requesting additional data. - New providers: Auth0, Box, Line, Naver, Kakao, Daum, MailChimp, Eventbrite. Backwards incompatible changes ------------------------------ - Django 1.7 / Python 3.2 compatibility has been dropped. - Due to providers being registered in the same file as their definition it was impossible to subclass a provider without having the parent be registered. This has been addressed. If you have implemented a custom provider, you will need to change ``providers.registry.register(CustomProvider)`` into ``provider_classes = [CustomProvider]``. 0.30.0 (2017-01-01) ******************* Note worthy changes ------------------- - Changed the algorithm that generates unique usernames. Previously, in case the provider did not hand over any information to base the username on, the username "user" extended with an ever increasing numeric suffix would be attempted until a free username was found. In case of a large number of existing users, this could result in many queries being executed before a free username would be found, potentially resulting in a denial of service. The new algorithm uses a random suffix and only one query to determine the final username. - Added a new setting: ``ACCOUNT_PRESERVE_USERNAME_CASING``. This setting determines whether the username is stored in lowercase (``False``) or whether its casing is to be preserved (``True``). Note that when casing is preserved, potentially expensive ``__iexact`` lookups are performed when filter on username. For now, the default is set to ``True`` to maintain backwards compatibility. - The OAuth2Adapter class has gained a ``get_callback_url`` method for when customizing the callback URL is desired. - The Battle.net login backend now accepts the ``region`` GET parameter. - New providers: 500px, Discord. Backwards incompatible changes ------------------------------ - In previous versions, the ``DefaultAccountAdapter`` contained a ``username_regex`` property and accompanying ``error_messages['invalid_username']`` validation error message. These have been removed in favor of using the regex validation already defined at the user model level. Alternatively, you can use the newly introduced ``ACCOUNT_USERNAME_VALIDATORS`` setting. - The Battle.net backend no longer overrides username regex validation. In order to use battletags as usernames, you are expected to override either the ``username`` field on your User model, or to pass a custom validator which will accept the ``#`` character using the new ``ACCOUNT_USERNAME_VALIDATORS`` setting. Such a validator is available in ``socialaccount.providers.battlenet.validators.BattletagUsernameValidator``. 0.29.0 (2016-11-21) ******************* Note worthy changes ------------------- - Addressed Django 1.10 deprecation warnings. 0.28.0 (2016-10-13) ******************* Security notice --------------- - Previous versions contained a vulnerability allowing an attacker to alter the provider specific settings for ``SCOPE`` and/or ``AUTH_PARAMS`` (part of the larger ``SOCIALACCOUNT_PROVIDERS`` setting). The changes would persist across subsequent requests for all users, provided these settings were explicitly set within your project. These settings translate directly into request parameters, giving the attacker undesirable control over the OAuth(2) handshake. You are not affected if you did not explicitly configure these settings. Thanks to Ryan Kelly for reporting! Note worthy changes ------------------- - New providers: Doximity. - New translations: Korean. 0.27.0 (2016-08-18) ******************* Note worthy changes ------------------- - Django 1.10 compatibility. - The Twitter and GitHub providers now support querying of the email address. Backwards incompatible changes ------------------------------ - When ``ACCOUNT_SIGNUP_EMAIL_ENTER_TWICE`` was turned on, the e-mail field key changed from ``email`` to ``email1``, which could introduce subtle bugs. This has now been changed: there always is an ``email`` field, and optionally an ``email2`` field. - The "You must type the same password each time" form validation error that can be triggered during signup is now added to the ``password2`` field instead of being added to the non field errors. - The ``email_confirmation_sent`` signal is now passed ``request``, ``confirmation`` and ``signup`` instead of only the ``confirmation``. - ``ACCOUNT_PASSWORD_MIN_LENGTH`` was already deprecated, but is now completely ignored if ``AUTH_PASSWORD_VALIDATORS`` is not empty. 0.26.1 (2016-07-25) ******************* Note worthy changes ------------------- - Locale files wrongly packaged, fixed. - Fixed bug (``KeyError``) when ``ACCOUNT_SIGNUP_EMAIL_ENTER_TWICE`` was set to ``True``. 0.26.0 (2016-07-24) ******************* Note worthy changes ------------------- - New providers: Weixin, Battle.net, Asana, Eve Online, 23andMe, Slack - Django's password validation mechanism (see ``AUTH_PASSWORD_VALIDATORS``) is now used to validate passwords. - By default, email confirmations are no longer stored in the database. Instead, the email confirmation mail contains an HMAC based key identifying the email address to confirm. The verification lookup includes a fallback to the previous strategy so that there is no negative impact on pending verification emails. - A new setting ``ACCOUNT_SIGNUP_EMAIL_ENTER_TWICE`` was added, requiring users to input their email address twice. The setting ``ACCOUNT_SIGNUP_PASSWORD_VERIFICATION`` has been renamed to ``ACCOUNT_SIGNUP_PASSWORD_ENTER_TWICE``. - New translations: Latvian, Kyrgyz. Backwards incompatible changes ------------------------------ - Dropped support for Django 1.6 - In order to accomodate for Django's password validation, the ``clean_password`` method of the adapter now takes an (optional) ``user`` parameter as its second argument. - The new HMAC based keys may contain colons. If you have forked ``account/urls.py``, be sure to sync the ``account_confirm_email`` pattern. 0.25.2 (2016-03-13) ******************* Note worthy changes ------------------- - Bug fix release (MemcachedKeyCharacterError: "Control characters not allowed") 0.25.1 (2016-03-13) ******************* Note worthy changes ------------------- - Bug fix release (AttributeError in password reset view). 0.25.0 (2016-03-12) ******************* Note worthy changes ------------------- - Many providers were added: Reddit, Untappd, GitLab, Stripe, Pinterest, Shopify, Draugiem, DigitalOcean, Robinhood, Bitbucket(OAuth2). - The account connections view is now AJAX aware. - You can now customize the template extension that is being used to render all HTML templates (``ACCOUNT_TEMPLATE_EXTENSION``) - In order to be secure by default, users are now blocked from logging in after exceeding a maximum number of failed login attempts (see ``ACCOUNT_LOGIN_ATTEMPTS_LIMIT``, ``ACCOUNT_LOGIN_ATTEMPTS_TIMEOUT``). Set ``ACCOUNT_LOGIN_ATTEMPTS_LIMIT`` to ``None`` to disable this functionality. Important: while this protects the allauth login view, it does not protect Django's admin login from being brute forced. - New translations: Arabic, Lithuanian Backwards incompatible changes ------------------------------ None 0.24.1 (2015-11-09) ******************* Note worthy changes ------------------- - Non-test code accidentally had test packages as a dependency. Backwards incompatible changes ------------------------------ - Setting a password after logging in with a social account no longer logs out the user by default on Django 1.7+. Setting an initial password and changing the password both respect ``settings.ACCOUNT_LOGOUT_ON_PASSWORD_CHANGE``. 0.24.0 (2015-11-08) ******************* Note worthy changes ------------------- - Django 1.9b1 compatibility. - Seppo Erviälä contributed a Finnish translation, thanks! - Iurii Kriachko contributed a Basecamp provider, thanks! Backwards incompatible changes ------------------------------ - Increased ``SocialApp`` key/secret/token sizes to 191, decreased ``SocialAccount.uid`` size to 191. The latter was done in order to accomodate for MySQL in combination with utf8mb4 and contraints on ``uid``. Note that ``uid`` is used to store OpenID URLs, which can theoretically be longer than 191 characters, although in practice this does not seem to be the case. In case you really need to control the ``uid`` length, set ``settings.SOCIALACCOUNT_UID_MAX_LENGTH`` accordingly. Migrations are in place. 0.23.0 (2015-08-02) ******************* Note worthy changes ------------------- - David Friedman contributed Edmodo support, thanks! - Added support for ``ACCOUNT_LOGIN_ON_PASSWORD_RESET`` (thanks Julen!) Backwards incompatible changes ------------------------------ None 0.22.0 (2015-07-23) ******************* Note worthy changes ------------------- - Reversal of the email confirmation url can now be overridden in the adapter (``get_email_confirmation_url``). Additionally, the complete confirmation email handling can be overridden via ``send_confirmation_mail``. - Template context processors are no longer used. - The Facebook Graph API fields (/me/?fields=...) can now be configured using the provider ``FIELDS`` setting. Backwards incompatible changes ------------------------------ - Dropped support for Python 2.6 and Django <1.6. - The default Facebook Graph API version is now v2.4. - Template context processors are no longer used. The context processor for ``allauth.account`` was already empty, and the context processor for ``allauth.socialaccount`` has been converted into the :doc:``{% get_providers %} `` template tag. 0.21.0 (2015-07-02) ******************* Note worthy changes ------------------- - You can now tweak the authentication params per OAuth provider, as you already could for OAuth2. Contributed by Peter Rowlands, thanks. - Nattaphoom Ch. contributed a Thai translation, thanks! - Guoyu Hao contributed a Baidu provider, thanks! - Rod Xavier Bondoc contributed support logging out on password change (see setting: ``ACCOUNT_LOGOUT_ON_PASSWORD_CHANGE``) Backwards incompatible changes ------------------------------ - In version 0.20.0 an ``account`` migration (``0002_email_max_length``) was added to alter the maximum length of the email field. Unfortunately, a side effect of this migration was that the ``unique=True`` setting slipped through as well. Hardcoding this to ``True`` is wrong, as uniqueness actually depends on the ``ACCOUNT_UNIQUE_EMAIL`` setting. We cannot create a followup ``0003`` migration to set things straight, as the ``0002`` migration may fail on installations where email addresses are not unique. Therefore, we had to resort to changing an existing migration which is normally not the right thing to do. In case your installation has ``ACCOUNT_UNIQUE_EMAIL`` set to ``True``, you need not take any further action. In case it is set to ``False`` and migration ``0002`` already ran, please issue a ``--fake`` migration down to ``0001``, followed by a re-run of the updated ``0002``. 0.20.0 (2015-05-25) ******************* Note worthy changes ------------------- - Patrick Paul contributed a provider for Evernote, thanks! - Josh Wright contributed a provider for Spotify, thanks! - Björn Andersson added support for Dropbox OAuth2, thanks! - guoqiao contributed a provider for Douban, thanks! Backwards incompatible changes ------------------------------ - Given that the ``max_length`` for the Django 1.8 ``EmailField`` has been bumped to 254, allauth is following up. Migrations (``account``) are in place. 0.19.1 (2015-02-05) ******************* Note worthy changes ------------------- - Fixed migrations when using South & Django 1.6. 0.19.0 (2015-01-04) ******************* Note worthy changes ------------------- - Basil Shubin contributed an Odnoklassniki provider, thanks! - Facebook: If the JS SDK is not available, for example due to a browser plugin like Disconnect.me that blocks it, login falls back to the regular non JS handshake. - ``is_safe_url`` can now be overriden - Facebook: The Graph API version is now configurable via ``SOCIALACCOUNT_PROVIDERS``. - A Firefox Accounts provider was added by Jannis Leidel, thanks! - Josh Owen contributed Coinbase support, thanks! - Tomas Babej contributed a Slovak translation, thanks! - Moved existing migrations into ``south_migrations`` - "zbryikt" contributed a Taiwanese Chinese translation, thanks! - Added support for custom password rules via ``clean_password``. Backwards incompatible changes ------------------------------ - In the upcoming Django 1.8 it is no longer possible to hookup an unsaved ``User`` instance to a ``SocialAccount``. Therefore, if you are inspecting the ``sociallogin`` object, you should now use ``sociallogin.user`` instead of ``sociallogin.account.user``. - When users logged in while ``User.is_active`` was ``False``, they were sent to ``/accounts/inactive/`` in case of a social login, and received a form validation error in case of a local login. This needless inconsistency has been removed. The validation error no longer appears and local logins are also redirected to ``/accounts/inactive/``. - In case you were overriding the ``ResetPasswordForm``: the save method now takes ``request`` as its first argument. - All existing migrations have been moved into ``south_migrations`` packages, this in order not to conflict with Django's built-in support for migrations. South 1.0 automatically picks up this new location. Upgrade South if you are still dependent on these migrations. 0.18.0 (2014-08-12) ******************* Note worthy changes ------------------- - Storing social access tokens is now optional (``SOCIALACCOUNT_STORE_TOKENS``). - ``nimiq`` contributed ORCID support, thanks. - All forms are now pluggable via a new setting: ``(SOCIAL)ACCOUNT_FORMS``. - James Thompson contributed Windows Live support, thanks! Backwards incompatible changes ------------------------------ - SECURITY: The Persona provider now requires the ``AUDIENCE`` parameter to be explicitly configured, as required by the Persona specification for security reasons. - The inline Javascript is removed from the ``fbconnect.html`` template, which allows for a more strict ``Content-Security-Policy``. If you were using the builtin ``fbconnect.html`` this change should go by unnoticed. 0.17.0 (2014-06-16) ******************* Note worthy changes ------------------- - ``sourenaraya`` contributed Mail.Ru support, thanks. - account: Justin Michalicek contributed support to control session life time and age: ``ACCOUNT_SESSION_COOKIE_AGE`` and ``ACCOUNT_SESSION_REMEMBER``. - Serafeim Papastefanos contributed an Ukrainian translation, thanks! - ``kkarwows`` contributed AppConfig support, thanks. - socialaccount: Added Xing provider. - socialaccount: Marcin Skarbek contributed Hubic support, thanks! - Volodymyr Yatsyk contributed an Ukrainian translation, thanks! - ``joke2k`` contributed an Italian translation, thanks! - socialaccount: All providers now support the ``VERIFIED_EMAIL`` property have e-mail addresses forced to be interpreted as verified. Backwards incompatible changes ------------------------------ None 0.16.1 (2014-03-12) ******************* Note worthy changes ------------------- - Facebook login via Javascript was broken if ``auth_type`` was not set to ``reauthenticate``, fixed. - Support for hooking up a callback when ``FB.init()`` is ready (``allauth.facebook.onInit``) Backwards incompatible changes ------------------------------ None 0.16.0 (2014-03-10) ******************* Note worthy changes ------------------- - Nariman Gharib contributed a Persian translation, thanks! - The custom signup form ``save`` has been deprecated in favour of a ``def signup(request, user)`` method. - Facebook reauthentication now uses an ``auth_nonce``. - Added a new option ``ACCOUNT_LOGIN_ON_EMAIL_CONFIRMATION``, to indicate whether or not e-mail confirmation is to automatically log in. - socialaccount: Added Bitbucket provider. - Jack Shedd contributed Tumblr support, thanks! - Romanos Tsouroplis contributed Foursquare support, thanks! - "excessivedemon" contributed Flickr support, thanks! - Luis Diego García contributed Amazon and Paypal support, thanks! - Stuart Ross contributed LinkedIn OAuth 2.0 support, thanks! Backwards incompatible changes ------------------------------ - Previously, the ``save(user)`` was called on the custom signup form. However, this shadowed the existing ``save`` method in case a model form was used. To avoid confusion, the ``save`` method has been deprecated in favour of a ``def signup(request, user)`` method. - The Amazon provider requires more space for ``token_secret``, so the maximum length restriction has been dropped. Migrations are in place. 0.15.0 (2013-12-01) ******************* Note worthy changes ------------------- - socialaccount: Added ``is_auto_signup_allowed`` to social account adapter. - facebook: Added a new setting: VERIFIED_EMAIL. - socialaccount: a collision on e-mail address when you sign up using a third party social account is now more clearly explained: "An account already exists with this e-mail address. Please sign in to that account first, then connect your Google account". - account: You are now automatically logged in after confirming your e-mail address during sign up. - account: The ``/accounts/login/`` view now supports AJAX requests. - facebook: The fbconnect.js script is now more pluggable. - socialaccount: Markus Kaiserswerth contributed a Feedly provider, thanks! - socialaccount: Dropped django-avatar support. - openid: First, last and full name are now also queried together with the e-mail address. Thanks, @andrvb. - openid: Compatibility fix for Django 1.6 (JSON serializer). - account: Added support for ``ACCOUNT_CONFIRM_EMAIL_ON_GET``. Backwards incompatible changes ------------------------------ - Instead of directly rendering and returning a template, logging in while the account is inactive or not yet confirmed now redirects to two new views: ``/accounts/inactive/`` respectively ``/accounts/confirm-email/``. - The ``account/verification_sent.html`` template no longer receives the e-mail address in the context (``email``). Note that a message containing that e-mail address is still emitted using the messages framework. - The ``/accounts/confirm_email/key/`` view has been renamed to ``/accounts/confirm-email/`` (human friendlier). Redirects are in place to handle old still pending confirmations. - Built-in support for django-avatar has been removed. Offering such functionality means making choices which may not be valid for everyone. For example, allauth was downloading the image (which can take some time, or even block) in the context of the login, whereas a better place might be some celery background job. Additionally, in case of an error it simply ignored this. How about retries et al? Also, do you want to copy the avatar once at sign up, or do you want to update on each login? All in all, this functionality goes way beyond authentication and should be addressed elsewhere, beyond allauth scope. The original code has been preserved here so that you can easily reinstate it in your own project: https://gist.github.com/pennersr/7571752 0.14.2 (2013-11-16) ******************* Note worthy changes ------------------- - Compatibility fix for logging in with Django 1.6. - Maksim Rukomoynikov contributed a Russian translation, thanks! Backwards incompatible changes ------------------------------ - In case you were using the internal method ``generate_unique_username``, note that its signature has changed. It now takes a list of candidates to base the username on. 0.14.1 (2013-10-28) ******************* Note worthy changes ------------------- - PyPi did not render the README.rst properly. Backwards incompatible changes ------------------------------ None 0.14.0 (2013-10-28) ******************* Note worthy changes ------------------- - Stuart Ross contributed AngelList support, thanks! - LinkedIn: profile fields that are to be fetched are now configurable (``PROFILE_FIELDS`` provider-level setting). - Udi Oron contributed a Hebrew translation, thanks! - Add setting ``ACCOUNT_DEFAULT_HTTP_PROTOCOL`` (HTTPS support). - George Whewell contributed Instagram support, thanks! - Refactored adapter methods relating to creating and populating ``User`` instances. - User creation methods in the ``Default(Social)AccountAdapter`` now have access to the ``request``. Backwards incompatible changes ------------------------------ - The ``socialaccount/account_inactive.html`` template has been moved to ``account/account_inactive.html``. - The adapter API for creating and populating users has been overhauled. As a result, the ``populate_new_user`` adapter methods have disappeared. Please refer to the section on "Creating and Populating User Instances" for more information. 0.13.0 (2013-08-31) ******************* Note worthy changes ------------------- - Koichi Harakawa contributed a Japanese translation, thanks! - Added ``is_open_for_signup`` to DefaultSocialAccountAdapter. - Added VK provider support. - Marcin Spoczynski contributed a Polish translation, thanks! - All views are now class-based. - ``django.contrib.messages`` is now optional. - "jresins" contributed a simplified Chinese, thanks! Backwards incompatible changes ------------------------------ - The password reset from key success response now redirects to a "done" view (``/accounts/password/reset/key/done/``). This view has its own ``account/password_reset_from_key_done.html`` template. In previous versions, the success template was intertwined with the ``account/password_reset_from_key.html`` template. 0.12.0 (2013-07-01) ******************* Note worthy changes ------------------- - Added support for re-authenticated (forced prompt) by means of a new ``action="reauthenticate"`` parameter to the ``{% provider_login_url %}`` - Roberto Novaes contributed a Brazilian Portuguese translation, thanks! - Daniel Eriksson contributed a Swedish translation, thanks! - You can now logout from both allauth and Facebook via a Javascript helper: ``window.allauth.facebook.logout()``. - Connecting a social account is now a flow that needs to be explicitly triggered, by means of a ``process="connect"`` parameter that can be passed along to the ``{% provider_login_url %}``, or a ``process=connect`` GET parameter. - Tomas Marcik contributed a Czech translation, thanks! Backwards incompatible changes ------------------------------ - The ``{% provider_login_url %}`` tag now takes an optional process parameter that indicates how to process the social login. As a result, if you include the template ``socialaccount/snippets/provider_list.html`` from your own overriden ``socialaccount/connections.html`` template, you now need to pass along the process parameter as follows: ``{% include "socialaccount/snippets/provider_list.html" with process="connect" %}``. - Instead of inlining the required Facebook SDK Javascript wrapper code into the HTML, it now resides into its own .js file (served with ``{% static %}``). If you were using the builtin ``fbconnect.html`` this change should go by unnoticed. 0.11.1 (2013-06-04) ******************* Note worthy changes ------------------- - Released (due to issue in disconnecting social accounts). Backwards incompatible changes ------------------------------ None 0.11.0 (2013-06-02) ******************* Note worthy changes ------------------- - Moved logic whether or not a social account can be disconnected to the ``SocialAccountAdapter`` (``validate_disconnect``). - Added ``social_account_removed`` signal. - Implemented CSRF protection (http://tools.ietf.org/html/draft-ietf-oauth-v2-30#section-10.12). - The ``user_logged_in`` signal now optionally receives a ``sociallogin`` parameter, in case of a social login. - Added ``social_account_added`` (contributed by orblivion, thanks). - Hatem Nassrat contributed Bitly support, thanks! - Bojan Mihelac contributed a Croatian translation, thanks! - Messages (as in ``django.contrib.messages``) are now configurable through templates. - Added support for differentiating e-mail handling (verification, required) between local and social accounts: ``SOCIALACCOUNT_EMAIL_REQUIRED`` and ``SOCIALACCOUNT_EMAIL_VERIFICATION``. Backwards incompatible changes ------------------------------ None 0.10.1 (2013-04-16) ******************* Note worthy changes ------------------- - Cleaning of ``username`` can now be overriden via ``DefaultAccountAdapter.clean_username`` - Fixed potential error (``assert``) when connecting social accounts. - Added support for custom username handling in case of custom user models (``ACCOUNT_USER_MODEL_USERNAME_FIELD``). Backwards incompatible changes ------------------------------ None 0.10.0 (2013-04-12) ******************* Note worthy changes ------------------- - Chris Davis contributed Vimeo support, thanks! - Added support for overriding the URL to return to after connecting a social account (``allauth.socialaccount.adapter.DefaultSocialAccountAdapter.get_connect_redirect_url``). - Python 3 is now supported! - Dropped dependency on (unmaintained?) oauth2 package, in favor of requests-oauthlib. - account: E-mail confirmation mails generated at signup can now be differentiated from regular e-mail confirmation mails by placing e.g. a welcome message into the ``account/email/email_confirmation_signup*`` templates. Thanks to Sam Solomon for the patch. - account: Moved User instance creation to adapter so that e.g. username generation can be influenced. Thanks to John Bazik for the patch. - Robert Balfre contributed Dropbox support, thanks! - socialaccount: Added support for Weibo. - account: Added support for sending HTML e-mail. Add ``*_message.html`` templates and they will be automatically picked up. - Added support for passing along extra parameters to the OAuth2 authentication calls, such as ``access_type`` (Google) or ``auth_type`` (Facebook). - Both the login and signup view now immediately redirect to the login redirect url in case the user was already authenticated. - Added support for closing down signups in a pluggable fashion, making it easy to hookup your own invitation handling mechanism. - Added support for passing along extra parameters to the ``FB.login`` API call. Backwards incompatible changes ------------------------------ - Logout no longer happens on GET request. Refer to the ``LogoutView`` documentation for more background information. Logging out on GET can be restored by the setting ``ACCOUNT_LOGOUT_ON_GET``. Furthermore, after logging out you are now redirected to ``ACCOUNT_LOGOUT_REDIRECT_URL`` instead of rendering the ``account/logout.html`` template. - ``LOGIN_REDIRECT_URLNAME`` is now deprecated. Django 1.5 accepts both URL names and URLs for ``LOGIN_REDIRECT_URL``, so we do so as well. - ``DefaultAccountAdapter.stash_email_verified`` is now named ``stash_verified_email``. - Django 1.4.3 is now the minimal requirement. - Dropped dependency on (unmaintained?) oauth2 package, in favor of requests-oauthlib. So you will need to update your (virtual) environment accordingly. - We noticed a very rare bug that affects end users who add Google social login to existing accounts. The symptom is you end up with users who have multiple primary email addresses which conflicts with assumptions made by the code. In addition to fixing the code that allowed duplicates to occur, there is a management command you can run if you think this effects you (and if it doesn't effect you there is no harm in running it anyways if you are unsure): - ``python manage.py account_unsetmultipleprimaryemails`` - Will silently remove primary flags for email addresses that aren't the same as ``user.email``. - If no primary ``EmailAddress`` is ``user.email`` it will pick one at random and print a warning. - The expiry time, if any, is now stored in a new column ``SocialToken.expires_at``. Migrations are in place. - Furthermore, Facebook started returning longer tokens, so the maximum token length was increased. Again, migrations are in place. - Login and signup views have been turned into class-based views. - The template variable ``facebook_perms`` is no longer passed to the "facebook/fbconnect.html" template. Instead, ``fb_login_options`` containing all options is passed. 0.9.0 (2013-01-30) ****************** Note worthy changes ------------------- - account: ``user_signed_up`` signal now emits an optional ``sociallogin`` parameter so that receivers can easily differentiate between local and social signups. - account: Added ``email_removed`` signal. - socialaccount: Populating of User model fields is now centralized in the adapter, splitting up ``name`` into ``first_name`` and ``last_name`` if these were not individually available. - Ahmet Emre Aladağ contributed a Turkish translation, thanks! - socialaccount: Added SocialAccountAdapter hook to allow for intervention in social logins. - google: support for Google's ``verified_email`` flag to determine whether or not to send confirmation e-mails. - Fábio Santos contributed a Portugese translation, thanks! - socialaccount: Added support for Stack Exchange. - socialaccount: Added ``get_social_accounts`` template tag. - account: Default URL to redirect to after login can now be overriden via the adapter, both for login and e-mail confirmation redirects. Backwards incompatible changes ------------------------------ - ``requests`` is now a dependency (dropped ``httplib2``). - Added a new column ``SocialApp.client_id``. The value of ``key`` needs to be moved to the new ``client_id`` column. The ``key`` column is required for Stack Exchange. Migrations are in place to handle all of this automatically. 0.8.3 (2012-12-06) ****************** Note worthy changes ------------------- - Markus Thielen contributed a German translation, thanks! - The ``site`` foreign key from ``SocialApp`` to ``Site`` has been replaced by a ``ManyToManyField``. Many apps can be used across multiple domains (Facebook cannot). - account: Added adapter class for increased pluggability. Added hook for 3rd party invitation system to by pass e-mail verification (``stash_email_verified``). Moved sending of mail to adapter. - account: Added option to completely disable e-mail verification during signup. Backwards incompatible changes ------------------------------ - The ``ACCOUNT_EMAIL_VERIFICATION`` setting is no longer a boolean based setting. Use a string value of "none", "optional" or "mandatory" instead. - The template "account/password_reset_key_message.txt" has been moved to "account/email/password_reset_key_message.txt". The subject of the message has been moved into a template ("account/email/password_reset_key_subject.txt"). - The ``site`` foreign key from ``SocialApp`` to ``Site`` has been replaced by a ``ManyToManyField``. Many apps can be used across multiple domains (Facebook cannot). 0.8.2 (2012-10-10) ****************** Note worthy changes ------------------- - Twitter: Login was broken due to change at in URLs at Twitter, fixed. - LinkedIn: Added support for passing along the OAuth scope. - account: Improved e-mail confirmation error handling, no more confusing 404s. - account: Aldiantoro Nugroho contributed support for a new setting: ACCOUNT_USERNAME_MIN_LENGTH - socialaccount: Added preliminary support for Mozilla Persona. - account: Sam Solomon added various signals for email and password related changes. - account: Usernames may now contain @, +, . and - characters. Backwards incompatible changes ------------------------------ - Dropped support for ``CONTACT_EMAIL`` from the ``account`` template context processor. It was never documented and only used in the templates as an example -- there is no need to pollute the ``allauth`` settings with that. If your templates rely on it then you will have to put it in a context processor yourself. 0.8.1 (2012-09-03) ****************** Note worthy changes ------------------- - Python 2.6.2 compatibility issue, fixed. - The example project was unintentionally packaged, fixed. Backwards incompatible changes ------------------------------ None 0.8.0 (2012-09-01) ****************** Note worthy changes ------------------- - account: Dropped dependency on the emailconfirmation app, integrating its functionality into the account app. This change is of major impact, please refer to the documentation on how to upgrade. - account: Documented ACCOUNT_USERNAME_REQUIRED. This is actually not a new setting, but it somehow got overlooked in the documentation. - account/socialaccount: Dropped the _tags postfix from the template tag libraries. Simply use {% load account %} and {% load socialaccount %}. - Added signup and social login signals. - SoundCloud: Rabi Alam contributed a SoundCloud provider, thanks! - account: Sam Solomon cleaned up the e-mail management view: added proper redirect after POSTs, prevent deletion of primary e-mail. Thanks. - account: When signing up, instead of generating a completely random username a more sensible username is automatically derived from first/last name or e-mail. Backwards incompatible changes ------------------------------ - ``allauth`` now depends on Django 1.4 or higher. - Major impact: dropped dependency on the ``emailconfirmation`` app, as this project is clearly left unmaintained. Important tickets such as https://github.com/pinax/django-email-confirmation/pull/5 are not being addressed. All models and related functionality have been directly integrated into the ``allauth.account`` app. When upgrading take care of the following: - The ``emailconfirmation`` setting ``EMAIL_CONFIRMATION_DAYS`` has been replaced by ``ACCOUNT_EMAIL_CONFIRMATION_EXPIRE_DAYS``. - Instead of directly confirming the e-mail address upon the GET request the confirmation is now processed as part of an explicit POST. Therefore, a new template ``account/email_confirm.html`` must be setup. - Existing ``emailconfirmation`` data should be migrated to the new tables. For this purpose a special management command is available: ``python manage.py account_emailconfirmationmigration``. This command does not drop the old ``emailconfirmation`` tables -- you will have to do this manually yourself. Why not use South? EmailAddress uniqueness depends on the configuration (``ACCOUNT_UNIQUE_EMAIL``), South does not handle settings dependent database models. - ``{% load account_tags %}`` is deprecated, simply use: ``{% load account %}`` - ``{% load socialaccount_tags %}`` is deprecated, simply use: ``{% load socialaccount %}`` 0.7.0 (2012-07-18) ****************** Note worthy changes ------------------- - Facebook: Facundo Gaich contributed support for dynamically deriving the Facebook locale from the Django locale, thanks!. - OAuth: All OAuth/OAuth2 tokens are now consistently stored across the board. Cleaned up OAuth flow removing superfluous redirect. - Facebook: Dropped Facebook SDK dependency. - socialaccount: DRY focused refactoring of social login. - socialaccount: Added support for Google OAuth2 and Facebook OAuth2. Fixed GitHub. - account: Added verified_email_required decorator. - socialaccount: When signing up, user.first/last_name where always taken from the provider signup data, even when a custom signup form was in place that offered user inputs for editting these fields. Fixed. Backwards incompatible changes ------------------------------ None 0.6.0 (2012-06-20) ****************** Note worthy changes ------------------- - account: Added ACCOUNT_USER_DISPLAY to render a user name without making assumptions on how the user is represented. - allauth, socialaccount: Removed the last remaining bits of hardcodedness with respect to the enabled social authentication providers. - account: Added ACCOUNT_AUTHENTICATION_METHOD setting, supporting login by username, e-mail or both. Backwards incompatible changes ------------------------------ - The ``ACCOUNT_EMAIL_AUTHENTICATION`` setting has been dropped in favor of ``ACCOUNT_AUTHENTICATION_METHOD``. - The login form field is now always named ``login``. This used to by either ``username`` or ``email``, depending on the authentication method. If needed, update your templates accordingly. - The ``allauth`` template tags (containing template tags for OpenID, Twitter and Facebook) have been removed. Use the ``socialaccount`` template tags instead (specifically: ``{% provider_login_url ... %}``). - The ``allauth.context_processors.allauth`` context processor has been removed, in favor of ``allauth.socialaccount.context_processors.socialaccount``. In doing so, all hardcodedness with respect to providers (e.g ``allauth.facebook_enabled``) has been removed. 0.5.0 (2012-06-08) ****************** Note worthy changes ------------------- - account: Added setting ACCOUNT_PASSWORD_MIN_LENGTH for specifying the minimum password length. - socialaccount: Added generic OAuth2 support. Added GitHub support as proof of concept. - socialaccount: More refactoring: generic provider & OAuth consumer approach. Added LinkedIn support to test this approach. - socialaccount: Introduced generic models for storing social apps, accounts and tokens in a central and consistent manner, making way for adding support for more account providers. Note: there is more refactoring to be done -- this first step only focuses on the database models. - account: E-mail confirmation mails are now automatically resent whenever a user attempts to login with an unverified e-mail address (if ACCOUNT_EMAIL_VERIFICATION=True). Backwards incompatible changes ------------------------------ - Upgrade your ``settings.INSTALLED_APPS``: Replace ``allauth.`` (where provider is one of ``twitter``, ``facebook`` or ``openid``) with ``allauth.socialaccount.providers.`` - All provider related models (``FacebookAccount``, ``FacebookApp``, ``TwitterAccount``, ``TwitterApp``, ``OpenIDAccount``) have been unified into generic ``SocialApp`` and ``SocialAccount`` models. South migrations are in place to move the data over to the new models, after which the original tables are dropped. Therefore, be sure to run migrate using South. 0.4.0 (2012-03-25) ****************** Note worthy changes ------------------- - account: The render_value parameter of all PasswordInput fields used can now be configured via a setting. - account: Added support for prefixing the subject of sent emails. - account: Added support for a plugging in a custom signup form used for additional questions to ask during signup. - account: ``is_active`` is no longer used to keep users with an unverified e-mail address from loging in. - Dropping uniform dependency. Moved uniform templates into example project. Backwards incompatible changes ------------------------------ None 0.3.0 (2012-01-19) ****************** Note worthy changes ------------------- - The e-mail authentication backend now attempts to use the 'username' parameter as an e-mail address. This is needed to properly integrate with other apps invoking authenticate. - SmileyChris contributed support for automatically generating a user name at signup when ``ACCOUNT_USERNAME_REQUIRED`` is set to False. - Vuong Nguyen contributed support for (optionally) asking for the password just once during signup (``ACCOUNT_SIGNUP_PASSWORD_VERIFICATION``). - The Twitter oauth sequence now respects the "oauth_callback" parameter instead of defaulting to the callback URL configured at Twitter. - Pass along ``?next=`` parameter between login and signup views. - Added Dutch translation. - Added template tags for pointing to social login URLs. These tags automatically pass along any ``?next=`` parameter. Additionally, added an overall allauth_tags that gracefully degrades when e.g. allauth.facebook is not installed. - Pass along next URL, if any, at ``/accounts/social/signup/``. - Duplicate email address handling could throw a MultipleObjectsReturned exception, fixed. - Removed separate social account login view, in favour of having a single unified login view including both forms of login. - Added support for passing along a next URL parameter to Facebook, OpenID logins. - Added support for django-avatar, copying the Twitter profile image locally on signup. - ``allauth/account/forms.py`` (``BaseSignupForm.clean_email``): With ``ACCOUNT_EMAIL_REQUIRED=False``, empty email addresses were considered duplicates. Fixed. - The existing migrations for allauth.openid were not compatible with MySQL due to the use of an URLField with max_length above 255. The issue has now been addressed but unfortunately at the cost of the existing migrations for this app. Existing installations will have to be dealt with manually (altering the "identity" column of OpenIDAccount, deleting ghost migrations). Backwards incompatible changes ------------------------------ - None django-allauth-0.47.0/LICENSE000066400000000000000000000021201415442050100154700ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2010-2021 Raymond Penners and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. django-allauth-0.47.0/MANIFEST.in000066400000000000000000000003141415442050100162240ustar00rootroot00000000000000include AUTHORS include LICENSE include README.rst include ChangeLog.rst include test_settings.py recursive-include allauth *.html *.txt *.xml *.po *.mo *.js recursive-include docs Makefile conf.py *.rst django-allauth-0.47.0/Makefile000066400000000000000000000006141415442050100161310ustar00rootroot00000000000000VIRTUALENV = $(shell pwd)/venv.tmp PYTHON = $(VIRTUALENV)/bin/python ISORT = isort $$(find $(PWD)/allauth -not -path '*/migrations/*' -type f -name '*.py' -not -name '__init__.py' -print) po: ( cd allauth ; $(PYTHON) ../manage.py makemessages -a -e html,txt,py ) mo: ( cd allauth ; $(PYTHON) ../manage.py compilemessages ) isort-fix: $(ISORT) .PHONY: \ po \ mo \ isort-fix django-allauth-0.47.0/README.rst000066400000000000000000000055201415442050100161610ustar00rootroot00000000000000========================== Welcome to django-allauth! ========================== .. image:: https://github.com/pennersr/django-allauth/actions/workflows/ci.yml/badge.svg :target: https://github.com/pennersr/django-allauth/actions .. image:: https://img.shields.io/pypi/v/django-allauth.svg :target: https://pypi.python.org/pypi/django-allauth .. image:: https://coveralls.io/repos/pennersr/django-allauth/badge.svg?branch=master :alt: Coverage Status :target: https://coveralls.io/r/pennersr/django-allauth .. image:: https://pennersr.github.io/img/bitcoin-badge.svg :target: https://blockchain.info/address/1AJXuBMPHkaDCNX2rwAy34bGgs7hmrePEr .. image:: https://img.shields.io/badge/code%20style-pep8-green.svg :target: https://www.python.org/dev/peps/pep-0008/ .. image:: https://img.shields.io/badge/code_style-standard-brightgreen.svg :target: http://standardjs.com .. image:: https://pennersr.github.io/img/emacs-badge.svg :target: https://www.gnu.org/software/emacs/ Integrated set of Django applications addressing authentication, registration, account management as well as 3rd party (social) account authentication. Home page http://www.intenct.nl/projects/django-allauth/ Source code http://github.com/pennersr/django-allauth Mailing list http://groups.google.com/group/django-allauth Documentation https://django-allauth.readthedocs.io/en/latest/ Stack Overflow http://stackoverflow.com/questions/tagged/django-allauth Rationale ========= Most existing Django apps that address the problem of social authentication focus on just that. You typically need to integrate another app in order to support authentication via a local account. This approach separates the worlds of local and social authentication. However, there are common scenarios to be dealt with in both worlds. For example, an e-mail address passed along by an OpenID provider is not guaranteed to be verified. So, before hooking an OpenID account up to a local account the e-mail address must be verified. So, e-mail verification needs to be present in both worlds. Integrating both worlds is quite a tedious process. It is definitely not a matter of simply adding one social authentication app, and one local account registration app to your ``INSTALLED_APPS`` list. This is the reason this project got started -- to offer a fully integrated authentication app that allows for both local and social authentication, with flows that just work. Commercial Support ================== This project is sponsored by IntenCT_. If you require assistance on your project(s), please contact us: info@intenct.nl. .. _IntenCT: http://www.intenct.info Cross-Selling ============= If you like this, you may also like: - django-trackstats: https://github.com/pennersr/django-trackstats - netwell: https://github.com/pennersr/netwell - Shove: https://github.com/pennersr/shove django-allauth-0.47.0/allauth/000077500000000000000000000000001415442050100161225ustar00rootroot00000000000000django-allauth-0.47.0/allauth/__init__.py000066400000000000000000000012641415442050100202360ustar00rootroot00000000000000r""" _ ___ __ __ .___________. __ __ /\| |/\ / \ | | | | | || | | | \ ` ' / / ^ \ | | | | `---| |----`| |__| | |_ _| / /_\ \ | | | | | | | __ | / , . \ / _____ \ | `--' | | | | | | | \/|_|\//__/ \__\ \______/ |__| |__| |__| """ VERSION = (0, 47, 0, "final", 0) __title__ = "django-allauth" __version_info__ = VERSION __version__ = ".".join(map(str, VERSION[:3])) + ( "-{}{}".format(VERSION[3], VERSION[4] or "") if VERSION[3] != "final" else "" ) __author__ = "Raymond Penners" __license__ = "MIT" __copyright__ = "Copyright 2010-2021 Raymond Penners and contributors" django-allauth-0.47.0/allauth/account/000077500000000000000000000000001415442050100175565ustar00rootroot00000000000000django-allauth-0.47.0/allauth/account/__init__.py000066400000000000000000000001761415442050100216730ustar00rootroot00000000000000import django if django.VERSION < (3, 2): # pragma: no cover default_app_config = "allauth.account.apps.AccountConfig" django-allauth-0.47.0/allauth/account/adapter.py000066400000000000000000000463531415442050100215630ustar00rootroot00000000000000from __future__ import unicode_literals import hashlib import json import time import warnings from django import forms from django.conf import settings from django.contrib import messages from django.contrib.auth import ( authenticate, get_backends, login as django_login, logout as django_logout, ) from django.contrib.auth.models import AbstractUser from django.contrib.auth.password_validation import validate_password from django.contrib.sites.shortcuts import get_current_site from django.core.cache import cache from django.core.mail import EmailMessage, EmailMultiAlternatives from django.http import HttpResponse, HttpResponseRedirect from django.shortcuts import resolve_url from django.template import TemplateDoesNotExist from django.template.loader import render_to_string from django.urls import reverse from django.utils import timezone from django.utils.encoding import force_str from django.utils.translation import gettext_lazy as _ from ..utils import ( build_absolute_uri, email_address_exists, generate_unique_username, get_user_model, import_attribute, ) from . import app_settings class DefaultAccountAdapter(object): error_messages = { "username_blacklisted": _( "Username can not be used. Please use other username." ), "username_taken": AbstractUser._meta.get_field("username").error_messages[ "unique" ], "too_many_login_attempts": _( "Too many failed login attempts. Try again later." ), "email_taken": _("A user is already registered with this e-mail address."), } def __init__(self, request=None): self.request = request def stash_verified_email(self, request, email): request.session["account_verified_email"] = email def unstash_verified_email(self, request): ret = request.session.get("account_verified_email") request.session["account_verified_email"] = None return ret def stash_user(self, request, user): request.session["account_user"] = user def unstash_user(self, request): return request.session.pop("account_user", None) def is_email_verified(self, request, email): """ Checks whether or not the email address is already verified beyond allauth scope, for example, by having accepted an invitation before signing up. """ ret = False verified_email = request.session.get("account_verified_email") if verified_email: ret = verified_email.lower() == email.lower() return ret def format_email_subject(self, subject): prefix = app_settings.EMAIL_SUBJECT_PREFIX if prefix is None: site = get_current_site(self.request) prefix = "[{name}] ".format(name=site.name) return prefix + force_str(subject) def get_from_email(self): """ This is a hook that can be overridden to programatically set the 'from' email address for sending emails """ return settings.DEFAULT_FROM_EMAIL def render_mail(self, template_prefix, email, context): """ Renders an e-mail to `email`. `template_prefix` identifies the e-mail that is to be sent, e.g. "account/email/email_confirmation" """ to = [email] if isinstance(email, str) else email subject = render_to_string("{0}_subject.txt".format(template_prefix), context) # remove superfluous line breaks subject = " ".join(subject.splitlines()).strip() subject = self.format_email_subject(subject) from_email = self.get_from_email() bodies = {} for ext in ["html", "txt"]: try: template_name = "{0}_message.{1}".format(template_prefix, ext) bodies[ext] = render_to_string( template_name, context, self.request, ).strip() except TemplateDoesNotExist: if ext == "txt" and not bodies: # We need at least one body raise if "txt" in bodies: msg = EmailMultiAlternatives(subject, bodies["txt"], from_email, to) if "html" in bodies: msg.attach_alternative(bodies["html"], "text/html") else: msg = EmailMessage(subject, bodies["html"], from_email, to) msg.content_subtype = "html" # Main content is now text/html return msg def send_mail(self, template_prefix, email, context): msg = self.render_mail(template_prefix, email, context) msg.send() def get_signup_redirect_url(self, request): return resolve_url(app_settings.SIGNUP_REDIRECT_URL) def get_login_redirect_url(self, request): """ Returns the default URL to redirect to after logging in. Note that URLs passed explicitly (e.g. by passing along a `next` GET parameter) take precedence over the value returned here. """ assert request.user.is_authenticated url = getattr(settings, "LOGIN_REDIRECT_URLNAME", None) if url: warnings.warn( "LOGIN_REDIRECT_URLNAME is deprecated, simply" " use LOGIN_REDIRECT_URL with a URL name", DeprecationWarning, ) else: url = settings.LOGIN_REDIRECT_URL return resolve_url(url) def get_logout_redirect_url(self, request): """ Returns the URL to redirect to after the user logs out. Note that this method is also invoked if you attempt to log out while no users is logged in. Therefore, request.user is not guaranteed to be an authenticated user. """ return resolve_url(app_settings.LOGOUT_REDIRECT_URL) def get_email_confirmation_redirect_url(self, request): """ The URL to return to after successful e-mail confirmation. """ if request.user.is_authenticated: if app_settings.EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL: return app_settings.EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL else: return self.get_login_redirect_url(request) else: return app_settings.EMAIL_CONFIRMATION_ANONYMOUS_REDIRECT_URL def is_open_for_signup(self, request): """ Checks whether or not the site is open for signups. Next to simply returning True/False you can also intervene the regular flow by raising an ImmediateHttpResponse """ return True def new_user(self, request): """ Instantiates a new User instance. """ user = get_user_model()() return user def populate_username(self, request, user): """ Fills in a valid username, if required and missing. If the username is already present it is assumed to be valid (unique). """ from .utils import user_email, user_field, user_username first_name = user_field(user, "first_name") last_name = user_field(user, "last_name") email = user_email(user) username = user_username(user) if app_settings.USER_MODEL_USERNAME_FIELD: user_username( user, username or self.generate_unique_username( [first_name, last_name, email, username, "user"] ), ) def generate_unique_username(self, txts, regex=None): return generate_unique_username(txts, regex) def save_user(self, request, user, form, commit=True): """ Saves a new `User` instance using information provided in the signup form. """ from .utils import user_email, user_field, user_username data = form.cleaned_data first_name = data.get("first_name") last_name = data.get("last_name") email = data.get("email") username = data.get("username") user_email(user, email) user_username(user, username) if first_name: user_field(user, "first_name", first_name) if last_name: user_field(user, "last_name", last_name) if "password1" in data: user.set_password(data["password1"]) else: user.set_unusable_password() self.populate_username(request, user) if commit: # Ability not to commit makes it easier to derive from # this adapter by adding user.save() return user def clean_username(self, username, shallow=False): """ Validates the username. You can hook into this if you want to (dynamically) restrict what usernames can be chosen. """ for validator in app_settings.USERNAME_VALIDATORS: validator(username) # TODO: Add regexp support to USERNAME_BLACKLIST username_blacklist_lower = [ ub.lower() for ub in app_settings.USERNAME_BLACKLIST ] if username.lower() in username_blacklist_lower: raise forms.ValidationError(self.error_messages["username_blacklisted"]) # Skipping database lookups when shallow is True, needed for unique # username generation. if not shallow: from .utils import filter_users_by_username if filter_users_by_username(username).exists(): user_model = get_user_model() username_field = app_settings.USER_MODEL_USERNAME_FIELD error_message = user_model._meta.get_field( username_field ).error_messages.get("unique") if not error_message: error_message = self.error_messages["username_taken"] raise forms.ValidationError( error_message, params={ "model_name": user_model.__name__, "field_label": username_field, }, ) return username def clean_email(self, email): """ Validates an email value. You can hook into this if you want to (dynamically) restrict what email addresses can be chosen. """ return email def clean_password(self, password, user=None): """ Validates a password. You can hook into this if you want to restric the allowed password choices. """ min_length = app_settings.PASSWORD_MIN_LENGTH if min_length and len(password) < min_length: raise forms.ValidationError( _("Password must be a minimum of {0} characters.").format(min_length) ) validate_password(password, user) return password def validate_unique_email(self, email): if email_address_exists(email): raise forms.ValidationError(self.error_messages["email_taken"]) return email def add_message( self, request, level, message_template, message_context=None, extra_tags="", ): """ Wrapper of `django.contrib.messages.add_message`, that reads the message text from a template. """ if "django.contrib.messages" in settings.INSTALLED_APPS: try: if message_context is None: message_context = {} message = render_to_string( message_template, message_context, self.request, ).strip() if message: messages.add_message(request, level, message, extra_tags=extra_tags) except TemplateDoesNotExist: pass def ajax_response(self, request, response, redirect_to=None, form=None, data=None): resp = {} status = response.status_code if redirect_to: status = 200 resp["location"] = redirect_to if form: if request.method == "POST": if form.is_valid(): status = 200 else: status = 400 else: status = 200 resp["form"] = self.ajax_response_form(form) if hasattr(response, "render"): response.render() resp["html"] = response.content.decode("utf8") if data is not None: resp["data"] = data return HttpResponse( json.dumps(resp), status=status, content_type="application/json" ) def ajax_response_form(self, form): form_spec = { "fields": {}, "field_order": [], "errors": form.non_field_errors(), } for field in form: field_spec = { "label": force_str(field.label), "value": field.value(), "help_text": force_str(field.help_text), "errors": [force_str(e) for e in field.errors], "widget": { "attrs": { k: force_str(v) for k, v in field.field.widget.attrs.items() } }, } form_spec["fields"][field.html_name] = field_spec form_spec["field_order"].append(field.html_name) return form_spec def login(self, request, user): # HACK: This is not nice. The proper Django way is to use an # authentication backend if not hasattr(user, "backend"): from .auth_backends import AuthenticationBackend backends = get_backends() backend = None for b in backends: if isinstance(b, AuthenticationBackend): # prefer our own backend backend = b break elif not backend and hasattr(b, "get_user"): # Pick the first valid one backend = b backend_path = ".".join([backend.__module__, backend.__class__.__name__]) user.backend = backend_path django_login(request, user) def logout(self, request): django_logout(request) def confirm_email(self, request, email_address): """ Marks the email address as confirmed on the db """ email_address.verified = True email_address.set_as_primary(conditional=True) email_address.save() def set_password(self, user, password): user.set_password(password) user.save() def get_user_search_fields(self): user = get_user_model()() return filter( lambda a: a and hasattr(user, a), [ app_settings.USER_MODEL_USERNAME_FIELD, "first_name", "last_name", "email", ], ) def is_safe_url(self, url): try: from django.utils.http import url_has_allowed_host_and_scheme except ImportError: from django.utils.http import ( is_safe_url as url_has_allowed_host_and_scheme, ) return url_has_allowed_host_and_scheme(url, allowed_hosts=None) def get_email_confirmation_url(self, request, emailconfirmation): """Constructs the email confirmation (activation) url. Note that if you have architected your system such that email confirmations are sent outside of the request context `request` can be `None` here. """ url = reverse("account_confirm_email", args=[emailconfirmation.key]) ret = build_absolute_uri(request, url) return ret def send_confirmation_mail(self, request, emailconfirmation, signup): current_site = get_current_site(request) activate_url = self.get_email_confirmation_url(request, emailconfirmation) ctx = { "user": emailconfirmation.email_address.user, "activate_url": activate_url, "current_site": current_site, "key": emailconfirmation.key, } if signup: email_template = "account/email/email_confirmation_signup" else: email_template = "account/email/email_confirmation" self.send_mail(email_template, emailconfirmation.email_address.email, ctx) def respond_user_inactive(self, request, user): return HttpResponseRedirect(reverse("account_inactive")) def respond_email_verification_sent(self, request, user): return HttpResponseRedirect(reverse("account_email_verification_sent")) def _get_login_attempts_cache_key(self, request, **credentials): site = get_current_site(request) login = credentials.get("email", credentials.get("username", "")).lower() login_key = hashlib.sha256(login.encode("utf8")).hexdigest() return "allauth/login_attempts@{site_id}:{login}".format( site_id=site.pk, login=login_key ) def _delete_login_attempts_cached_email(self, request, **credentials): if app_settings.LOGIN_ATTEMPTS_LIMIT: cache_key = self._get_login_attempts_cache_key(request, **credentials) cache.delete(cache_key) def pre_authenticate(self, request, **credentials): if app_settings.LOGIN_ATTEMPTS_LIMIT: cache_key = self._get_login_attempts_cache_key(request, **credentials) login_data = cache.get(cache_key, None) if login_data: dt = timezone.now() current_attempt_time = time.mktime(dt.timetuple()) if len( login_data ) >= app_settings.LOGIN_ATTEMPTS_LIMIT and current_attempt_time < ( login_data[-1] + app_settings.LOGIN_ATTEMPTS_TIMEOUT ): raise forms.ValidationError( self.error_messages["too_many_login_attempts"] ) def authenticate(self, request, **credentials): """Only authenticates, does not actually login. See `login`""" from allauth.account.auth_backends import AuthenticationBackend self.pre_authenticate(request, **credentials) AuthenticationBackend.unstash_authenticated_user() user = authenticate(request, **credentials) alt_user = AuthenticationBackend.unstash_authenticated_user() user = user or alt_user if user and app_settings.LOGIN_ATTEMPTS_LIMIT: self._delete_login_attempts_cached_email(request, **credentials) else: self.authentication_failed(request, **credentials) return user def authentication_failed(self, request, **credentials): if app_settings.LOGIN_ATTEMPTS_LIMIT: cache_key = self._get_login_attempts_cache_key(request, **credentials) data = cache.get(cache_key, []) dt = timezone.now() data.append(time.mktime(dt.timetuple())) cache.set(cache_key, data, app_settings.LOGIN_ATTEMPTS_TIMEOUT) def is_ajax(self, request): return any( [ request.META.get("HTTP_X_REQUESTED_WITH") == "XMLHttpRequest", request.content_type == "application/json", request.META.get("HTTP_ACCEPT") == "application/json", ] ) def get_adapter(request=None): return import_attribute(app_settings.ADAPTER)(request) django-allauth-0.47.0/allauth/account/admin.py000066400000000000000000000020711415442050100212200ustar00rootroot00000000000000from django.contrib import admin from . import app_settings from .adapter import get_adapter from .models import EmailAddress, EmailConfirmation class EmailAddressAdmin(admin.ModelAdmin): list_display = ("email", "user", "primary", "verified") list_filter = ("primary", "verified") search_fields = [] raw_id_fields = ("user",) actions = ["make_verified"] def get_search_fields(self, request): base_fields = get_adapter(request).get_user_search_fields() return ["email"] + list(map(lambda a: "user__" + a, base_fields)) def make_verified(self, request, queryset): queryset.update(verified=True) make_verified.short_description = "Mark selected email addresses as verified" class EmailConfirmationAdmin(admin.ModelAdmin): list_display = ("email_address", "created", "sent", "key") list_filter = ("sent",) raw_id_fields = ("email_address",) if not app_settings.EMAIL_CONFIRMATION_HMAC: admin.site.register(EmailConfirmation, EmailConfirmationAdmin) admin.site.register(EmailAddress, EmailAddressAdmin) django-allauth-0.47.0/allauth/account/app_settings.py000066400000000000000000000246431415442050100226410ustar00rootroot00000000000000class AppSettings(object): class AuthenticationMethod: USERNAME = "username" EMAIL = "email" USERNAME_EMAIL = "username_email" class EmailVerificationMethod: # After signing up, keep the user account inactive until the email # address is verified MANDATORY = "mandatory" # Allow login with unverified e-mail (e-mail verification is # still sent) OPTIONAL = "optional" # Don't send e-mail verification mails during signup NONE = "none" def __init__(self, prefix): self.prefix = prefix # If login is by email, email must be required assert ( not self.AUTHENTICATION_METHOD == self.AuthenticationMethod.EMAIL ) or self.EMAIL_REQUIRED # If login includes email, login must be unique assert ( self.AUTHENTICATION_METHOD == self.AuthenticationMethod.USERNAME ) or self.UNIQUE_EMAIL assert ( self.EMAIL_VERIFICATION != self.EmailVerificationMethod.MANDATORY ) or self.EMAIL_REQUIRED if not self.USER_MODEL_USERNAME_FIELD: assert not self.USERNAME_REQUIRED assert self.AUTHENTICATION_METHOD not in ( self.AuthenticationMethod.USERNAME, self.AuthenticationMethod.USERNAME_EMAIL, ) if self.MAX_EMAIL_ADDRESSES is not None: assert self.MAX_EMAIL_ADDRESSES > 0 def _setting(self, name, dflt): from django.conf import settings getter = getattr( settings, "ALLAUTH_SETTING_GETTER", lambda name, dflt: getattr(settings, name, dflt), ) return getter(self.prefix + name, dflt) @property def DEFAULT_HTTP_PROTOCOL(self): return self._setting("DEFAULT_HTTP_PROTOCOL", "http").lower() @property def EMAIL_CONFIRMATION_EXPIRE_DAYS(self): """ Determines the expiration date of e-mail confirmation mails (# of days) """ from django.conf import settings return self._setting( "EMAIL_CONFIRMATION_EXPIRE_DAYS", getattr(settings, "EMAIL_CONFIRMATION_DAYS", 3), ) @property def EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL(self): """ The URL to redirect to after a successful e-mail confirmation, in case of an authenticated user """ return self._setting("EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL", None) @property def EMAIL_CONFIRMATION_ANONYMOUS_REDIRECT_URL(self): """ The URL to redirect to after a successful e-mail confirmation, in case no user is logged in """ from django.conf import settings return self._setting( "EMAIL_CONFIRMATION_ANONYMOUS_REDIRECT_URL", settings.LOGIN_URL ) @property def EMAIL_CONFIRMATION_COOLDOWN(self): """ The cooldown in seconds during which, after an email confirmation has been sent, a second confirmation email will not be sent. """ return self._setting("EMAIL_CONFIRMATION_COOLDOWN", 3 * 60) @property def EMAIL_REQUIRED(self): """ The user is required to hand over an e-mail address when signing up """ return self._setting("EMAIL_REQUIRED", False) @property def EMAIL_VERIFICATION(self): """ See e-mail verification method """ ret = self._setting("EMAIL_VERIFICATION", self.EmailVerificationMethod.OPTIONAL) # Deal with legacy (boolean based) setting if ret is True: ret = self.EmailVerificationMethod.MANDATORY elif ret is False: ret = self.EmailVerificationMethod.OPTIONAL return ret @property def MAX_EMAIL_ADDRESSES(self): return self._setting("MAX_EMAIL_ADDRESSES", None) @property def AUTHENTICATION_METHOD(self): ret = self._setting("AUTHENTICATION_METHOD", self.AuthenticationMethod.USERNAME) return ret @property def EMAIL_MAX_LENGTH(self): """ Adjust max_length of e-mail addresses """ return self._setting("EMAIL_MAX_LENGTH", 254) @property def UNIQUE_EMAIL(self): """ Enforce uniqueness of e-mail addresses """ return self._setting("UNIQUE_EMAIL", True) @property def SIGNUP_EMAIL_ENTER_TWICE(self): """ Signup email verification """ return self._setting("SIGNUP_EMAIL_ENTER_TWICE", False) @property def SIGNUP_PASSWORD_ENTER_TWICE(self): """ Signup password verification """ legacy = self._setting("SIGNUP_PASSWORD_VERIFICATION", True) return self._setting("SIGNUP_PASSWORD_ENTER_TWICE", legacy) @property def SIGNUP_REDIRECT_URL(self): from django.conf import settings return self._setting("SIGNUP_REDIRECT_URL", settings.LOGIN_REDIRECT_URL) @property def PASSWORD_MIN_LENGTH(self): """ Minimum password Length """ from django.conf import settings ret = None if not settings.AUTH_PASSWORD_VALIDATORS: ret = self._setting("PASSWORD_MIN_LENGTH", 6) return ret @property def EMAIL_SUBJECT_PREFIX(self): """ Subject-line prefix to use for email messages sent """ return self._setting("EMAIL_SUBJECT_PREFIX", None) @property def SIGNUP_FORM_CLASS(self): """ Signup form """ return self._setting("SIGNUP_FORM_CLASS", None) @property def USERNAME_REQUIRED(self): """ The user is required to enter a username when signing up """ return self._setting("USERNAME_REQUIRED", True) @property def USERNAME_MIN_LENGTH(self): """ Minimum username Length """ return self._setting("USERNAME_MIN_LENGTH", 1) @property def USERNAME_BLACKLIST(self): """ List of usernames that are not allowed """ return self._setting("USERNAME_BLACKLIST", []) @property def PASSWORD_INPUT_RENDER_VALUE(self): """ render_value parameter as passed to PasswordInput fields """ return self._setting("PASSWORD_INPUT_RENDER_VALUE", False) @property def ADAPTER(self): return self._setting("ADAPTER", "allauth.account.adapter.DefaultAccountAdapter") @property def CONFIRM_EMAIL_ON_GET(self): return self._setting("CONFIRM_EMAIL_ON_GET", False) @property def AUTHENTICATED_LOGIN_REDIRECTS(self): return self._setting("AUTHENTICATED_LOGIN_REDIRECTS", True) @property def LOGIN_ON_EMAIL_CONFIRMATION(self): """ Automatically log the user in once they confirmed their email address """ return self._setting("LOGIN_ON_EMAIL_CONFIRMATION", False) @property def LOGIN_ON_PASSWORD_RESET(self): """ Automatically log the user in immediately after resetting their password. """ return self._setting("LOGIN_ON_PASSWORD_RESET", False) @property def LOGOUT_REDIRECT_URL(self): from django.conf import settings return self._setting("LOGOUT_REDIRECT_URL", settings.LOGOUT_REDIRECT_URL or "/") @property def LOGOUT_ON_GET(self): return self._setting("LOGOUT_ON_GET", False) @property def LOGOUT_ON_PASSWORD_CHANGE(self): return self._setting("LOGOUT_ON_PASSWORD_CHANGE", False) @property def USER_MODEL_USERNAME_FIELD(self): return self._setting("USER_MODEL_USERNAME_FIELD", "username") @property def USER_MODEL_EMAIL_FIELD(self): return self._setting("USER_MODEL_EMAIL_FIELD", "email") @property def SESSION_COOKIE_AGE(self): """ Deprecated -- use Django's settings.SESSION_COOKIE_AGE instead """ from django.conf import settings return self._setting("SESSION_COOKIE_AGE", settings.SESSION_COOKIE_AGE) @property def SESSION_REMEMBER(self): """ Controls the life time of the session. Set to `None` to ask the user ("Remember me?"), `False` to not remember, and `True` to always remember. """ return self._setting("SESSION_REMEMBER", None) @property def TEMPLATE_EXTENSION(self): """ A string defining the template extension to use, defaults to `html`. """ return self._setting("TEMPLATE_EXTENSION", "html") @property def FORMS(self): return self._setting("FORMS", {}) @property def LOGIN_ATTEMPTS_LIMIT(self): """ Number of failed login attempts. When this number is exceeded, the user is prohibited from logging in for the specified `LOGIN_ATTEMPTS_TIMEOUT` """ return self._setting("LOGIN_ATTEMPTS_LIMIT", 5) @property def LOGIN_ATTEMPTS_TIMEOUT(self): """ Time period from last unsuccessful login attempt, during which the user is prohibited from trying to log in. Defaults to 5 minutes. """ return self._setting("LOGIN_ATTEMPTS_TIMEOUT", 60 * 5) @property def EMAIL_CONFIRMATION_HMAC(self): return self._setting("EMAIL_CONFIRMATION_HMAC", True) @property def SALT(self): return self._setting("SALT", "account") @property def PRESERVE_USERNAME_CASING(self): return self._setting("PRESERVE_USERNAME_CASING", True) @property def USERNAME_VALIDATORS(self): from django.core.exceptions import ImproperlyConfigured from allauth.utils import get_user_model, import_attribute path = self._setting("USERNAME_VALIDATORS", None) if path: ret = import_attribute(path) if not isinstance(ret, list): raise ImproperlyConfigured( "ACCOUNT_USERNAME_VALIDATORS is expected to be a list" ) else: if self.USER_MODEL_USERNAME_FIELD is not None: ret = ( get_user_model() ._meta.get_field(self.USER_MODEL_USERNAME_FIELD) .validators ) else: ret = [] return ret # Ugly? Guido recommends this himself ... # http://mail.python.org/pipermail/python-ideas/2012-May/014969.html import sys # noqa app_settings = AppSettings("ACCOUNT_") app_settings.__name__ = __name__ sys.modules[__name__] = app_settings django-allauth-0.47.0/allauth/account/apps.py000066400000000000000000000003571415442050100211000ustar00rootroot00000000000000from django.apps import AppConfig from django.utils.translation import gettext_lazy as _ class AccountConfig(AppConfig): name = "allauth.account" verbose_name = _("Accounts") default_auto_field = "django.db.models.AutoField" django-allauth-0.47.0/allauth/account/auth_backends.py000066400000000000000000000073271415442050100227340ustar00rootroot00000000000000from threading import local from django.contrib.auth.backends import ModelBackend from ..utils import get_user_model from . import app_settings from .app_settings import AuthenticationMethod from .utils import filter_users_by_email, filter_users_by_username _stash = local() class AuthenticationBackend(ModelBackend): def authenticate(self, request, **credentials): ret = None if app_settings.AUTHENTICATION_METHOD == AuthenticationMethod.EMAIL: ret = self._authenticate_by_email(**credentials) elif app_settings.AUTHENTICATION_METHOD == AuthenticationMethod.USERNAME_EMAIL: ret = self._authenticate_by_email(**credentials) if not ret: ret = self._authenticate_by_username(**credentials) else: ret = self._authenticate_by_username(**credentials) return ret def _authenticate_by_username(self, **credentials): username_field = app_settings.USER_MODEL_USERNAME_FIELD username = credentials.get("username") password = credentials.get("password") User = get_user_model() if not username_field or username is None or password is None: return None try: # Username query is case insensitive user = filter_users_by_username(username).get() if self._check_password(user, password): return user except User.DoesNotExist: return None def _authenticate_by_email(self, **credentials): # Even though allauth will pass along `email`, other apps may # not respect this setting. For example, when using # django-tastypie basic authentication, the login is always # passed as `username`. So let's play nice with other apps # and use username as fallback email = credentials.get("email", credentials.get("username")) if email: for user in filter_users_by_email(email): if self._check_password(user, credentials["password"]): return user return None def _check_password(self, user, password): ret = user.check_password(password) if ret: ret = self.user_can_authenticate(user) if not ret: self._stash_user(user) return ret @classmethod def _stash_user(cls, user): """Now, be aware, the following is quite ugly, let me explain: Even if the user credentials match, the authentication can fail because Django's default ModelBackend calls user_can_authenticate(), which checks `is_active`. Now, earlier versions of allauth did not do this and simply returned the user as authenticated, even in case of `is_active=False`. For allauth scope, this does not pose a problem, as these users are properly redirected to an account inactive page. This does pose a problem when the allauth backend is used in a different context where allauth is not responsible for the login. Then, by not checking on `user_can_authenticate()` users will allow to become authenticated whereas according to Django logic this should not be allowed. In order to preserve the allauth behavior while respecting Django's logic, we stash a user for which the password check succeeded but `user_can_authenticate()` failed. In the allauth authentication logic, we can then unstash this user and proceed pointing the user to the account inactive page. """ global _stash ret = getattr(_stash, "user", None) _stash.user = user return ret @classmethod def unstash_authenticated_user(cls): return cls._stash_user(None) django-allauth-0.47.0/allauth/account/decorators.py000066400000000000000000000027371415442050100223060ustar00rootroot00000000000000from django.contrib.auth import REDIRECT_FIELD_NAME from django.contrib.auth.decorators import login_required from django.shortcuts import render from .models import EmailAddress from .utils import send_email_confirmation def verified_email_required( function=None, login_url=None, redirect_field_name=REDIRECT_FIELD_NAME ): """ Even when email verification is not mandatory during signup, there may be circumstances during which you really want to prevent unverified users to proceed. This decorator ensures the user is authenticated and has a verified email address. If the former is not the case then the behavior is identical to that of the standard `login_required` decorator. If the latter does not hold, email verification mails are automatically resend and the user is presented with a page informing them they needs to verify their email address. """ def decorator(view_func): @login_required(redirect_field_name=redirect_field_name, login_url=login_url) def _wrapped_view(request, *args, **kwargs): if not EmailAddress.objects.filter( user=request.user, verified=True ).exists(): send_email_confirmation(request, request.user) return render(request, "account/verified_email_required.html") return view_func(request, *args, **kwargs) return _wrapped_view if function: return decorator(function) return decorator django-allauth-0.47.0/allauth/account/forms.py000066400000000000000000000523351415442050100212660ustar00rootroot00000000000000from __future__ import absolute_import import warnings from importlib import import_module from django import forms from django.contrib.auth.tokens import PasswordResetTokenGenerator from django.contrib.sites.shortcuts import get_current_site from django.core import exceptions, validators from django.urls import reverse from django.utils.translation import gettext, gettext_lazy as _, pgettext from ..utils import ( build_absolute_uri, get_username_max_length, set_form_field_order, ) from . import app_settings from .adapter import get_adapter from .app_settings import AuthenticationMethod from .models import EmailAddress from .utils import ( filter_users_by_email, get_user_model, perform_login, setup_user_email, sync_user_email_addresses, url_str_to_user_pk, user_email, user_pk_to_url_str, user_username, ) class EmailAwarePasswordResetTokenGenerator(PasswordResetTokenGenerator): def _make_hash_value(self, user, timestamp): ret = super(EmailAwarePasswordResetTokenGenerator, self)._make_hash_value( user, timestamp ) sync_user_email_addresses(user) email = user_email(user) emails = set([email] if email else []) emails.update( EmailAddress.objects.filter(user=user).values_list("email", flat=True) ) ret += "|".join(sorted(emails)) return ret default_token_generator = EmailAwarePasswordResetTokenGenerator() class PasswordVerificationMixin(object): def clean(self): cleaned_data = super(PasswordVerificationMixin, self).clean() password1 = cleaned_data.get("password1") password2 = cleaned_data.get("password2") if (password1 and password2) and password1 != password2: self.add_error("password2", _("You must type the same password each time.")) return cleaned_data class PasswordField(forms.CharField): def __init__(self, *args, **kwargs): render_value = kwargs.pop( "render_value", app_settings.PASSWORD_INPUT_RENDER_VALUE ) kwargs["widget"] = forms.PasswordInput( render_value=render_value, attrs={"placeholder": kwargs.get("label")}, ) autocomplete = kwargs.pop("autocomplete", None) if autocomplete is not None: kwargs["widget"].attrs["autocomplete"] = autocomplete super(PasswordField, self).__init__(*args, **kwargs) class SetPasswordField(PasswordField): def __init__(self, *args, **kwargs): kwargs["autocomplete"] = "new-password" super(SetPasswordField, self).__init__(*args, **kwargs) self.user = None def clean(self, value): value = super(SetPasswordField, self).clean(value) value = get_adapter().clean_password(value, user=self.user) return value class LoginForm(forms.Form): password = PasswordField(label=_("Password"), autocomplete="current-password") remember = forms.BooleanField(label=_("Remember Me"), required=False) user = None error_messages = { "account_inactive": _("This account is currently inactive."), "email_password_mismatch": _( "The e-mail address and/or password you specified are not correct." ), "username_password_mismatch": _( "The username and/or password you specified are not correct." ), } def __init__(self, *args, **kwargs): self.request = kwargs.pop("request", None) super(LoginForm, self).__init__(*args, **kwargs) if app_settings.AUTHENTICATION_METHOD == AuthenticationMethod.EMAIL: login_widget = forms.TextInput( attrs={ "type": "email", "placeholder": _("E-mail address"), "autocomplete": "email", } ) login_field = forms.EmailField(label=_("E-mail"), widget=login_widget) elif app_settings.AUTHENTICATION_METHOD == AuthenticationMethod.USERNAME: login_widget = forms.TextInput( attrs={"placeholder": _("Username"), "autocomplete": "username"} ) login_field = forms.CharField( label=_("Username"), widget=login_widget, max_length=get_username_max_length(), ) else: assert ( app_settings.AUTHENTICATION_METHOD == AuthenticationMethod.USERNAME_EMAIL ) login_widget = forms.TextInput( attrs={"placeholder": _("Username or e-mail"), "autocomplete": "email"} ) login_field = forms.CharField( label=pgettext("field label", "Login"), widget=login_widget ) self.fields["login"] = login_field set_form_field_order(self, ["login", "password", "remember"]) if app_settings.SESSION_REMEMBER is not None: del self.fields["remember"] def user_credentials(self): """ Provides the credentials required to authenticate the user for login. """ credentials = {} login = self.cleaned_data["login"] if app_settings.AUTHENTICATION_METHOD == AuthenticationMethod.EMAIL: credentials["email"] = login elif app_settings.AUTHENTICATION_METHOD == AuthenticationMethod.USERNAME: credentials["username"] = login else: if self._is_login_email(login): credentials["email"] = login credentials["username"] = login credentials["password"] = self.cleaned_data["password"] return credentials def clean_login(self): login = self.cleaned_data["login"] return login.strip() def _is_login_email(self, login): try: validators.validate_email(login) ret = True except exceptions.ValidationError: ret = False return ret def clean(self): super(LoginForm, self).clean() if self._errors: return credentials = self.user_credentials() user = get_adapter(self.request).authenticate(self.request, **credentials) if user: self.user = user else: auth_method = app_settings.AUTHENTICATION_METHOD if auth_method == app_settings.AuthenticationMethod.USERNAME_EMAIL: login = self.cleaned_data["login"] if self._is_login_email(login): auth_method = app_settings.AuthenticationMethod.EMAIL else: auth_method = app_settings.AuthenticationMethod.USERNAME raise forms.ValidationError( self.error_messages["%s_password_mismatch" % auth_method] ) return self.cleaned_data def login(self, request, redirect_url=None): email = self.user_credentials().get("email") ret = perform_login( request, self.user, email_verification=app_settings.EMAIL_VERIFICATION, redirect_url=redirect_url, email=email, ) remember = app_settings.SESSION_REMEMBER if remember is None: remember = self.cleaned_data["remember"] if remember: request.session.set_expiry(app_settings.SESSION_COOKIE_AGE) else: request.session.set_expiry(0) return ret class _DummyCustomSignupForm(forms.Form): def signup(self, request, user): """ Invoked at signup time to complete the signup of the user. """ pass def _base_signup_form_class(): """ Currently, we inherit from the custom form, if any. This is all not very elegant, though it serves a purpose: - There are two signup forms: one for local accounts, and one for social accounts - Both share a common base (BaseSignupForm) - Given the above, how to put in a custom signup form? Which form would your custom form derive from, the local or the social one? """ if not app_settings.SIGNUP_FORM_CLASS: return _DummyCustomSignupForm try: fc_module, fc_classname = app_settings.SIGNUP_FORM_CLASS.rsplit(".", 1) except ValueError: raise exceptions.ImproperlyConfigured( "%s does not point to a form class" % app_settings.SIGNUP_FORM_CLASS ) try: mod = import_module(fc_module) except ImportError as e: raise exceptions.ImproperlyConfigured( "Error importing form class %s:" ' "%s"' % (fc_module, e) ) try: fc_class = getattr(mod, fc_classname) except AttributeError: raise exceptions.ImproperlyConfigured( 'Module "%s" does not define a' ' "%s" class' % (fc_module, fc_classname) ) if not hasattr(fc_class, "signup"): if hasattr(fc_class, "save"): warnings.warn( "The custom signup form must offer" " a `def signup(self, request, user)` method", DeprecationWarning, ) else: raise exceptions.ImproperlyConfigured( 'The custom signup form must implement a "signup" method' ) return fc_class class BaseSignupForm(_base_signup_form_class()): username = forms.CharField( label=_("Username"), min_length=app_settings.USERNAME_MIN_LENGTH, widget=forms.TextInput( attrs={"placeholder": _("Username"), "autocomplete": "username"} ), ) email = forms.EmailField( widget=forms.TextInput( attrs={ "type": "email", "placeholder": _("E-mail address"), "autocomplete": "email", } ) ) def __init__(self, *args, **kwargs): email_required = kwargs.pop("email_required", app_settings.EMAIL_REQUIRED) self.username_required = kwargs.pop( "username_required", app_settings.USERNAME_REQUIRED ) super(BaseSignupForm, self).__init__(*args, **kwargs) username_field = self.fields["username"] username_field.max_length = get_username_max_length() username_field.validators.append( validators.MaxLengthValidator(username_field.max_length) ) username_field.widget.attrs["maxlength"] = str(username_field.max_length) default_field_order = [ "email", "email2", # ignored when not present "username", "password1", "password2", # ignored when not present ] if app_settings.SIGNUP_EMAIL_ENTER_TWICE: self.fields["email2"] = forms.EmailField( label=_("E-mail (again)"), widget=forms.TextInput( attrs={ "type": "email", "placeholder": _("E-mail address confirmation"), } ), ) if email_required: self.fields["email"].label = gettext("E-mail") self.fields["email"].required = True else: self.fields["email"].label = gettext("E-mail (optional)") self.fields["email"].required = False self.fields["email"].widget.is_required = False if self.username_required: default_field_order = [ "username", "email", "email2", # ignored when not present "password1", "password2", # ignored when not present ] if not self.username_required: del self.fields["username"] set_form_field_order( self, getattr(self, "field_order", None) or default_field_order ) def clean_username(self): value = self.cleaned_data["username"] value = get_adapter().clean_username(value) return value def clean_email(self): value = self.cleaned_data["email"] value = get_adapter().clean_email(value) if value and app_settings.UNIQUE_EMAIL: value = self.validate_unique_email(value) return value def validate_unique_email(self, value): return get_adapter().validate_unique_email(value) def clean(self): cleaned_data = super(BaseSignupForm, self).clean() if app_settings.SIGNUP_EMAIL_ENTER_TWICE: email = cleaned_data.get("email") email2 = cleaned_data.get("email2") if (email and email2) and email != email2: self.add_error("email2", _("You must type the same email each time.")) return cleaned_data def custom_signup(self, request, user): custom_form = super(BaseSignupForm, self) if hasattr(custom_form, "signup") and callable(custom_form.signup): custom_form.signup(request, user) else: warnings.warn( "The custom signup form must offer" " a `def signup(self, request, user)` method", DeprecationWarning, ) # Historically, it was called .save, but this is confusing # in case of ModelForm custom_form.save(user) class SignupForm(BaseSignupForm): def __init__(self, *args, **kwargs): super(SignupForm, self).__init__(*args, **kwargs) self.fields["password1"] = PasswordField( label=_("Password"), autocomplete="new-password" ) if app_settings.SIGNUP_PASSWORD_ENTER_TWICE: self.fields["password2"] = PasswordField(label=_("Password (again)")) if hasattr(self, "field_order"): set_form_field_order(self, self.field_order) def clean(self): super(SignupForm, self).clean() # `password` cannot be of type `SetPasswordField`, as we don't # have a `User` yet. So, let's populate a dummy user to be used # for password validaton. dummy_user = get_user_model() user_username(dummy_user, self.cleaned_data.get("username")) user_email(dummy_user, self.cleaned_data.get("email")) password = self.cleaned_data.get("password1") if password: try: get_adapter().clean_password(password, user=dummy_user) except forms.ValidationError as e: self.add_error("password1", e) if ( app_settings.SIGNUP_PASSWORD_ENTER_TWICE and "password1" in self.cleaned_data and "password2" in self.cleaned_data ): if self.cleaned_data["password1"] != self.cleaned_data["password2"]: self.add_error( "password2", _("You must type the same password each time."), ) return self.cleaned_data def save(self, request): adapter = get_adapter(request) user = adapter.new_user(request) adapter.save_user(request, user, self) self.custom_signup(request, user) # TODO: Move into adapter `save_user` ? setup_user_email(request, user, []) return user class UserForm(forms.Form): def __init__(self, user=None, *args, **kwargs): self.user = user super(UserForm, self).__init__(*args, **kwargs) class AddEmailForm(UserForm): email = forms.EmailField( label=_("E-mail"), required=True, widget=forms.TextInput( attrs={"type": "email", "placeholder": _("E-mail address")} ), ) def clean_email(self): value = self.cleaned_data["email"] value = get_adapter().clean_email(value) errors = { "this_account": _( "This e-mail address is already associated with this account." ), "different_account": _( "This e-mail address is already associated with another account." ), "max_email_addresses": _("You cannot add more than %d e-mail addresses."), } users = filter_users_by_email(value) on_this_account = [u for u in users if u.pk == self.user.pk] on_diff_account = [u for u in users if u.pk != self.user.pk] if on_this_account: raise forms.ValidationError(errors["this_account"]) if on_diff_account and app_settings.UNIQUE_EMAIL: raise forms.ValidationError(errors["different_account"]) if not EmailAddress.objects.can_add_email(self.user): raise forms.ValidationError( errors["max_email_addresses"] % app_settings.MAX_EMAIL_ADDRESSES ) return value def save(self, request): return EmailAddress.objects.add_email( request, self.user, self.cleaned_data["email"], confirm=True ) class ChangePasswordForm(PasswordVerificationMixin, UserForm): oldpassword = PasswordField( label=_("Current Password"), autocomplete="current-password" ) password1 = SetPasswordField(label=_("New Password")) password2 = PasswordField(label=_("New Password (again)")) def __init__(self, *args, **kwargs): super(ChangePasswordForm, self).__init__(*args, **kwargs) self.fields["password1"].user = self.user def clean_oldpassword(self): if not self.user.check_password(self.cleaned_data.get("oldpassword")): raise forms.ValidationError(_("Please type your current password.")) return self.cleaned_data["oldpassword"] def save(self): get_adapter().set_password(self.user, self.cleaned_data["password1"]) class SetPasswordForm(PasswordVerificationMixin, UserForm): password1 = SetPasswordField(label=_("Password")) password2 = PasswordField(label=_("Password (again)")) def __init__(self, *args, **kwargs): super(SetPasswordForm, self).__init__(*args, **kwargs) self.fields["password1"].user = self.user def save(self): get_adapter().set_password(self.user, self.cleaned_data["password1"]) class ResetPasswordForm(forms.Form): email = forms.EmailField( label=_("E-mail"), required=True, widget=forms.TextInput( attrs={ "type": "email", "placeholder": _("E-mail address"), "autocomplete": "email", } ), ) def clean_email(self): email = self.cleaned_data["email"] email = get_adapter().clean_email(email) self.users = filter_users_by_email(email, is_active=True) if not self.users: raise forms.ValidationError( _("The e-mail address is not assigned to any user account") ) return self.cleaned_data["email"] def save(self, request, **kwargs): current_site = get_current_site(request) email = self.cleaned_data["email"] token_generator = kwargs.get("token_generator", default_token_generator) for user in self.users: temp_key = token_generator.make_token(user) # save it to the password reset model # password_reset = PasswordReset(user=user, temp_key=temp_key) # password_reset.save() # send the password reset email path = reverse( "account_reset_password_from_key", kwargs=dict(uidb36=user_pk_to_url_str(user), key=temp_key), ) url = build_absolute_uri(request, path) context = { "current_site": current_site, "user": user, "password_reset_url": url, "request": request, } if app_settings.AUTHENTICATION_METHOD != AuthenticationMethod.EMAIL: context["username"] = user_username(user) get_adapter(request).send_mail( "account/email/password_reset_key", email, context ) return self.cleaned_data["email"] class ResetPasswordKeyForm(PasswordVerificationMixin, forms.Form): password1 = SetPasswordField(label=_("New Password")) password2 = PasswordField(label=_("New Password (again)")) def __init__(self, *args, **kwargs): self.user = kwargs.pop("user", None) self.temp_key = kwargs.pop("temp_key", None) super(ResetPasswordKeyForm, self).__init__(*args, **kwargs) self.fields["password1"].user = self.user def save(self): get_adapter().set_password(self.user, self.cleaned_data["password1"]) class UserTokenForm(forms.Form): uidb36 = forms.CharField() key = forms.CharField() reset_user = None token_generator = default_token_generator error_messages = { "token_invalid": _("The password reset token was invalid."), } def _get_user(self, uidb36): User = get_user_model() try: pk = url_str_to_user_pk(uidb36) return User.objects.get(pk=pk) except (ValueError, User.DoesNotExist): return None def clean(self): cleaned_data = super(UserTokenForm, self).clean() uidb36 = cleaned_data.get("uidb36", None) key = cleaned_data.get("key", None) if not key: raise forms.ValidationError(self.error_messages["token_invalid"]) self.reset_user = self._get_user(uidb36) if self.reset_user is None or not self.token_generator.check_token( self.reset_user, key ): raise forms.ValidationError(self.error_messages["token_invalid"]) return cleaned_data django-allauth-0.47.0/allauth/account/management/000077500000000000000000000000001415442050100216725ustar00rootroot00000000000000django-allauth-0.47.0/allauth/account/management/__init__.py000066400000000000000000000000001415442050100237710ustar00rootroot00000000000000django-allauth-0.47.0/allauth/account/management/commands/000077500000000000000000000000001415442050100234735ustar00rootroot00000000000000django-allauth-0.47.0/allauth/account/management/commands/__init__.py000066400000000000000000000000001415442050100255720ustar00rootroot00000000000000django-allauth-0.47.0/allauth/account/management/commands/account_unsetmultipleprimaryemails.py000066400000000000000000000032201415442050100332670ustar00rootroot00000000000000from django.core.management.base import BaseCommand from django.db.models import Count from allauth.account.models import EmailAddress from allauth.account.utils import user_email from allauth.utils import get_user_model class Command(BaseCommand): def handle(self, *args, **options): for user in self.get_users_with_multiple_primary_email(): self.unprimary_extra_primary_emails(user) def get_users_with_multiple_primary_email(self): user_pks = [] for email_address_dict in ( EmailAddress.objects.filter(primary=True) .values("user") .annotate(Count("user")) .filter(user__count__gt=1) ): user_pks.append(email_address_dict["user"]) return get_user_model().objects.filter(pk__in=user_pks) def unprimary_extra_primary_emails(self, user): primary_email_addresses = EmailAddress.objects.filter(user=user, primary=True) for primary_email_address in primary_email_addresses: if primary_email_address.email == user_email(user): break else: # Didn't find the main email addresses and break the for loop print( "WARNING: Multiple primary without a user.email match for" "user pk %s; (tried: %s, using: %s)" ) % ( user.pk, ", ".join( [email_address.email for email_address in primary_email_addresses] ), primary_email_address, ) primary_email_addresses.exclude(pk=primary_email_address.pk).update( primary=False ) django-allauth-0.47.0/allauth/account/managers.py000066400000000000000000000051231415442050100217260ustar00rootroot00000000000000from datetime import timedelta from django.db import models from django.db.models import Q from django.utils import timezone from . import app_settings class EmailAddressManager(models.Manager): def can_add_email(self, user): ret = True if app_settings.MAX_EMAIL_ADDRESSES: count = self.filter(user=user).count() ret = count < app_settings.MAX_EMAIL_ADDRESSES return ret def add_email(self, request, user, email, confirm=False, signup=False): email_address, created = self.get_or_create( user=user, email__iexact=email, defaults={"email": email} ) if created and confirm: email_address.send_confirmation(request, signup=signup) return email_address def get_primary(self, user): try: return self.get(user=user, primary=True) except self.model.DoesNotExist: return None def get_users_for(self, email): # this is a list rather than a generator because we probably want to # do a len() on it right away return [ address.user for address in self.filter(verified=True, email__iexact=email) ] def fill_cache_for_user(self, user, addresses): """ In a multi-db setup, inserting records and re-reading them later on may result in not being able to find newly inserted records. Therefore, we maintain a cache for the user so that we can avoid database access when we need to re-read.. """ user._emailaddress_cache = addresses def get_for_user(self, user, email): cache_key = "_emailaddress_cache" addresses = getattr(user, cache_key, None) if addresses is None: ret = self.get(user=user, email__iexact=email) # To avoid additional lookups when e.g. # EmailAddress.set_as_primary() starts touching self.user ret.user = user return ret else: for address in addresses: if address.email.lower() == email.lower(): return address raise self.model.DoesNotExist() class EmailConfirmationManager(models.Manager): def all_expired(self): return self.filter(self.expired_q()) def all_valid(self): return self.exclude(self.expired_q()) def expired_q(self): sent_threshold = timezone.now() - timedelta( days=app_settings.EMAIL_CONFIRMATION_EXPIRE_DAYS ) return Q(sent__lt=sent_threshold) def delete_expired_confirmations(self): self.all_expired().delete() django-allauth-0.47.0/allauth/account/migrations/000077500000000000000000000000001415442050100217325ustar00rootroot00000000000000django-allauth-0.47.0/allauth/account/migrations/0001_initial.py000066400000000000000000000065011415442050100243770ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals import django.utils.timezone from django.conf import settings from django.db import migrations, models UNIQUE_EMAIL = getattr(settings, "ACCOUNT_UNIQUE_EMAIL", True) class Migration(migrations.Migration): dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( name="EmailAddress", fields=[ ( "id", models.AutoField( verbose_name="ID", serialize=False, auto_created=True, primary_key=True, ), ), ( "email", models.EmailField( unique=UNIQUE_EMAIL, max_length=75, verbose_name="e-mail address", ), ), ( "verified", models.BooleanField(default=False, verbose_name="verified"), ), ( "primary", models.BooleanField(default=False, verbose_name="primary"), ), ( "user", models.ForeignKey( verbose_name="user", to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE, ), ), ], options={ "verbose_name": "email address", "verbose_name_plural": "email addresses", }, bases=(models.Model,), ), migrations.CreateModel( name="EmailConfirmation", fields=[ ( "id", models.AutoField( verbose_name="ID", serialize=False, auto_created=True, primary_key=True, ), ), ( "created", models.DateTimeField( default=django.utils.timezone.now, verbose_name="created", ), ), ("sent", models.DateTimeField(null=True, verbose_name="sent")), ( "key", models.CharField(unique=True, max_length=64, verbose_name="key"), ), ( "email_address", models.ForeignKey( verbose_name="e-mail address", to="account.EmailAddress", on_delete=models.CASCADE, ), ), ], options={ "verbose_name": "email confirmation", "verbose_name_plural": "email confirmations", }, bases=(models.Model,), ), ] if not UNIQUE_EMAIL: operations += [ migrations.AlterUniqueTogether( name="emailaddress", unique_together=set([("user", "email")]), ), ] django-allauth-0.47.0/allauth/account/migrations/0002_email_max_length.py000066400000000000000000000016141415442050100262440ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals from django.conf import settings from django.db import migrations, models UNIQUE_EMAIL = getattr(settings, "ACCOUNT_UNIQUE_EMAIL", True) EMAIL_MAX_LENGTH = getattr(settings, "ACCOUNT_EMAIL_MAX_LENGTH", 254) class Migration(migrations.Migration): dependencies = [ ("account", "0001_initial"), ] operations = [ migrations.AlterField( model_name="emailaddress", name="email", field=models.EmailField( unique=UNIQUE_EMAIL, max_length=EMAIL_MAX_LENGTH, verbose_name="e-mail address", ), ), ] if not UNIQUE_EMAIL: operations += [ migrations.AlterUniqueTogether( name="emailaddress", unique_together=set([("user", "email")]), ), ] django-allauth-0.47.0/allauth/account/migrations/__init__.py000066400000000000000000000000001415442050100240310ustar00rootroot00000000000000django-allauth-0.47.0/allauth/account/models.py000066400000000000000000000130621415442050100214150ustar00rootroot00000000000000from __future__ import unicode_literals import datetime from django.core import signing from django.db import models, transaction from django.utils import timezone from django.utils.crypto import get_random_string from django.utils.translation import gettext_lazy as _ from .. import app_settings as allauth_app_settings from . import app_settings, signals from .adapter import get_adapter from .managers import EmailAddressManager, EmailConfirmationManager from .utils import user_email class EmailAddress(models.Model): user = models.ForeignKey( allauth_app_settings.USER_MODEL, verbose_name=_("user"), on_delete=models.CASCADE, ) email = models.EmailField( unique=app_settings.UNIQUE_EMAIL, max_length=app_settings.EMAIL_MAX_LENGTH, verbose_name=_("e-mail address"), ) verified = models.BooleanField(verbose_name=_("verified"), default=False) primary = models.BooleanField(verbose_name=_("primary"), default=False) objects = EmailAddressManager() class Meta: verbose_name = _("email address") verbose_name_plural = _("email addresses") if not app_settings.UNIQUE_EMAIL: unique_together = [("user", "email")] def __str__(self): return self.email def set_as_primary(self, conditional=False): old_primary = EmailAddress.objects.get_primary(self.user) if old_primary: if conditional: return False old_primary.primary = False old_primary.save() self.primary = True self.save() user_email(self.user, self.email) self.user.save() return True def send_confirmation(self, request=None, signup=False): if app_settings.EMAIL_CONFIRMATION_HMAC: confirmation = EmailConfirmationHMAC(self) else: confirmation = EmailConfirmation.create(self) confirmation.send(request, signup=signup) return confirmation def change(self, request, new_email, confirm=True): """ Given a new email address, change self and re-confirm. """ with transaction.atomic(): user_email(self.user, new_email) self.user.save() self.email = new_email self.verified = False self.save() if confirm: self.send_confirmation(request) class EmailConfirmation(models.Model): email_address = models.ForeignKey( EmailAddress, verbose_name=_("e-mail address"), on_delete=models.CASCADE, ) created = models.DateTimeField(verbose_name=_("created"), default=timezone.now) sent = models.DateTimeField(verbose_name=_("sent"), null=True) key = models.CharField(verbose_name=_("key"), max_length=64, unique=True) objects = EmailConfirmationManager() class Meta: verbose_name = _("email confirmation") verbose_name_plural = _("email confirmations") def __str__(self): return "confirmation for %s" % self.email_address @classmethod def create(cls, email_address): key = get_random_string(64).lower() return cls._default_manager.create(email_address=email_address, key=key) def key_expired(self): expiration_date = self.sent + datetime.timedelta( days=app_settings.EMAIL_CONFIRMATION_EXPIRE_DAYS ) return expiration_date <= timezone.now() key_expired.boolean = True def confirm(self, request): if not self.key_expired() and not self.email_address.verified: email_address = self.email_address get_adapter(request).confirm_email(request, email_address) signals.email_confirmed.send( sender=self.__class__, request=request, email_address=email_address, ) return email_address def send(self, request=None, signup=False): get_adapter(request).send_confirmation_mail(request, self, signup) self.sent = timezone.now() self.save() signals.email_confirmation_sent.send( sender=self.__class__, request=request, confirmation=self, signup=signup, ) class EmailConfirmationHMAC: def __init__(self, email_address): self.email_address = email_address @property def key(self): return signing.dumps(obj=self.email_address.pk, salt=app_settings.SALT) @classmethod def from_key(cls, key): try: max_age = 60 * 60 * 24 * app_settings.EMAIL_CONFIRMATION_EXPIRE_DAYS pk = signing.loads(key, max_age=max_age, salt=app_settings.SALT) ret = EmailConfirmationHMAC(EmailAddress.objects.get(pk=pk)) except ( signing.SignatureExpired, signing.BadSignature, EmailAddress.DoesNotExist, ): ret = None return ret def confirm(self, request): if not self.email_address.verified: email_address = self.email_address get_adapter(request).confirm_email(request, email_address) signals.email_confirmed.send( sender=self.__class__, request=request, email_address=email_address, ) return email_address def send(self, request=None, signup=False): get_adapter(request).send_confirmation_mail(request, self, signup) signals.email_confirmation_sent.send( sender=self.__class__, request=request, confirmation=self, signup=signup, ) django-allauth-0.47.0/allauth/account/signals.py000066400000000000000000000017311415442050100215720ustar00rootroot00000000000000from django.contrib.auth.signals import user_logged_out # noqa from django.dispatch import Signal # Provides the arguments "request", "user" user_logged_in = Signal() # Typically followed by `user_logged_in` (unless, e-mail verification kicks in) # Provides the arguments "request", "user" user_signed_up = Signal() # Provides the arguments "request", "user" password_set = Signal() # Provides the arguments "request", "user" password_changed = Signal() # Provides the arguments "request", "user" password_reset = Signal() # Provides the arguments "request", "email_address" email_confirmed = Signal() # Provides the arguments "request", "confirmation", "signup" email_confirmation_sent = Signal() # Provides the arguments "request", "user", "from_email_address", # "to_email_address" email_changed = Signal() # Provides the arguments "request", "user", "email_address" email_added = Signal() # Provides the arguments "request", "user", "email_address" email_removed = Signal() django-allauth-0.47.0/allauth/account/templatetags/000077500000000000000000000000001415442050100222505ustar00rootroot00000000000000django-allauth-0.47.0/allauth/account/templatetags/__init__.py000066400000000000000000000000001415442050100243470ustar00rootroot00000000000000django-allauth-0.47.0/allauth/account/templatetags/account.py000066400000000000000000000007411415442050100242600ustar00rootroot00000000000000from django import template from allauth.account.utils import user_display register = template.Library() @register.simple_tag(name="user_display") def user_display_tag(user): """ Example usage:: {% user_display user %} or if you need to use in a {% blocktrans %}:: {% user_display user as user_display %} {% blocktrans %} {{ user_display }} has sent you a gift. {% endblocktrans %} """ return user_display(user) django-allauth-0.47.0/allauth/account/tests.py000066400000000000000000001611151415442050100212770ustar00rootroot00000000000000from __future__ import absolute_import import json import uuid from datetime import timedelta from django import forms from django.conf import settings from django.contrib.auth.models import AbstractUser, AnonymousUser from django.contrib.sites.models import Site from django.core import mail, validators from django.core.exceptions import ValidationError from django.db import models from django.http import HttpResponseRedirect from django.template import Context, Template from django.test.client import Client, RequestFactory from django.test.utils import override_settings from django.urls import reverse from django.utils.timezone import now from allauth.account.forms import BaseSignupForm, ResetPasswordForm, SignupForm from allauth.account.models import ( EmailAddress, EmailConfirmation, EmailConfirmationHMAC, ) from allauth.tests import Mock, TestCase, patch from allauth.utils import get_user_model, get_username_max_length from . import app_settings from .adapter import get_adapter from .auth_backends import AuthenticationBackend from .signals import user_logged_in, user_logged_out from .utils import ( filter_users_by_username, url_str_to_user_pk, user_pk_to_url_str, user_username, ) test_username_validators = [ validators.RegexValidator(regex=r"^[a-c]+$", message="not abc", flags=0) ] @override_settings( ACCOUNT_DEFAULT_HTTP_PROTOCOL="https", ACCOUNT_EMAIL_VERIFICATION=app_settings.EmailVerificationMethod.MANDATORY, ACCOUNT_AUTHENTICATION_METHOD=app_settings.AuthenticationMethod.USERNAME, ACCOUNT_SIGNUP_FORM_CLASS=None, ACCOUNT_EMAIL_SUBJECT_PREFIX=None, LOGIN_REDIRECT_URL="/accounts/profile/", ACCOUNT_SIGNUP_REDIRECT_URL="/accounts/welcome/", ACCOUNT_ADAPTER="allauth.account.adapter.DefaultAccountAdapter", ACCOUNT_USERNAME_REQUIRED=True, ) class AccountTests(TestCase): def setUp(self): if "allauth.socialaccount" in settings.INSTALLED_APPS: # Otherwise ImproperlyConfigured exceptions may occur from ..socialaccount.models import SocialApp sa = SocialApp.objects.create(name="testfb", provider="facebook") sa.sites.add(Site.objects.get_current()) @override_settings( ACCOUNT_AUTHENTICATION_METHOD=app_settings.AuthenticationMethod.USERNAME_EMAIL ) def test_username_containing_at(self): user = get_user_model().objects.create(username="@raymond.penners") user.set_password("psst") user.save() EmailAddress.objects.create( user=user, email="raymond.penners@example.com", primary=True, verified=True, ) resp = self.client.post( reverse("account_login"), {"login": "@raymond.penners", "password": "psst"}, ) self.assertRedirects( resp, settings.LOGIN_REDIRECT_URL, fetch_redirect_response=False ) def test_signup_same_email_verified_externally(self): user = self._test_signup_email_verified_externally( "john@example.com", "john@example.com" ) self.assertEqual(EmailAddress.objects.filter(user=user).count(), 1) EmailAddress.objects.get( verified=True, email="john@example.com", user=user, primary=True ) def test_signup_other_email_verified_externally(self): """ John is invited on john@example.org, but signs up via john@example.com. E-mail verification is by-passed, their home e-mail address is used as a secondary. """ user = self._test_signup_email_verified_externally( "john@example.com", "john@example.org" ) self.assertEqual(EmailAddress.objects.filter(user=user).count(), 2) EmailAddress.objects.get( verified=False, email="john@example.com", user=user, primary=False ) EmailAddress.objects.get( verified=True, email="john@example.org", user=user, primary=True ) def _test_signup_email_verified_externally(self, signup_email, verified_email): username = "johndoe" request = RequestFactory().post( reverse("account_signup"), { "username": username, "email": signup_email, "password1": "johndoe", "password2": "johndoe", }, ) # Fake stash_verified_email from django.contrib.messages.middleware import MessageMiddleware from django.contrib.sessions.middleware import SessionMiddleware SessionMiddleware(lambda request: None).process_request(request) MessageMiddleware(lambda request: None).process_request(request) request.user = AnonymousUser() request.session["account_verified_email"] = verified_email from .views import signup resp = signup(request) self.assertEqual(resp.status_code, 302) self.assertEqual( resp["location"], get_adapter().get_signup_redirect_url(request) ) self.assertEqual(len(mail.outbox), 0) return get_user_model().objects.get(username=username) @override_settings( ACCOUNT_USERNAME_REQUIRED=True, ACCOUNT_SIGNUP_PASSWORD_ENTER_TWICE=True, ) def test_signup_password_twice_form_error(self): resp = self.client.post( reverse("account_signup"), data={ "username": "johndoe", "email": "john@example.org", "password1": "johndoe", "password2": "janedoe", }, ) self.assertFormError( resp, "form", "password2", "You must type the same password each time.", ) @override_settings( ACCOUNT_USERNAME_REQUIRED=True, ACCOUNT_SIGNUP_EMAIL_ENTER_TWICE=True ) def test_signup_email_twice(self): request = RequestFactory().post( reverse("account_signup"), { "username": "johndoe", "email": "john@example.org", "email2": "john@example.org", "password1": "johndoe", "password2": "johndoe", }, ) from django.contrib.messages.middleware import MessageMiddleware from django.contrib.sessions.middleware import SessionMiddleware SessionMiddleware(lambda request: None).process_request(request) MessageMiddleware(lambda request: None).process_request(request) request.user = AnonymousUser() from .views import signup signup(request) user = get_user_model().objects.get(username="johndoe") self.assertEqual(user.email, "john@example.org") def _create_user(self, username="john", password="doe", **kwargs): user = get_user_model().objects.create( username=username, is_active=True, **kwargs ) if password: user.set_password(password) else: user.set_unusable_password() user.save() return user def _create_user_and_login(self, usable_password=True): password = "doe" if usable_password else False user = self._create_user(password=password) self.client.force_login(user) return user def test_redirect_when_authenticated(self): self._create_user_and_login() c = self.client resp = c.get(reverse("account_login")) self.assertRedirects(resp, "/accounts/profile/", fetch_redirect_response=False) def test_password_reset_get(self): resp = self.client.get(reverse("account_reset_password")) self.assertTemplateUsed(resp, "account/password_reset.html") def test_password_set_redirect(self): resp = self._password_set_or_change_redirect("account_set_password", True) self.assertRedirects( resp, reverse("account_change_password"), fetch_redirect_response=False, ) def test_set_password_not_allowed(self): user = self._create_user_and_login(True) pwd = "!*123i1uwn12W23" self.assertFalse(user.check_password(pwd)) resp = self.client.post( reverse("account_set_password"), data={"password1": pwd, "password2": pwd}, ) user.refresh_from_db() self.assertFalse(user.check_password(pwd)) self.assertTrue(user.has_usable_password()) self.assertEqual(resp.status_code, 302) def test_password_change_no_redirect(self): resp = self._password_set_or_change_redirect("account_change_password", True) self.assertEqual(resp.status_code, 200) def test_password_set_no_redirect(self): resp = self._password_set_or_change_redirect("account_set_password", False) self.assertEqual(resp.status_code, 200) def test_password_change_redirect(self): resp = self._password_set_or_change_redirect("account_change_password", False) self.assertRedirects( resp, reverse("account_set_password"), fetch_redirect_response=False, ) def _password_set_or_change_redirect(self, urlname, usable_password): self._create_user_and_login(usable_password) return self.client.get(reverse(urlname)) def test_ajax_password_change(self): self._create_user_and_login() resp = self.client.post( reverse("account_change_password"), data={ "oldpassword": "doe", "password1": "AbCdEf!123", "password2": "AbCdEf!123456", }, HTTP_X_REQUESTED_WITH="XMLHttpRequest", ) self.assertEqual(resp["content-type"], "application/json") data = json.loads(resp.content.decode("utf8")) assert "same password" in data["form"]["fields"]["password2"]["errors"][0] def test_password_forgotten_username_hint(self): user = self._request_new_password() body = mail.outbox[0].body assert user.username in body @override_settings( ACCOUNT_AUTHENTICATION_METHOD=app_settings.AuthenticationMethod.EMAIL ) def test_password_forgotten_no_username_hint(self): user = self._request_new_password() body = mail.outbox[0].body assert user.username not in body def _request_new_password(self): user = get_user_model().objects.create( username="john", email="john@example.org", is_active=True ) user.set_password("doe") user.save() self.client.post( reverse("account_reset_password"), data={"email": "john@example.org"}, ) self.assertEqual(len(mail.outbox), 1) self.assertEqual(mail.outbox[0].to, ["john@example.org"]) return user def test_password_reset_flow_with_empty_session(self): """ Test the password reset flow when the session is empty: requesting a new password, receiving the reset link via email, following the link, getting redirected to the new link (without the token) Copying the link and using it in a DIFFERENT client (Browser/Device). """ # Request new password self._request_new_password() body = mail.outbox[0].body self.assertGreater(body.find("https://"), 0) # Extract URL for `password_reset_from_key` view url = body[body.find("/password/reset/") :].split()[0] resp = self.client.get(url) reset_pass_url = resp.url # Accesing the url via a different session resp = self.client_class().get(reset_pass_url) # We should receive the token_fail context_data self.assertTemplateUsed( resp, "account/password_reset_from_key.%s" % app_settings.TEMPLATE_EXTENSION, ) self.assertTrue(resp.context_data["token_fail"]) def test_password_reset_flow(self): """ Tests the password reset flow: requesting a new password, receiving the reset link via email and finally resetting the password to a new value. """ # Request new password user = self._request_new_password() body = mail.outbox[0].body self.assertGreater(body.find("https://"), 0) # Extract URL for `password_reset_from_key` view and access it url = body[body.find("/password/reset/") :].split()[0] resp = self.client.get(url) # Follow the redirect the actual password reset page with the key # hidden. url = resp.url resp = self.client.get(url) self.assertTemplateUsed( resp, "account/password_reset_from_key.%s" % app_settings.TEMPLATE_EXTENSION, ) self.assertFalse("token_fail" in resp.context_data) # Reset the password resp = self.client.post( url, {"password1": "newpass123", "password2": "newpass123"} ) self.assertRedirects(resp, reverse("account_reset_password_from_key_done")) # Check the new password is in effect user = get_user_model().objects.get(pk=user.pk) self.assertTrue(user.check_password("newpass123")) # Trying to reset the password against the same URL (or any other # invalid/obsolete URL) returns a bad token response resp = self.client.post( url, {"password1": "newpass123", "password2": "newpass123"} ) self.assertTemplateUsed( resp, "account/password_reset_from_key.%s" % app_settings.TEMPLATE_EXTENSION, ) self.assertTrue(resp.context_data["token_fail"]) # Same should happen when accessing the page directly response = self.client.get(url) self.assertTemplateUsed( response, "account/password_reset_from_key.%s" % app_settings.TEMPLATE_EXTENSION, ) self.assertTrue(response.context_data["token_fail"]) # When in XHR views, it should respond with a 400 bad request # code, and the response body should contain the JSON-encoded # error from the adapter response = self.client.post( url, {"password1": "newpass123", "password2": "newpass123"}, HTTP_X_REQUESTED_WITH="XMLHttpRequest", ) self.assertEqual(response.status_code, 400) data = json.loads(response.content.decode("utf8")) assert "invalid" in data["form"]["errors"][0] @override_settings( ACCOUNT_AUTHENTICATION_METHOD=app_settings.AuthenticationMethod.EMAIL ) def test_password_reset_flow_with_another_user_logged_in(self): """ Tests the password reset flow: if User B requested a password reset earlier and now User A is logged in, User B now clicks on the link, ensure User A is logged out before continuing. """ # Request new password self._request_new_password() body = mail.outbox[0].body self.assertGreater(body.find("https://"), 0) user2 = self._create_user(username="john2", email="john2@example.com") EmailAddress.objects.create( user=user2, email=user2.email, primary=True, verified=True ) resp = self.client.post( reverse("account_login"), { "login": user2.email, "password": "doe", }, ) self.assertEqual(user2, resp.context["user"]) # Extract URL for `password_reset_from_key` view and access it url = body[body.find("/password/reset/") :].split()[0] resp = self.client.get(url) # Follow the redirect the actual password reset page with the key # hidden. url = resp.url resp = self.client.get(url) self.assertTemplateUsed( resp, "account/password_reset_from_key.%s" % app_settings.TEMPLATE_EXTENSION ) self.assertFalse("token_fail" in resp.context_data) # Reset the password resp = self.client.post( url, {"password1": "newpass123", "password2": "newpass123"}, follow=True ) self.assertRedirects(resp, reverse("account_reset_password_from_key_done")) self.assertNotEqual(user2, resp.context["user"]) self.assertEqual(AnonymousUser(), resp.context["user"]) def test_password_reset_flow_with_email_changed(self): """ Test that the password reset token is invalidated if the user email address was changed. """ user = self._request_new_password() body = mail.outbox[0].body self.assertGreater(body.find("https://"), 0) EmailAddress.objects.create(user=user, email="other@email.org") # Extract URL for `password_reset_from_key` view url = body[body.find("/password/reset/") :].split()[0] resp = self.client.get(url) self.assertTemplateUsed( resp, "account/password_reset_from_key.%s" % app_settings.TEMPLATE_EXTENSION, ) self.assertTrue("token_fail" in resp.context_data) @override_settings(ACCOUNT_LOGIN_ON_PASSWORD_RESET=True) def test_password_reset_ACCOUNT_LOGIN_ON_PASSWORD_RESET(self): user = self._request_new_password() body = mail.outbox[0].body url = body[body.find("/password/reset/") :].split()[0] resp = self.client.get(url) # Follow the redirect the actual password reset page with the key # hidden. resp = self.client.post( resp.url, {"password1": "newpass123", "password2": "newpass123"} ) self.assertTrue(user.is_authenticated) # EmailVerificationMethod.MANDATORY sends us to the confirm-email page self.assertRedirects(resp, "/confirm-email/") @override_settings(ACCOUNT_EMAIL_CONFIRMATION_HMAC=False) def test_email_verification_mandatory(self): c = Client() # Signup resp = c.post( reverse("account_signup"), { "username": "johndoe", "email": "john@example.com", "password1": "johndoe", "password2": "johndoe", }, follow=True, ) self.assertEqual(resp.status_code, 200) self.assertEqual(mail.outbox[0].to, ["john@example.com"]) self.assertGreater(mail.outbox[0].body.find("https://"), 0) self.assertEqual(len(mail.outbox), 1) self.assertTemplateUsed( resp, "account/verification_sent.%s" % app_settings.TEMPLATE_EXTENSION, ) # Attempt to login, unverified for attempt in [1, 2]: resp = c.post( reverse("account_login"), {"login": "johndoe", "password": "johndoe"}, follow=True, ) # is_active is controlled by the admin to manually disable # users. I don't want this flag to flip automatically whenever # users verify their email adresses. self.assertTrue( get_user_model() .objects.filter(username="johndoe", is_active=True) .exists() ) self.assertTemplateUsed( resp, "account/verification_sent." + app_settings.TEMPLATE_EXTENSION, ) # Attempt 1: no mail is sent due to cool-down , # but there was already a mail in the outbox. self.assertEqual(len(mail.outbox), attempt) self.assertEqual( EmailConfirmation.objects.filter( email_address__email="john@example.com" ).count(), attempt, ) # Wait for cooldown EmailConfirmation.objects.update(sent=now() - timedelta(days=1)) # Verify, and re-attempt to login. confirmation = EmailConfirmation.objects.filter( email_address__user__username="johndoe" )[:1].get() resp = c.get(reverse("account_confirm_email", args=[confirmation.key])) self.assertTemplateUsed( resp, "account/email_confirm.%s" % app_settings.TEMPLATE_EXTENSION ) c.post(reverse("account_confirm_email", args=[confirmation.key])) resp = c.post( reverse("account_login"), {"login": "johndoe", "password": "johndoe"}, ) self.assertRedirects( resp, settings.LOGIN_REDIRECT_URL, fetch_redirect_response=False ) def test_email_escaping(self): site = Site.objects.get_current() site.name = '' site.save() u = get_user_model().objects.create(username="test", email="user@example.com") request = RequestFactory().get("/") EmailAddress.objects.add_email(request, u, u.email, confirm=True) self.assertTrue(mail.outbox[0].subject[1:].startswith(site.name)) @override_settings( ACCOUNT_EMAIL_VERIFICATION=app_settings.EmailVerificationMethod.OPTIONAL ) def test_login_unverified_account_optional(self): """Tests login behavior when email verification is optional.""" user = get_user_model().objects.create(username="john") user.set_password("doe") user.save() EmailAddress.objects.create( user=user, email="user@example.com", primary=True, verified=False ) resp = self.client.post( reverse("account_login"), {"login": "john", "password": "doe"} ) self.assertRedirects( resp, settings.LOGIN_REDIRECT_URL, fetch_redirect_response=False ) @override_settings( ACCOUNT_EMAIL_VERIFICATION=app_settings.EmailVerificationMethod.OPTIONAL, ACCOUNT_LOGIN_ATTEMPTS_LIMIT=3, ) def test_login_failed_attempts_exceeded(self): user = get_user_model().objects.create(username="john") user.set_password("doe") user.save() EmailAddress.objects.create( user=user, email="user@example.com", primary=True, verified=False ) for i in range(5): is_valid_attempt = i == 4 is_locked = i >= 3 resp = self.client.post( reverse("account_login"), { "login": ["john", "John", "JOHN", "JOhn", "joHN"][i], "password": ("doe" if is_valid_attempt else "wrong"), }, ) self.assertFormError( resp, "form", None, "Too many failed login attempts. Try again later." if is_locked else "The username and/or password you specified are not correct.", ) @override_settings( ACCOUNT_AUTHENTICATION_METHOD=app_settings.AuthenticationMethod.EMAIL, ACCOUNT_EMAIL_VERIFICATION=app_settings.EmailVerificationMethod.MANDATORY, ACCOUNT_LOGIN_ATTEMPTS_LIMIT=1, ) def test_login_failed_attempts_exceeded_cleared_on_password_reset(self): # Ensure that login attempts, once they hit the limit, # can use the password reset mechanism to regain access. user = get_user_model().objects.create( username="john", email="john@example.org", is_active=True ) user.set_password("doe") user.save() EmailAddress.objects.create( user=user, email="john@example.org", primary=True, verified=True ) resp = self.client.post( reverse("account_login"), {"login": user.email, "password": "bad"} ) self.assertFormError( resp, "form", None, "The e-mail address and/or password you specified are not correct.", ) resp = self.client.post( reverse("account_login"), {"login": user.email, "password": "bad"} ) self.assertFormError( resp, "form", None, "Too many failed login attempts. Try again later.", ) self.client.post(reverse("account_reset_password"), data={"email": user.email}) body = mail.outbox[0].body self.assertGreater(body.find("https://"), 0) # Extract URL for `password_reset_from_key` view and access it url = body[body.find("/password/reset/") :].split()[0] resp = self.client.get(url) # Follow the redirect the actual password reset page with the key # hidden. url = resp.url resp = self.client.get(url) self.assertTemplateUsed( resp, "account/password_reset_from_key.%s" % app_settings.TEMPLATE_EXTENSION, ) self.assertFalse("token_fail" in resp.context_data) new_password = "newpass123" # Reset the password resp = self.client.post( url, {"password1": new_password, "password2": new_password} ) self.assertRedirects(resp, reverse("account_reset_password_from_key_done")) # Check the new password is in effect user = get_user_model().objects.get(pk=user.pk) self.assertTrue(user.check_password(new_password)) resp = self.client.post( reverse("account_login"), {"login": user.email, "password": new_password}, ) self.assertRedirects( resp, settings.LOGIN_REDIRECT_URL, fetch_redirect_response=False ) @override_settings( ACCOUNT_AUTHENTICATION_METHOD=app_settings.AuthenticationMethod.EMAIL, ACCOUNT_EMAIL_VERIFICATION=app_settings.EmailVerificationMethod.MANDATORY, ACCOUNT_LOGIN_ATTEMPTS_LIMIT=1, ) def test_login_using_unverified_email_address_is_prohibited(self): user = get_user_model().objects.create( username="john", email="john@example.org", is_active=True ) user.set_password("doe") user.save() EmailAddress.objects.create( user=user, email="john@example.org", primary=True, verified=True ) EmailAddress.objects.create( user=user, email="john@example.com", primary=True, verified=False ) resp = self.client.post( reverse("account_login"), {"login": "john@example.com", "password": "doe"} ) self.assertRedirects( resp, reverse("account_email_verification_sent"), fetch_redirect_response=False, ) self.assertEqual(len(mail.outbox), 1) assert mail.outbox[0].to == ["john@example.com"] def test_login_unverified_account_mandatory(self): """Tests login behavior when email verification is mandatory.""" user = get_user_model().objects.create(username="john") user.set_password("doe") user.save() EmailAddress.objects.create( user=user, email="user@example.com", primary=True, verified=False ) resp = self.client.post( reverse("account_login"), {"login": "john", "password": "doe"} ) self.assertRedirects(resp, reverse("account_email_verification_sent")) def test_login_inactive_account(self): """ Tests login behavior with inactive accounts. Inactive user accounts should be prevented from performing any actions, regardless of their verified state. """ # Inactive and verified user account user = get_user_model().objects.create(username="john", is_active=False) user.set_password("doe") user.save() EmailAddress.objects.create( user=user, email="john@example.com", primary=True, verified=True ) resp = self.client.post( reverse("account_login"), {"login": "john", "password": "doe"} ) self.assertRedirects(resp, reverse("account_inactive")) # Inactive and unverified user account user = get_user_model().objects.create(username="doe", is_active=False) user.set_password("john") user.save() EmailAddress.objects.create( user=user, email="user@example.com", primary=True, verified=False ) resp = self.client.post( reverse("account_login"), {"login": "doe", "password": "john"} ) self.assertRedirects(resp, reverse("account_inactive")) def test_ajax_password_reset(self): get_user_model().objects.create( username="john", email="john@example.org", is_active=True ) resp = self.client.post( reverse("account_reset_password"), data={"email": "john@example.org"}, HTTP_X_REQUESTED_WITH="XMLHttpRequest", ) self.assertEqual(len(mail.outbox), 1) self.assertEqual(mail.outbox[0].to, ["john@example.org"]) self.assertEqual(resp["content-type"], "application/json") def test_ajax_login_fail(self): resp = self.client.post( reverse("account_login"), {}, HTTP_X_REQUESTED_WITH="XMLHttpRequest", ) self.assertEqual(resp.status_code, 400) json.loads(resp.content.decode("utf8")) # TODO: Actually test something @override_settings( ACCOUNT_EMAIL_VERIFICATION=app_settings.EmailVerificationMethod.OPTIONAL ) def test_ajax_login_success(self): user = get_user_model().objects.create(username="john", is_active=True) user.set_password("doe") user.save() resp = self.client.post( reverse("account_login"), {"login": "john", "password": "doe"}, HTTP_X_REQUESTED_WITH="XMLHttpRequest", ) self.assertEqual(resp.status_code, 200) data = json.loads(resp.content.decode("utf8")) self.assertEqual(data["location"], "/accounts/profile/") def test_email_view(self): self._create_user_and_login() self.client.get(reverse("account_email")) # TODO: Actually test something @override_settings(ACCOUNT_LOGOUT_ON_GET=True) def test_logout_view_on_get(self): c, resp = self._logout_view("get") self.assertTemplateUsed(resp, "account/messages/logged_out.txt") @override_settings(ACCOUNT_LOGOUT_ON_GET=False) def test_logout_view_on_post(self): c, resp = self._logout_view("get") self.assertTemplateUsed( resp, "account/logout.%s" % app_settings.TEMPLATE_EXTENSION ) receiver_mock = Mock() user_logged_out.connect(receiver_mock) resp = c.post(reverse("account_logout")) self.assertTemplateUsed(resp, "account/messages/logged_out.txt") receiver_mock.assert_called_once_with( sender=get_user_model(), request=resp.wsgi_request, user=get_user_model().objects.get(username="john"), signal=user_logged_out, ) user_logged_out.disconnect(receiver_mock) def _logout_view(self, method): c = Client() user = get_user_model().objects.create(username="john", is_active=True) user.set_password("doe") user.save() c = Client() c.login(username="john", password="doe") return c, getattr(c, method)(reverse("account_logout")) @override_settings( ACCOUNT_EMAIL_VERIFICATION=app_settings.EmailVerificationMethod.OPTIONAL, ACCOUNT_SIGNUP_PASSWORD_ENTER_TWICE=False, ) def test_optional_email_verification(self): c = Client() # Signup c.get(reverse("account_signup")) resp = c.post( reverse("account_signup"), { "username": "johndoe", "email": "john@example.com", "password1": "johndoe", }, ) # Logged in self.assertRedirects( resp, settings.ACCOUNT_SIGNUP_REDIRECT_URL, fetch_redirect_response=False ) self.assertEqual(mail.outbox[0].to, ["john@example.com"]) self.assertEqual(len(mail.outbox), 1) # Logout & login again c.logout() # Wait for cooldown EmailConfirmation.objects.update(sent=now() - timedelta(days=1)) # Signup resp = c.post( reverse("account_login"), {"login": "johndoe", "password": "johndoe"}, ) self.assertRedirects( resp, settings.LOGIN_REDIRECT_URL, fetch_redirect_response=False ) self.assertEqual(mail.outbox[0].to, ["john@example.com"]) # There was an issue that we sent out email confirmation mails # on each login in case of optional verification. Make sure # this is not the case: self.assertEqual(len(mail.outbox), 1) @override_settings(ACCOUNT_AUTHENTICATED_LOGIN_REDIRECTS=False) def test_account_authenticated_login_redirects_is_false(self): self._create_user_and_login() resp = self.client.get(reverse("account_login")) self.assertEqual(resp.status_code, 200) @override_settings( AUTH_PASSWORD_VALIDATORS=[ { "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator", "OPTIONS": { "min_length": 9, }, } ] ) def test_django_password_validation(self): resp = self.client.post( reverse("account_signup"), { "username": "johndoe", "email": "john@example.com", "password1": "johndoe", "password2": "johndoe", }, ) self.assertFormError(resp, "form", None, []) self.assertFormError( resp, "form", "password1", ["This password is too short. It must contain at least 9 characters."], ) @override_settings(ACCOUNT_EMAIL_CONFIRMATION_HMAC=True) def test_email_confirmation_hmac_falls_back(self): user = self._create_user() email = EmailAddress.objects.create( user=user, email="a@b.com", verified=False, primary=True ) confirmation = EmailConfirmation.create(email) confirmation.sent = now() confirmation.save() self.client.post(reverse("account_confirm_email", args=[confirmation.key])) email = EmailAddress.objects.get(pk=email.pk) self.assertTrue(email.verified) @override_settings(ACCOUNT_EMAIL_CONFIRMATION_HMAC=True) def test_email_confirmation_hmac(self): user = self._create_user() email = EmailAddress.objects.create( user=user, email="a@b.com", verified=False, primary=True ) confirmation = EmailConfirmationHMAC(email) confirmation.send() self.assertEqual(len(mail.outbox), 1) self.client.post(reverse("account_confirm_email", args=[confirmation.key])) email = EmailAddress.objects.get(pk=email.pk) self.assertTrue(email.verified) @override_settings( ACCOUNT_EMAIL_CONFIRMATION_HMAC=True, ACCOUNT_EMAIL_CONFIRMATION_EXPIRE_DAYS=0, ) def test_email_confirmation_hmac_timeout(self): user = self._create_user() email = EmailAddress.objects.create( user=user, email="a@b.com", verified=False, primary=True ) confirmation = EmailConfirmationHMAC(email) confirmation.send() self.assertEqual(len(mail.outbox), 1) self.client.post(reverse("account_confirm_email", args=[confirmation.key])) email = EmailAddress.objects.get(pk=email.pk) self.assertFalse(email.verified) @override_settings( ACCOUNT_USERNAME_VALIDATORS="allauth.account.tests.test_username_validators" ) def test_username_validator(self): get_adapter().clean_username("abc") self.assertRaises(ValidationError, lambda: get_adapter().clean_username("def")) @override_settings( ACCOUNT_AUTHENTICATION_METHOD=app_settings.AuthenticationMethod.EMAIL ) def test_confirm_email_with_another_user_logged_in(self): """Test the email confirmation view. If User B clicks on an email verification link while logged in as User A, ensure User A gets logged out.""" user = get_user_model().objects.create_user( username="john", email="john@example.org", password="doe" ) self.client.force_login(user) self.client.post( reverse("account_email"), {"email": user.email, "action_send": ""} ) self.assertEqual(len(mail.outbox), 1) self.assertEqual(mail.outbox[0].to, [user.email]) self.client.logout() body = mail.outbox[0].body self.assertGreater(body.find("https://"), 0) user2 = self._create_user(username="john2", email="john2@example.com") EmailAddress.objects.create( user=user2, email=user2.email, primary=True, verified=True ) resp = self.client.post( reverse("account_login"), { "login": user2.email, "password": "doe", }, ) self.assertEqual(user2, resp.context["user"]) url = body[body.find("/confirm-email/") :].split()[0] resp = self.client.post(url) self.assertTemplateUsed(resp, "account/messages/logged_out.txt") self.assertTemplateUsed(resp, "account/messages/email_confirmed.txt") self.assertRedirects(resp, settings.LOGIN_URL, fetch_redirect_response=False) @override_settings( ACCOUNT_AUTHENTICATION_METHOD=app_settings.AuthenticationMethod.EMAIL ) def test_confirm_email_with_same_user_logged_in(self): """Test the email confirmation view. If User A clicks on an email verification link while logged in, ensure the user stayed logged in.""" user = get_user_model().objects.create_user( username="john", email="john@example.org", password="doe" ) self.client.force_login(user) self.client.post( reverse("account_email"), {"email": user.email, "action_send": ""} ) self.assertEqual(len(mail.outbox), 1) self.assertEqual(mail.outbox[0].to, [user.email]) body = mail.outbox[0].body self.assertGreater(body.find("https://"), 0) url = body[body.find("/confirm-email/") :].split()[0] resp = self.client.post(url) self.assertTemplateNotUsed(resp, "account/messages/logged_out.txt") self.assertTemplateUsed(resp, "account/messages/email_confirmed.txt") self.assertRedirects( resp, settings.LOGIN_REDIRECT_URL, fetch_redirect_response=False ) self.assertEqual(user, resp.wsgi_request.user) class EmailFormTests(TestCase): def setUp(self): User = get_user_model() self.user = User.objects.create(username="john", email="john1@example.org") self.user.set_password("doe") self.user.save() self.email_address = EmailAddress.objects.create( user=self.user, email=self.user.email, verified=True, primary=True ) self.email_address2 = EmailAddress.objects.create( user=self.user, email="john2@example.org", verified=False, primary=False, ) self.client.login(username="john", password="doe") def test_add(self): resp = self.client.post( reverse("account_email"), {"action_add": "", "email": "john3@example.org"}, ) EmailAddress.objects.get( email="john3@example.org", user=self.user, verified=False, primary=False, ) self.assertTemplateUsed(resp, "account/messages/email_confirmation_sent.txt") def test_ajax_get(self): resp = self.client.get( reverse("account_email"), HTTP_X_REQUESTED_WITH="XMLHttpRequest" ) data = json.loads(resp.content.decode("utf8")) assert data["data"] == [ { "id": self.email_address.pk, "email": "john1@example.org", "primary": True, "verified": True, }, { "id": self.email_address2.pk, "email": "john2@example.org", "primary": False, "verified": False, }, ] def test_ajax_add(self): resp = self.client.post( reverse("account_email"), {"action_add": "", "email": "john3@example.org"}, HTTP_X_REQUESTED_WITH="XMLHttpRequest", ) data = json.loads(resp.content.decode("utf8")) self.assertEqual(data["location"], reverse("account_email")) def test_ajax_add_invalid(self): resp = self.client.post( reverse("account_email"), {"action_add": "", "email": "john3#example.org"}, HTTP_X_REQUESTED_WITH="XMLHttpRequest", ) data = json.loads(resp.content.decode("utf8")) assert "valid" in data["form"]["fields"]["email"]["errors"][0] def test_remove_primary(self): resp = self.client.post( reverse("account_email"), {"action_remove": "", "email": self.email_address.email}, ) EmailAddress.objects.get(pk=self.email_address.pk) self.assertTemplateUsed( resp, "account/messages/cannot_delete_primary_email.txt" ) def test_ajax_remove_primary(self): resp = self.client.post( reverse("account_email"), {"action_remove": "", "email": self.email_address.email}, HTTP_X_REQUESTED_WITH="XMLHttpRequest", ) self.assertTemplateUsed( resp, "account/messages/cannot_delete_primary_email.txt" ) data = json.loads(resp.content.decode("utf8")) self.assertEqual(data["location"], reverse("account_email")) def test_remove_secondary(self): resp = self.client.post( reverse("account_email"), {"action_remove": "", "email": self.email_address2.email}, ) self.assertRaises( EmailAddress.DoesNotExist, lambda: EmailAddress.objects.get(pk=self.email_address2.pk), ) self.assertTemplateUsed(resp, "account/messages/email_deleted.txt") def test_set_primary_unverified(self): resp = self.client.post( reverse("account_email"), {"action_primary": "", "email": self.email_address2.email}, ) email_address = EmailAddress.objects.get(pk=self.email_address.pk) email_address2 = EmailAddress.objects.get(pk=self.email_address2.pk) self.assertFalse(email_address2.primary) self.assertTrue(email_address.primary) self.assertTemplateUsed(resp, "account/messages/unverified_primary_email.txt") def test_set_primary(self): email_address2 = EmailAddress.objects.get(pk=self.email_address2.pk) email_address2.verified = True email_address2.save() resp = self.client.post( reverse("account_email"), {"action_primary": "", "email": self.email_address2.email}, ) email_address = EmailAddress.objects.get(pk=self.email_address.pk) email_address2 = EmailAddress.objects.get(pk=self.email_address2.pk) self.assertFalse(email_address.primary) self.assertTrue(email_address2.primary) self.assertTemplateUsed(resp, "account/messages/primary_email_set.txt") def test_verify(self): resp = self.client.post( reverse("account_email"), {"action_send": "", "email": self.email_address2.email}, ) self.assertTemplateUsed(resp, "account/messages/email_confirmation_sent.txt") @override_settings(ACCOUNT_MAX_EMAIL_ADDRESSES=2) def test_add_with_two_limiter(self): resp = self.client.post( reverse("account_email"), {"action_add": "", "email": "john3@example.org"} ) self.assertTemplateNotUsed(resp, "account/messages/email_confirmation_sent.txt") @override_settings(ACCOUNT_MAX_EMAIL_ADDRESSES=None) def test_add_with_none_limiter(self): resp = self.client.post( reverse("account_email"), {"action_add": "", "email": "john3@example.org"} ) self.assertTemplateUsed(resp, "account/messages/email_confirmation_sent.txt") @override_settings(ACCOUNT_MAX_EMAIL_ADDRESSES=0) def test_add_with_zero_limiter(self): resp = self.client.post( reverse("account_email"), {"action_add": "", "email": "john3@example.org"} ) self.assertTemplateUsed(resp, "account/messages/email_confirmation_sent.txt") class BaseSignupFormTests(TestCase): @override_settings( ACCOUNT_USERNAME_REQUIRED=True, ACCOUNT_USERNAME_BLACKLIST=["username"] ) def test_username_in_blacklist(self): data = { "username": "username", "email": "user@example.com", } form = BaseSignupForm(data, email_required=True) self.assertFalse(form.is_valid()) @override_settings( ACCOUNT_USERNAME_REQUIRED=True, ACCOUNT_USERNAME_BLACKLIST=["username"] ) def test_username_not_in_blacklist(self): data = { "username": "theusername", "email": "user@example.com", } form = BaseSignupForm(data, email_required=True) self.assertTrue(form.is_valid()) @override_settings(ACCOUNT_USERNAME_REQUIRED=True) def test_username_maxlength(self): data = { "username": "username", "email": "user@example.com", } form = BaseSignupForm(data, email_required=True) max_length = get_username_max_length() field = form.fields["username"] self.assertEqual(field.max_length, max_length) widget = field.widget self.assertEqual(widget.attrs.get("maxlength"), str(max_length)) @override_settings( ACCOUNT_USERNAME_REQUIRED=True, ACCOUNT_SIGNUP_EMAIL_ENTER_TWICE=True ) def test_signup_email_verification(self): data = { "username": "username", "email": "user@example.com", } form = BaseSignupForm(data, email_required=True) self.assertFalse(form.is_valid()) data = { "username": "username", "email": "user@example.com", "email2": "user@example.com", } form = BaseSignupForm(data, email_required=True) self.assertTrue(form.is_valid()) data["email2"] = "anotheruser@example.com" form = BaseSignupForm(data, email_required=True) self.assertFalse(form.is_valid()) class CustomSignupFormTests(TestCase): @override_settings( ACCOUNT_SIGNUP_EMAIL_ENTER_TWICE=True, ACCOUNT_SIGNUP_PASSWORD_ENTER_TWICE=True, ) def test_custom_form_field_order(self): expected_field_order = [ "email", "email2", "password1", "password2", "username", "last_name", "first_name", ] class TestSignupForm(forms.Form): first_name = forms.CharField(max_length=30) last_name = forms.CharField(max_length=30) field_order = expected_field_order class CustomSignupForm(SignupForm, TestSignupForm): # ACCOUNT_SIGNUP_FORM_CLASS is only abided by when the # BaseSignupForm definition is loaded the first time on Django # startup. @override_settings() has therefore no effect. pass form = CustomSignupForm() self.assertEqual(list(form.fields.keys()), expected_field_order) class AuthenticationBackendTests(TestCase): def setUp(self): user = get_user_model().objects.create( is_active=True, email="john@example.com", username="john" ) user.set_password(user.username) user.save() self.user = user @override_settings( ACCOUNT_AUTHENTICATION_METHOD=app_settings.AuthenticationMethod.USERNAME ) # noqa def test_auth_by_username(self): user = self.user backend = AuthenticationBackend() self.assertEqual( backend.authenticate( request=None, username=user.username, password=user.username ).pk, user.pk, ) self.assertEqual( backend.authenticate( request=None, username=user.email, password=user.username ), None, ) @override_settings( ACCOUNT_AUTHENTICATION_METHOD=app_settings.AuthenticationMethod.EMAIL ) # noqa def test_auth_by_email(self): user = self.user backend = AuthenticationBackend() self.assertEqual( backend.authenticate( request=None, username=user.email, password=user.username ).pk, user.pk, ) self.assertEqual( backend.authenticate( request=None, username=user.username, password=user.username ), None, ) @override_settings( ACCOUNT_AUTHENTICATION_METHOD=app_settings.AuthenticationMethod.USERNAME_EMAIL ) # noqa def test_auth_by_username_or_email(self): user = self.user backend = AuthenticationBackend() self.assertEqual( backend.authenticate( request=None, username=user.email, password=user.username ).pk, user.pk, ) self.assertEqual( backend.authenticate( request=None, username=user.username, password=user.username ).pk, user.pk, ) class UUIDUser(AbstractUser): id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) class Meta(AbstractUser.Meta): swappable = "AUTH_USER_MODEL" class UtilsTests(TestCase): def setUp(self): self.user_id = uuid.uuid4().hex def test_url_str_to_pk_identifies_UUID_as_stringlike(self): with patch("allauth.account.utils.get_user_model") as mocked_gum: mocked_gum.return_value = UUIDUser self.assertEqual(url_str_to_user_pk(self.user_id), uuid.UUID(self.user_id)) def test_pk_to_url_string_identifies_UUID_as_stringlike(self): user = UUIDUser(is_active=True, email="john@example.com", username="john") self.assertEqual(user_pk_to_url_str(user), str(user.pk)) @override_settings(ACCOUNT_PRESERVE_USERNAME_CASING=False) def test_username_lower_cased(self): user = get_user_model()() user_username(user, "CamelCase") self.assertEqual(user_username(user), "camelcase") # TODO: Actually test something filter_users_by_username("CamelCase", "FooBar") @override_settings(ACCOUNT_PRESERVE_USERNAME_CASING=True) def test_username_case_preserved(self): user = get_user_model()() user_username(user, "CamelCase") self.assertEqual(user_username(user), "CamelCase") # TODO: Actually test something filter_users_by_username("camelcase", "foobar") def test_user_display(self): user = get_user_model()(username="john
doe") expected_name = "john<br/>doe" templates = [ "{% load account %}{% user_display user %}", "{% load account %}{% user_display user as x %}{{ x }}", ] for template in templates: t = Template(template) content = t.render(Context({"user": user})) self.assertEqual(content, expected_name) class ConfirmationViewTests(TestCase): def _create_user(self, username="john", password="doe"): user = get_user_model().objects.create(username=username, is_active=True) if password: user.set_password(password) else: user.set_unusable_password() user.save() return user @override_settings( ACCOUNT_EMAIL_CONFIRMATION_HMAC=True, ACCOUNT_LOGIN_ON_EMAIL_CONFIRMATION=True, ) def test_login_on_confirm(self): user = self._create_user() email = EmailAddress.objects.create( user=user, email="a@b.com", verified=False, primary=True ) key = EmailConfirmationHMAC(email).key receiver_mock = Mock() # we've logged if signal was called user_logged_in.connect(receiver_mock) # fake post-signup account_user stash session = self.client.session session["account_user"] = user_pk_to_url_str(user) session.save() resp = self.client.post(reverse("account_confirm_email", args=[key])) email = EmailAddress.objects.get(pk=email.pk) self.assertTrue(email.verified) receiver_mock.assert_called_once_with( sender=get_user_model(), request=resp.wsgi_request, response=resp, user=get_user_model().objects.get(username="john"), signal=user_logged_in, ) user_logged_in.disconnect(receiver_mock) @override_settings( ACCOUNT_EMAIL_CONFIRMATION_HMAC=True, ACCOUNT_LOGIN_ON_EMAIL_CONFIRMATION=True, ) @patch("allauth.account.views.perform_login") @patch("allauth.account.utils.get_user_model", return_value=UUIDUser) def test_login_on_confirm_uuid_user(self, mocked_gum, mock_perform_login): user = UUIDUser(is_active=True, email="john@example.com", username="john") # fake post-signup account_user stash session = self.client.session session["account_user"] = user_pk_to_url_str(user) session.save() # fake email and email confirmation to avoid swappable model hell email = Mock(verified=False, user=user) key = "mockkey" confirmation = Mock(autospec=EmailConfirmationHMAC, key=key) confirmation.email_address = email confirmation.from_key.return_value = confirmation mock_perform_login.return_value = HttpResponseRedirect(redirect_to="/") with patch("allauth.account.views.EmailConfirmationHMAC", confirmation): self.client.post(reverse("account_confirm_email", args=[key])) assert mock_perform_login.called class TestResetPasswordForm(TestCase): def test_user_email_not_sent_inactive_user(self): User = get_user_model() User.objects.create_user( "mike123", "mike@ixample.org", "test123", is_active=False ) data = {"email": "mike@ixample.org"} form = ResetPasswordForm(data) self.assertFalse(form.is_valid()) class TestCVE2019_19844(TestCase): global_request = RequestFactory().get("/") def test_user_email_unicode_collision(self): User = get_user_model() User.objects.create_user("mike123", "mike@example.org", "test123") User.objects.create_user("mike456", "mıke@example.org", "test123") data = {"email": "mıke@example.org"} form = ResetPasswordForm(data) self.assertTrue(form.is_valid()) form.save(self.global_request) self.assertEqual(len(mail.outbox), 1) self.assertEqual(mail.outbox[0].to, ["mıke@example.org"]) def test_user_email_domain_unicode_collision(self): User = get_user_model() User.objects.create_user("mike123", "mike@ixample.org", "test123") User.objects.create_user("mike456", "mike@ıxample.org", "test123") data = {"email": "mike@ıxample.org"} form = ResetPasswordForm(data) self.assertTrue(form.is_valid()) form.save(self.global_request) self.assertEqual(len(mail.outbox), 1) self.assertEqual(mail.outbox[0].to, ["mike@ıxample.org"]) def test_user_email_unicode_collision_nonexistent(self): User = get_user_model() User.objects.create_user("mike123", "mike@example.org", "test123") data = {"email": "mıke@example.org"} form = ResetPasswordForm(data) self.assertFalse(form.is_valid()) def test_user_email_domain_unicode_collision_nonexistent(self): User = get_user_model() User.objects.create_user("mike123", "mike@ixample.org", "test123") data = {"email": "mike@ıxample.org"} form = ResetPasswordForm(data) self.assertFalse(form.is_valid()) class RequestAjaxTests(TestCase): def _send_post_request(self, **kwargs): return self.client.post( reverse("account_signup"), { "username": "johndoe", "email": "john@example.org", "email2": "john@example.org", "password1": "johndoe", "password2": "johndoe", }, **kwargs, ) def test_no_ajax_header(self): resp = self._send_post_request() self.assertEqual(302, resp.status_code) self.assertRedirects( resp, settings.LOGIN_REDIRECT_URL, fetch_redirect_response=False ) def test_ajax_header_x_requested_with(self): resp = self._send_post_request(HTTP_X_REQUESTED_WITH="XMLHttpRequest") self.assertEqual(200, resp.status_code) self.assertEqual(settings.LOGIN_REDIRECT_URL, resp.json()["location"]) def test_ajax_header_http_accept(self): resp = self._send_post_request(HTTP_ACCEPT="application/json") self.assertEqual(200, resp.status_code) self.assertEqual(settings.LOGIN_REDIRECT_URL, resp.json()["location"]) django-allauth-0.47.0/allauth/account/urls.py000066400000000000000000000025741415442050100211250ustar00rootroot00000000000000from django.urls import path, re_path from . import views urlpatterns = [ path("signup/", views.signup, name="account_signup"), path("login/", views.login, name="account_login"), path("logout/", views.logout, name="account_logout"), path( "password/change/", views.password_change, name="account_change_password", ), path("password/set/", views.password_set, name="account_set_password"), path("inactive/", views.account_inactive, name="account_inactive"), # E-mail path("email/", views.email, name="account_email"), path( "confirm-email/", views.email_verification_sent, name="account_email_verification_sent", ), re_path( r"^confirm-email/(?P[-:\w]+)/$", views.confirm_email, name="account_confirm_email", ), # password reset path("password/reset/", views.password_reset, name="account_reset_password"), path( "password/reset/done/", views.password_reset_done, name="account_reset_password_done", ), re_path( r"^password/reset/key/(?P[0-9A-Za-z]+)-(?P.+)/$", views.password_reset_from_key, name="account_reset_password_from_key", ), path( "password/reset/key/done/", views.password_reset_from_key_done, name="account_reset_password_from_key_done", ), ] django-allauth-0.47.0/allauth/account/utils.py000066400000000000000000000370241415442050100212760ustar00rootroot00000000000000import unicodedata from collections import OrderedDict from datetime import timedelta from django.conf import settings from django.contrib import messages from django.contrib.auth import update_session_auth_hash from django.core.exceptions import FieldDoesNotExist, ValidationError from django.db import models from django.db.models import Q from django.http import HttpResponseRedirect from django.utils.encoding import force_str from django.utils.http import base36_to_int, int_to_base36, urlencode from django.utils.timezone import now from ..exceptions import ImmediateHttpResponse from ..utils import ( get_request_param, get_user_model, import_callable, valid_email_or_none, ) from . import app_settings, signals from .adapter import get_adapter from .app_settings import EmailVerificationMethod def _unicode_ci_compare(s1, s2): """ Perform case-insensitive comparison of two identifiers, using the recommended algorithm from Unicode Technical Report 36, section 2.11.2(B)(2). """ norm_s1 = unicodedata.normalize("NFKC", s1).casefold() norm_s2 = unicodedata.normalize("NFKC", s2).casefold() return norm_s1 == norm_s2 def get_next_redirect_url(request, redirect_field_name="next"): """ Returns the next URL to redirect to, if it was explicitly passed via the request. """ redirect_to = get_request_param(request, redirect_field_name) if not get_adapter(request).is_safe_url(redirect_to): redirect_to = None return redirect_to def get_login_redirect_url(request, url=None, redirect_field_name="next", signup=False): ret = url if url and callable(url): # In order to be able to pass url getters around that depend # on e.g. the authenticated state. ret = url() if not ret: ret = get_next_redirect_url(request, redirect_field_name=redirect_field_name) if not ret: if signup: ret = get_adapter(request).get_signup_redirect_url(request) else: ret = get_adapter(request).get_login_redirect_url(request) return ret _user_display_callable = None def logout_on_password_change(request, user): # Since it is the default behavior of Django to invalidate all sessions on # password change, this function actually has to preserve the session when # logout isn't desired. if not app_settings.LOGOUT_ON_PASSWORD_CHANGE: update_session_auth_hash(request, user) def default_user_display(user): if app_settings.USER_MODEL_USERNAME_FIELD: return getattr(user, app_settings.USER_MODEL_USERNAME_FIELD) else: return force_str(user) def user_display(user): global _user_display_callable if not _user_display_callable: f = getattr(settings, "ACCOUNT_USER_DISPLAY", default_user_display) _user_display_callable = import_callable(f) return _user_display_callable(user) def user_field(user, field, *args): """ Gets or sets (optional) user model fields. No-op if fields do not exist. """ if not field: return User = get_user_model() try: field_meta = User._meta.get_field(field) max_length = field_meta.max_length except FieldDoesNotExist: if not hasattr(user, field): return max_length = None if args: # Setter v = args[0] if v: v = v[0:max_length] setattr(user, field, v) else: # Getter return getattr(user, field) def user_username(user, *args): if args and not app_settings.PRESERVE_USERNAME_CASING and args[0]: args = [args[0].lower()] return user_field(user, app_settings.USER_MODEL_USERNAME_FIELD, *args) def user_email(user, *args): return user_field(user, app_settings.USER_MODEL_EMAIL_FIELD, *args) def _has_verified_for_login(user, email): from .models import EmailAddress emailaddress = None if email: ret = False try: emailaddress = EmailAddress.objects.get_for_user(user, email) ret = emailaddress.verified except EmailAddress.DoesNotExist: pass else: ret = EmailAddress.objects.filter(user=user, verified=True).exists() return ret def perform_login( request, user, email_verification, redirect_url=None, signal_kwargs=None, signup=False, email=None, ): """ Keyword arguments: signup -- Indicates whether or not sending the email is essential (during signup), or if it can be skipped (e.g. in case email verification is optional and we are only logging in). """ # Local users are stopped due to form validation checking # is_active, yet, adapter methods could toy with is_active in a # `user_signed_up` signal. Furthermore, social users should be # stopped anyway. adapter = get_adapter(request) if not user.is_active: return adapter.respond_user_inactive(request, user) if email_verification == EmailVerificationMethod.NONE: pass elif email_verification == EmailVerificationMethod.OPTIONAL: # In case of OPTIONAL verification: send on signup. if not _has_verified_for_login(user, email) and signup: send_email_confirmation(request, user, signup=signup, email=email) elif email_verification == EmailVerificationMethod.MANDATORY: if not _has_verified_for_login(user, email): send_email_confirmation(request, user, signup=signup, email=email) return adapter.respond_email_verification_sent(request, user) try: adapter.login(request, user) response = HttpResponseRedirect( get_login_redirect_url(request, redirect_url, signup=signup) ) if signal_kwargs is None: signal_kwargs = {} signals.user_logged_in.send( sender=user.__class__, request=request, response=response, user=user, **signal_kwargs, ) adapter.add_message( request, messages.SUCCESS, "account/messages/logged_in.txt", {"user": user}, ) except ImmediateHttpResponse as e: response = e.response return response def complete_signup(request, user, email_verification, success_url, signal_kwargs=None): if signal_kwargs is None: signal_kwargs = {} signals.user_signed_up.send( sender=user.__class__, request=request, user=user, **signal_kwargs ) return perform_login( request, user, email_verification=email_verification, signup=True, redirect_url=success_url, signal_kwargs=signal_kwargs, ) def cleanup_email_addresses(request, addresses): """ Takes a list of EmailAddress instances and cleans it up, making sure only valid ones remain, without multiple primaries etc. Order is important: e.g. if multiple primary e-mail addresses exist, the first one encountered will be kept as primary. """ from .models import EmailAddress adapter = get_adapter(request) # Let's group by `email` e2a = OrderedDict() # maps email to EmailAddress primary_addresses = [] verified_addresses = [] primary_verified_addresses = [] for address in addresses: # Pick up only valid ones... email = valid_email_or_none(address.email) if not email: continue # ... and non-conflicting ones... if ( app_settings.UNIQUE_EMAIL and EmailAddress.objects.filter(email__iexact=email).exists() ): continue a = e2a.get(email.lower()) if a: a.primary = a.primary or address.primary a.verified = a.verified or address.verified else: a = address a.verified = a.verified or adapter.is_email_verified(request, a.email) e2a[email.lower()] = a if a.primary: primary_addresses.append(a) if a.verified: primary_verified_addresses.append(a) if a.verified: verified_addresses.append(a) # Now that we got things sorted out, let's assign a primary if primary_verified_addresses: primary_address = primary_verified_addresses[0] elif verified_addresses: # Pick any verified as primary primary_address = verified_addresses[0] elif primary_addresses: # Okay, let's pick primary then, even if unverified primary_address = primary_addresses[0] elif e2a: # Pick the first primary_address = e2a.keys()[0] else: # Empty primary_address = None # There can only be one primary for a in e2a.values(): a.primary = primary_address.email.lower() == a.email.lower() return list(e2a.values()), primary_address def setup_user_email(request, user, addresses): """ Creates proper EmailAddress for the user that was just signed up. Only sets up, doesn't do any other handling such as sending out email confirmation mails etc. """ from .models import EmailAddress assert not EmailAddress.objects.filter(user=user).exists() priority_addresses = [] # Is there a stashed e-mail? adapter = get_adapter(request) stashed_email = adapter.unstash_verified_email(request) if stashed_email: priority_addresses.append( EmailAddress(user=user, email=stashed_email, primary=True, verified=True) ) email = user_email(user) if email: priority_addresses.append( EmailAddress(user=user, email=email, primary=True, verified=False) ) addresses, primary = cleanup_email_addresses( request, priority_addresses + addresses ) for a in addresses: a.user = user a.save() EmailAddress.objects.fill_cache_for_user(user, addresses) if primary and email and email.lower() != primary.email.lower(): user_email(user, primary.email) user.save() return primary def send_email_confirmation(request, user, signup=False, email=None): """ E-mail verification mails are sent: a) Explicitly: when a user signs up b) Implicitly: when a user attempts to log in using an unverified e-mail while EMAIL_VERIFICATION is mandatory. Especially in case of b), we want to limit the number of mails sent (consider a user retrying a few times), which is why there is a cooldown period before sending a new mail. This cooldown period can be configured in ACCOUNT_EMAIL_CONFIRMATION_COOLDOWN setting. """ from .models import EmailAddress, EmailConfirmation cooldown_period = timedelta(seconds=app_settings.EMAIL_CONFIRMATION_COOLDOWN) if not email: email = user_email(user) if email: try: email_address = EmailAddress.objects.get_for_user(user, email) if not email_address.verified: if app_settings.EMAIL_CONFIRMATION_HMAC: send_email = True else: send_email = not EmailConfirmation.objects.filter( sent__gt=now() - cooldown_period, email_address=email_address, ).exists() if send_email: email_address.send_confirmation(request, signup=signup) else: send_email = False except EmailAddress.DoesNotExist: send_email = True email_address = EmailAddress.objects.add_email( request, user, email, signup=signup, confirm=True ) assert email_address # At this point, if we were supposed to send an email we have sent it. if send_email: get_adapter(request).add_message( request, messages.INFO, "account/messages/email_confirmation_sent.txt", {"email": email}, ) if signup: get_adapter(request).stash_user(request, user_pk_to_url_str(user)) def sync_user_email_addresses(user): """ Keep user.email in sync with user.emailaddress_set. Under some circumstances the user.email may not have ended up as an EmailAddress record, e.g. in the case of manually created admin users. """ from .models import EmailAddress email = user_email(user) if ( email and not EmailAddress.objects.filter(user=user, email__iexact=email).exists() ): if ( app_settings.UNIQUE_EMAIL and EmailAddress.objects.filter(email__iexact=email).exists() ): # Bail out return EmailAddress.objects.create( user=user, email=email, primary=False, verified=False ) def filter_users_by_username(*username): if app_settings.PRESERVE_USERNAME_CASING: qlist = [ Q(**{app_settings.USER_MODEL_USERNAME_FIELD + "__iexact": u}) for u in username ] q = qlist[0] for q2 in qlist[1:]: q = q | q2 ret = get_user_model()._default_manager.filter(q) else: ret = get_user_model()._default_manager.filter( **{ app_settings.USER_MODEL_USERNAME_FIELD + "__in": [u.lower() for u in username] } ) return ret def filter_users_by_email(email, is_active=None): """Return list of users by email address Typically one, at most just a few in length. First we look through EmailAddress table, than customisable User model table. Add results together avoiding SQL joins and deduplicate. """ from .models import EmailAddress User = get_user_model() mails = EmailAddress.objects.filter(email__iexact=email) if is_active is not None: mails = mails.filter(user__is_active=is_active) users = [] for e in mails.prefetch_related("user"): if _unicode_ci_compare(e.email, email): users.append(e.user) if app_settings.USER_MODEL_EMAIL_FIELD: q_dict = {app_settings.USER_MODEL_EMAIL_FIELD + "__iexact": email} user_qs = User.objects.filter(**q_dict) if is_active is not None: user_qs = user_qs.filter(is_active=is_active) for user in user_qs.iterator(): user_email = getattr(user, app_settings.USER_MODEL_EMAIL_FIELD) if _unicode_ci_compare(user_email, email): users.append(user) return list(set(users)) def passthrough_next_redirect_url(request, url, redirect_field_name): assert url.find("?") < 0 # TODO: Handle this case properly next_url = get_next_redirect_url(request, redirect_field_name) if next_url: url = url + "?" + urlencode({redirect_field_name: next_url}) return url def user_pk_to_url_str(user): """ This should return a string. """ User = get_user_model() if issubclass(type(User._meta.pk), models.UUIDField): if isinstance(user.pk, str): return user.pk return user.pk.hex ret = user.pk if isinstance(ret, int): ret = int_to_base36(user.pk) return str(ret) def url_str_to_user_pk(s): User = get_user_model() # TODO: Ugh, isn't there a cleaner way to determine whether or not # the PK is a str-like field? remote_field = getattr(User._meta.pk, "remote_field", None) if remote_field and getattr(remote_field, "to", None): pk_field = User._meta.pk.remote_field.to._meta.pk else: pk_field = User._meta.pk if issubclass(type(pk_field), models.UUIDField): return pk_field.to_python(s) try: pk_field.to_python("a") pk = s except ValidationError: pk = base36_to_int(s) return pk django-allauth-0.47.0/allauth/account/views.py000066400000000000000000000755171415442050100213040ustar00rootroot00000000000000from django.contrib import messages from django.contrib.auth.decorators import login_required from django.contrib.sites.shortcuts import get_current_site from django.http import ( Http404, HttpResponsePermanentRedirect, HttpResponseRedirect, ) from django.shortcuts import redirect from django.urls import reverse, reverse_lazy from django.utils.decorators import method_decorator from django.views.decorators.debug import sensitive_post_parameters from django.views.generic.base import TemplateResponseMixin, TemplateView, View from django.views.generic.edit import FormView from ..exceptions import ImmediateHttpResponse from ..utils import get_form_class, get_request_param from . import app_settings, signals from .adapter import get_adapter from .forms import ( AddEmailForm, ChangePasswordForm, LoginForm, ResetPasswordForm, ResetPasswordKeyForm, SetPasswordForm, SignupForm, UserTokenForm, ) from .models import EmailAddress, EmailConfirmation, EmailConfirmationHMAC from .utils import ( complete_signup, get_login_redirect_url, get_next_redirect_url, logout_on_password_change, passthrough_next_redirect_url, perform_login, sync_user_email_addresses, url_str_to_user_pk, ) INTERNAL_RESET_URL_KEY = "set-password" INTERNAL_RESET_SESSION_KEY = "_password_reset_key" sensitive_post_parameters_m = method_decorator( sensitive_post_parameters("oldpassword", "password", "password1", "password2") ) def _ajax_response(request, response, form=None, data=None): adapter = get_adapter(request) if adapter.is_ajax(request): if isinstance(response, HttpResponseRedirect) or isinstance( response, HttpResponsePermanentRedirect ): redirect_to = response["Location"] else: redirect_to = None response = adapter.ajax_response( request, response, form=form, data=data, redirect_to=redirect_to ) return response class RedirectAuthenticatedUserMixin(object): def dispatch(self, request, *args, **kwargs): if request.user.is_authenticated and app_settings.AUTHENTICATED_LOGIN_REDIRECTS: redirect_to = self.get_authenticated_redirect_url() response = HttpResponseRedirect(redirect_to) return _ajax_response(request, response) else: response = super(RedirectAuthenticatedUserMixin, self).dispatch( request, *args, **kwargs ) return response def get_authenticated_redirect_url(self): redirect_field_name = self.redirect_field_name return get_login_redirect_url( self.request, url=self.get_success_url(), redirect_field_name=redirect_field_name, ) class AjaxCapableProcessFormViewMixin(object): def get(self, request, *args, **kwargs): response = super(AjaxCapableProcessFormViewMixin, self).get( request, *args, **kwargs ) form = self.get_form() return _ajax_response( self.request, response, form=form, data=self._get_ajax_data_if() ) def post(self, request, *args, **kwargs): form_class = self.get_form_class() form = self.get_form(form_class) if form.is_valid(): response = self.form_valid(form) else: response = self.form_invalid(form) return _ajax_response( self.request, response, form=form, data=self._get_ajax_data_if() ) def get_form(self, form_class=None): form = getattr(self, "_cached_form", None) if form is None: form = super(AjaxCapableProcessFormViewMixin, self).get_form(form_class) self._cached_form = form return form def _get_ajax_data_if(self): return ( self.get_ajax_data() if get_adapter(self.request).is_ajax(self.request) else None ) def get_ajax_data(self): return None class LogoutFunctionalityMixin(object): def logout(self): adapter = get_adapter(self.request) adapter.add_message( self.request, messages.SUCCESS, "account/messages/logged_out.txt" ) adapter.logout(self.request) class LoginView( RedirectAuthenticatedUserMixin, AjaxCapableProcessFormViewMixin, FormView ): form_class = LoginForm template_name = "account/login." + app_settings.TEMPLATE_EXTENSION success_url = None redirect_field_name = "next" @sensitive_post_parameters_m def dispatch(self, request, *args, **kwargs): return super(LoginView, self).dispatch(request, *args, **kwargs) def get_form_kwargs(self): kwargs = super(LoginView, self).get_form_kwargs() kwargs["request"] = self.request return kwargs def get_form_class(self): return get_form_class(app_settings.FORMS, "login", self.form_class) def form_valid(self, form): success_url = self.get_success_url() try: return form.login(self.request, redirect_url=success_url) except ImmediateHttpResponse as e: return e.response def get_success_url(self): # Explicitly passed ?next= URL takes precedence ret = ( get_next_redirect_url(self.request, self.redirect_field_name) or self.success_url ) return ret def get_context_data(self, **kwargs): ret = super(LoginView, self).get_context_data(**kwargs) signup_url = passthrough_next_redirect_url( self.request, reverse("account_signup"), self.redirect_field_name ) redirect_field_value = get_request_param(self.request, self.redirect_field_name) site = get_current_site(self.request) ret.update( { "signup_url": signup_url, "site": site, "redirect_field_name": self.redirect_field_name, "redirect_field_value": redirect_field_value, } ) return ret login = LoginView.as_view() class CloseableSignupMixin(object): template_name_signup_closed = ( "account/signup_closed." + app_settings.TEMPLATE_EXTENSION ) def dispatch(self, request, *args, **kwargs): try: if not self.is_open(): return self.closed() except ImmediateHttpResponse as e: return e.response return super(CloseableSignupMixin, self).dispatch(request, *args, **kwargs) def is_open(self): return get_adapter(self.request).is_open_for_signup(self.request) def closed(self): response_kwargs = { "request": self.request, "template": self.template_name_signup_closed, } return self.response_class(**response_kwargs) class SignupView( RedirectAuthenticatedUserMixin, CloseableSignupMixin, AjaxCapableProcessFormViewMixin, FormView, ): template_name = "account/signup." + app_settings.TEMPLATE_EXTENSION form_class = SignupForm redirect_field_name = "next" success_url = None @sensitive_post_parameters_m def dispatch(self, request, *args, **kwargs): return super(SignupView, self).dispatch(request, *args, **kwargs) def get_form_class(self): return get_form_class(app_settings.FORMS, "signup", self.form_class) def get_success_url(self): # Explicitly passed ?next= URL takes precedence ret = ( get_next_redirect_url(self.request, self.redirect_field_name) or self.success_url ) return ret def form_valid(self, form): # By assigning the User to a property on the view, we allow subclasses # of SignupView to access the newly created User instance self.user = form.save(self.request) try: return complete_signup( self.request, self.user, app_settings.EMAIL_VERIFICATION, self.get_success_url(), ) except ImmediateHttpResponse as e: return e.response def get_context_data(self, **kwargs): ret = super(SignupView, self).get_context_data(**kwargs) form = ret["form"] email = self.request.session.get("account_verified_email") if email: email_keys = ["email"] if app_settings.SIGNUP_EMAIL_ENTER_TWICE: email_keys.append("email2") for email_key in email_keys: form.fields[email_key].initial = email login_url = passthrough_next_redirect_url( self.request, reverse("account_login"), self.redirect_field_name ) redirect_field_name = self.redirect_field_name site = get_current_site(self.request) redirect_field_value = get_request_param(self.request, redirect_field_name) ret.update( { "login_url": login_url, "redirect_field_name": redirect_field_name, "redirect_field_value": redirect_field_value, "site": site, } ) return ret signup = SignupView.as_view() class ConfirmEmailView(TemplateResponseMixin, LogoutFunctionalityMixin, View): template_name = "account/email_confirm." + app_settings.TEMPLATE_EXTENSION def get(self, *args, **kwargs): try: self.object = self.get_object() if app_settings.CONFIRM_EMAIL_ON_GET: return self.post(*args, **kwargs) except Http404: self.object = None ctx = self.get_context_data() return self.render_to_response(ctx) def post(self, *args, **kwargs): self.object = confirmation = self.get_object() confirmation.confirm(self.request) # In the event someone clicks on an email confirmation link # for one account while logged into another account, # logout of the currently logged in account. if ( self.request.user.is_authenticated and self.request.user.pk != confirmation.email_address.user_id ): self.logout() get_adapter(self.request).add_message( self.request, messages.SUCCESS, "account/messages/email_confirmed.txt", {"email": confirmation.email_address.email}, ) if app_settings.LOGIN_ON_EMAIL_CONFIRMATION: resp = self.login_on_confirm(confirmation) if resp is not None: return resp # Don't -- allauth doesn't touch is_active so that sys admin can # use it to block users et al # # user = confirmation.email_address.user # user.is_active = True # user.save() redirect_url = self.get_redirect_url() if not redirect_url: ctx = self.get_context_data() return self.render_to_response(ctx) return redirect(redirect_url) def login_on_confirm(self, confirmation): """ Simply logging in the user may become a security issue. If you do not take proper care (e.g. don't purge used email confirmations), a malicious person that got hold of the link will be able to login over and over again and the user is unable to do anything about it. Even restoring their own mailbox security will not help, as the links will still work. For password reset this is different, this mechanism works only as long as the attacker has access to the mailbox. If they no longer has access they cannot issue a password request and intercept it. Furthermore, all places where the links are listed (log files, but even Google Analytics) all of a sudden need to be secured. Purging the email confirmation once confirmed changes the behavior -- users will not be able to repeatedly confirm (in case they forgot that they already clicked the mail). All in all, opted for storing the user that is in the process of signing up in the session to avoid all of the above. This may not 100% work in case the user closes the browser (and the session gets lost), but at least we're secure. """ user_pk = None user_pk_str = get_adapter(self.request).unstash_user(self.request) if user_pk_str: user_pk = url_str_to_user_pk(user_pk_str) user = confirmation.email_address.user if user_pk == user.pk and self.request.user.is_anonymous: return perform_login( self.request, user, app_settings.EmailVerificationMethod.NONE, # passed as callable, as this method # depends on the authenticated state redirect_url=self.get_redirect_url, ) return None def get_object(self, queryset=None): key = self.kwargs["key"] emailconfirmation = EmailConfirmationHMAC.from_key(key) if not emailconfirmation: if queryset is None: queryset = self.get_queryset() try: emailconfirmation = queryset.get(key=key.lower()) except EmailConfirmation.DoesNotExist: raise Http404() return emailconfirmation def get_queryset(self): qs = EmailConfirmation.objects.all_valid() qs = qs.select_related("email_address__user") return qs def get_context_data(self, **kwargs): ctx = kwargs ctx["confirmation"] = self.object site = get_current_site(self.request) ctx.update({"site": site}) return ctx def get_redirect_url(self): return get_adapter(self.request).get_email_confirmation_redirect_url( self.request ) confirm_email = ConfirmEmailView.as_view() class EmailView(AjaxCapableProcessFormViewMixin, FormView): template_name = "account/email." + app_settings.TEMPLATE_EXTENSION form_class = AddEmailForm success_url = reverse_lazy("account_email") def get_form_class(self): return get_form_class(app_settings.FORMS, "add_email", self.form_class) def dispatch(self, request, *args, **kwargs): sync_user_email_addresses(request.user) return super(EmailView, self).dispatch(request, *args, **kwargs) def get_form_kwargs(self): kwargs = super(EmailView, self).get_form_kwargs() kwargs["user"] = self.request.user return kwargs def form_valid(self, form): email_address = form.save(self.request) get_adapter(self.request).add_message( self.request, messages.INFO, "account/messages/email_confirmation_sent.txt", {"email": form.cleaned_data["email"]}, ) signals.email_added.send( sender=self.request.user.__class__, request=self.request, user=self.request.user, email_address=email_address, ) return super(EmailView, self).form_valid(form) def post(self, request, *args, **kwargs): res = None if "action_add" in request.POST: res = super(EmailView, self).post(request, *args, **kwargs) elif request.POST.get("email"): if "action_send" in request.POST: res = self._action_send(request) elif "action_remove" in request.POST: res = self._action_remove(request) elif "action_primary" in request.POST: res = self._action_primary(request) res = res or HttpResponseRedirect(self.success_url) # Given that we bypassed AjaxCapableProcessFormViewMixin, # we'll have to call invoke it manually... res = _ajax_response(request, res, data=self._get_ajax_data_if()) else: # No email address selected res = HttpResponseRedirect(self.success_url) res = _ajax_response(request, res, data=self._get_ajax_data_if()) return res def _action_send(self, request, *args, **kwargs): email = request.POST["email"] try: email_address = EmailAddress.objects.get( user=request.user, email=email, ) get_adapter(request).add_message( request, messages.INFO, "account/messages/email_confirmation_sent.txt", {"email": email}, ) email_address.send_confirmation(request) return HttpResponseRedirect(self.get_success_url()) except EmailAddress.DoesNotExist: pass def _action_remove(self, request, *args, **kwargs): email = request.POST["email"] try: email_address = EmailAddress.objects.get(user=request.user, email=email) if email_address.primary: get_adapter(request).add_message( request, messages.ERROR, "account/messages/cannot_delete_primary_email.txt", {"email": email}, ) else: email_address.delete() signals.email_removed.send( sender=request.user.__class__, request=request, user=request.user, email_address=email_address, ) get_adapter(request).add_message( request, messages.SUCCESS, "account/messages/email_deleted.txt", {"email": email}, ) return HttpResponseRedirect(self.get_success_url()) except EmailAddress.DoesNotExist: pass def _action_primary(self, request, *args, **kwargs): email = request.POST["email"] try: email_address = EmailAddress.objects.get_for_user( user=request.user, email=email ) # Not primary=True -- Slightly different variation, don't # require verified unless moving from a verified # address. Ignore constraint if previous primary email # address is not verified. if ( not email_address.verified and EmailAddress.objects.filter( user=request.user, verified=True ).exists() ): get_adapter(request).add_message( request, messages.ERROR, "account/messages/unverified_primary_email.txt", ) else: # Sending the old primary address to the signal # adds a db query. try: from_email_address = EmailAddress.objects.get( user=request.user, primary=True ) except EmailAddress.DoesNotExist: from_email_address = None email_address.set_as_primary() get_adapter(request).add_message( request, messages.SUCCESS, "account/messages/primary_email_set.txt", ) signals.email_changed.send( sender=request.user.__class__, request=request, user=request.user, from_email_address=from_email_address, to_email_address=email_address, ) return HttpResponseRedirect(self.get_success_url()) except EmailAddress.DoesNotExist: pass def get_context_data(self, **kwargs): ret = super(EmailView, self).get_context_data(**kwargs) # NOTE: For backwards compatibility ret["add_email_form"] = ret.get("form") # (end NOTE) ret["can_add_email"] = EmailAddress.objects.can_add_email(self.request.user) return ret def get_ajax_data(self): data = [] for emailaddress in self.request.user.emailaddress_set.all(): data.append( { "id": emailaddress.pk, "email": emailaddress.email, "verified": emailaddress.verified, "primary": emailaddress.primary, } ) return data email = login_required(EmailView.as_view()) class PasswordChangeView(AjaxCapableProcessFormViewMixin, FormView): template_name = "account/password_change." + app_settings.TEMPLATE_EXTENSION form_class = ChangePasswordForm success_url = reverse_lazy("account_change_password") def get_form_class(self): return get_form_class(app_settings.FORMS, "change_password", self.form_class) @sensitive_post_parameters_m def dispatch(self, request, *args, **kwargs): return super(PasswordChangeView, self).dispatch(request, *args, **kwargs) def render_to_response(self, context, **response_kwargs): if not self.request.user.has_usable_password(): return HttpResponseRedirect(reverse("account_set_password")) return super(PasswordChangeView, self).render_to_response( context, **response_kwargs ) def get_form_kwargs(self): kwargs = super(PasswordChangeView, self).get_form_kwargs() kwargs["user"] = self.request.user return kwargs def form_valid(self, form): form.save() logout_on_password_change(self.request, form.user) get_adapter(self.request).add_message( self.request, messages.SUCCESS, "account/messages/password_changed.txt", ) signals.password_changed.send( sender=self.request.user.__class__, request=self.request, user=self.request.user, ) return super(PasswordChangeView, self).form_valid(form) def get_context_data(self, **kwargs): ret = super(PasswordChangeView, self).get_context_data(**kwargs) # NOTE: For backwards compatibility ret["password_change_form"] = ret.get("form") # (end NOTE) return ret password_change = login_required(PasswordChangeView.as_view()) class PasswordSetView(AjaxCapableProcessFormViewMixin, FormView): template_name = "account/password_set." + app_settings.TEMPLATE_EXTENSION form_class = SetPasswordForm success_url = reverse_lazy("account_set_password") def get_form_class(self): return get_form_class(app_settings.FORMS, "set_password", self.form_class) @sensitive_post_parameters_m def dispatch(self, request, *args, **kwargs): if self.request.user.has_usable_password(): return HttpResponseRedirect(reverse("account_change_password")) return super(PasswordSetView, self).dispatch(request, *args, **kwargs) def render_to_response(self, context, **response_kwargs): return super(PasswordSetView, self).render_to_response( context, **response_kwargs ) def get_form_kwargs(self): kwargs = super(PasswordSetView, self).get_form_kwargs() kwargs["user"] = self.request.user return kwargs def form_valid(self, form): form.save() logout_on_password_change(self.request, form.user) get_adapter(self.request).add_message( self.request, messages.SUCCESS, "account/messages/password_set.txt" ) signals.password_set.send( sender=self.request.user.__class__, request=self.request, user=self.request.user, ) return super(PasswordSetView, self).form_valid(form) def get_context_data(self, **kwargs): ret = super(PasswordSetView, self).get_context_data(**kwargs) # NOTE: For backwards compatibility ret["password_set_form"] = ret.get("form") # (end NOTE) return ret password_set = login_required(PasswordSetView.as_view()) class PasswordResetView(AjaxCapableProcessFormViewMixin, FormView): template_name = "account/password_reset." + app_settings.TEMPLATE_EXTENSION form_class = ResetPasswordForm success_url = reverse_lazy("account_reset_password_done") redirect_field_name = "next" def get_form_class(self): return get_form_class(app_settings.FORMS, "reset_password", self.form_class) def form_valid(self, form): form.save(self.request) return super(PasswordResetView, self).form_valid(form) def get_context_data(self, **kwargs): ret = super(PasswordResetView, self).get_context_data(**kwargs) login_url = passthrough_next_redirect_url( self.request, reverse("account_login"), self.redirect_field_name ) # NOTE: For backwards compatibility ret["password_reset_form"] = ret.get("form") # (end NOTE) ret.update({"login_url": login_url}) return ret password_reset = PasswordResetView.as_view() class PasswordResetDoneView(TemplateView): template_name = "account/password_reset_done." + app_settings.TEMPLATE_EXTENSION password_reset_done = PasswordResetDoneView.as_view() class PasswordResetFromKeyView( AjaxCapableProcessFormViewMixin, LogoutFunctionalityMixin, FormView ): template_name = "account/password_reset_from_key." + app_settings.TEMPLATE_EXTENSION form_class = ResetPasswordKeyForm success_url = reverse_lazy("account_reset_password_from_key_done") def get_form_class(self): return get_form_class( app_settings.FORMS, "reset_password_from_key", self.form_class ) def dispatch(self, request, uidb36, key, **kwargs): self.request = request self.key = key if self.key == INTERNAL_RESET_URL_KEY: self.key = self.request.session.get(INTERNAL_RESET_SESSION_KEY, "") # (Ab)using forms here to be able to handle errors in XHR #890 token_form = UserTokenForm(data={"uidb36": uidb36, "key": self.key}) if token_form.is_valid(): self.reset_user = token_form.reset_user # In the event someone clicks on a password reset link # for one account while logged into another account, # logout of the currently logged in account. if ( self.request.user.is_authenticated and self.request.user.pk != self.reset_user.pk ): self.logout() self.request.session[INTERNAL_RESET_SESSION_KEY] = self.key return super(PasswordResetFromKeyView, self).dispatch( request, uidb36, self.key, **kwargs ) else: token_form = UserTokenForm(data={"uidb36": uidb36, "key": self.key}) if token_form.is_valid(): # Store the key in the session and redirect to the # password reset form at a URL without the key. That # avoids the possibility of leaking the key in the # HTTP Referer header. self.request.session[INTERNAL_RESET_SESSION_KEY] = self.key redirect_url = self.request.path.replace( self.key, INTERNAL_RESET_URL_KEY ) return redirect(redirect_url) self.reset_user = None response = self.render_to_response(self.get_context_data(token_fail=True)) return _ajax_response(self.request, response, form=token_form) def get_context_data(self, **kwargs): ret = super(PasswordResetFromKeyView, self).get_context_data(**kwargs) ret["action_url"] = reverse( "account_reset_password_from_key", kwargs={ "uidb36": self.kwargs["uidb36"], "key": self.kwargs["key"], }, ) return ret def get_form_kwargs(self): kwargs = super(PasswordResetFromKeyView, self).get_form_kwargs() kwargs["user"] = self.reset_user kwargs["temp_key"] = self.key return kwargs def form_valid(self, form): form.save() adapter = get_adapter(self.request) if self.reset_user and app_settings.LOGIN_ATTEMPTS_LIMIT: # User successfully reset the password, clear any # possible cache entries for all email addresses. for email in self.reset_user.emailaddress_set.all(): adapter._delete_login_attempts_cached_email( self.request, email=email.email ) adapter.add_message( self.request, messages.SUCCESS, "account/messages/password_changed.txt", ) signals.password_reset.send( sender=self.reset_user.__class__, request=self.request, user=self.reset_user, ) if app_settings.LOGIN_ON_PASSWORD_RESET: return perform_login( self.request, self.reset_user, email_verification=app_settings.EMAIL_VERIFICATION, ) return super(PasswordResetFromKeyView, self).form_valid(form) password_reset_from_key = PasswordResetFromKeyView.as_view() class PasswordResetFromKeyDoneView(TemplateView): template_name = ( "account/password_reset_from_key_done." + app_settings.TEMPLATE_EXTENSION ) password_reset_from_key_done = PasswordResetFromKeyDoneView.as_view() class LogoutView(TemplateResponseMixin, LogoutFunctionalityMixin, View): template_name = "account/logout." + app_settings.TEMPLATE_EXTENSION redirect_field_name = "next" def get(self, *args, **kwargs): if app_settings.LOGOUT_ON_GET: return self.post(*args, **kwargs) if not self.request.user.is_authenticated: response = redirect(self.get_redirect_url()) return _ajax_response(self.request, response) ctx = self.get_context_data() response = self.render_to_response(ctx) return _ajax_response(self.request, response) def post(self, *args, **kwargs): url = self.get_redirect_url() if self.request.user.is_authenticated: self.logout() response = redirect(url) return _ajax_response(self.request, response) def get_context_data(self, **kwargs): ctx = kwargs redirect_field_value = get_request_param(self.request, self.redirect_field_name) ctx.update( { "redirect_field_name": self.redirect_field_name, "redirect_field_value": redirect_field_value, } ) return ctx def get_redirect_url(self): return get_next_redirect_url( self.request, self.redirect_field_name ) or get_adapter(self.request).get_logout_redirect_url(self.request) logout = LogoutView.as_view() class AccountInactiveView(TemplateView): template_name = "account/account_inactive." + app_settings.TEMPLATE_EXTENSION account_inactive = AccountInactiveView.as_view() class EmailVerificationSentView(TemplateView): template_name = "account/verification_sent." + app_settings.TEMPLATE_EXTENSION email_verification_sent = EmailVerificationSentView.as_view() django-allauth-0.47.0/allauth/app_settings.py000066400000000000000000000003611415442050100211740ustar00rootroot00000000000000from django.conf import settings SOCIALACCOUNT_ENABLED = "allauth.socialaccount" in settings.INSTALLED_APPS LOGIN_REDIRECT_URL = getattr(settings, "LOGIN_REDIRECT_URL", "/") USER_MODEL = getattr(settings, "AUTH_USER_MODEL", "auth.User") django-allauth-0.47.0/allauth/exceptions.py000066400000000000000000000003541415442050100206570ustar00rootroot00000000000000class ImmediateHttpResponse(Exception): """ This exception is used to interrupt the flow of processing to immediately return a custom HttpResponse. """ def __init__(self, response): self.response = response django-allauth-0.47.0/allauth/locale/000077500000000000000000000000001415442050100173615ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/ar/000077500000000000000000000000001415442050100177635ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/ar/LC_MESSAGES/000077500000000000000000000000001415442050100215505ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/ar/LC_MESSAGES/django.po000066400000000000000000000743531415442050100233660ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: 0.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-12-09 08:41-0600\n" "PO-Revision-Date: 2016-01-19 19:32+0100\n" "Last-Translator: David D Lowe \n" "Language-Team: Arabic\n" "Language: ar\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " "&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" "X-Generator: Poedit 1.8.6\n" #: account/adapter.py:45 msgid "Username can not be used. Please use other username." msgstr "اسم المستخدم غير مسموح به. الرجاء اختيار اسم اخر‪.‬" #: account/adapter.py:51 msgid "Too many failed login attempts. Try again later." msgstr "تجاوزت الحد المسموح لمحاولة تسجيل الدخول, حاول في وقت لاحق" #: account/adapter.py:53 msgid "A user is already registered with this e-mail address." msgstr "هنالك مستخدم مسجل سابقا مع نفس عنوان البريد الالكتروني‪.‬" #: account/adapter.py:300 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "كلمة المرور يجب أن لا تقل عن {0} حروف." #: account/apps.py:7 msgid "Accounts" msgstr "الحسابات" #: account/forms.py:59 account/forms.py:413 msgid "You must type the same password each time." msgstr "يجب عليك كتابة نفس كلمة المرور في كل مرة‪.‬" #: account/forms.py:92 account/forms.py:381 account/forms.py:498 msgid "Password" msgstr "كلمة السر" #: account/forms.py:93 msgid "Remember Me" msgstr "تذكرني" #: account/forms.py:97 msgid "This account is currently inactive." msgstr "هذا الحساب غير نشط حاليا." #: account/forms.py:99 msgid "The e-mail address and/or password you specified are not correct." msgstr "عنوان البريد الإلكتروني و / أو كلمة المرور الذي حددته غير صحيحة." #: account/forms.py:102 msgid "The username and/or password you specified are not correct." msgstr "اسم المستخدم و / أو كلمة المرور الذي حددته غير صحيحة." #: account/forms.py:113 account/forms.py:279 account/forms.py:439 #: account/forms.py:517 msgid "E-mail address" msgstr "عنوان البريد الالكتروني" #: account/forms.py:117 account/forms.py:316 account/forms.py:436 #: account/forms.py:512 msgid "E-mail" msgstr "البريد الالكتروني" #: account/forms.py:120 account/forms.py:123 account/forms.py:269 #: account/forms.py:272 msgid "Username" msgstr "اسم المستخدم" #: account/forms.py:133 msgid "Username or e-mail" msgstr "اسم المستخدم أو البريد الالكتروني" #: account/forms.py:136 msgctxt "field label" msgid "Login" msgstr "تسجيل الدخول" #: account/forms.py:307 msgid "E-mail (again)" msgstr "البريد الالكتروني ‪(مجددا)‬" #: account/forms.py:311 msgid "E-mail address confirmation" msgstr "تأكيد البريد الإلكتروني" #: account/forms.py:319 msgid "E-mail (optional)" msgstr "البريد الالكتروني ‪)‬اختياري‪(‬" #: account/forms.py:359 msgid "You must type the same email each time." msgstr "يجب عليك كتابة نفس البريد الالكتروني في كل مرة‪.‬" #: account/forms.py:384 account/forms.py:499 msgid "Password (again)" msgstr "كلمة السر ‪)‬مرة أخرى‪(‬" #: account/forms.py:448 msgid "This e-mail address is already associated with this account." msgstr "عنوان البريد الإلكتروني هذا بالفعل المقترنة مع هذا الحساب." #: account/forms.py:451 msgid "This e-mail address is already associated with another account." msgstr "عنوان البريد الإلكتروني هذا مقترن بالفعل بحساب آخر." #: account/forms.py:453 #, fuzzy, python-format #| msgid "Your account has no verified e-mail address." msgid "You cannot add more than %d e-mail addresses." msgstr "حسابك ليس لديه عنوان البريد الإلكتروني تحققنا منها." #: account/forms.py:478 msgid "Current Password" msgstr "كلمة المرور الحالية" #: account/forms.py:480 account/forms.py:570 msgid "New Password" msgstr "كلمة المرور الجديدة" #: account/forms.py:481 account/forms.py:571 msgid "New Password (again)" msgstr "كلمة المرور الجديدة (مرة أخرى)" #: account/forms.py:489 msgid "Please type your current password." msgstr "الرجاء كتابة كلمة المرور الحالية الخاصة بك." #: account/forms.py:529 msgid "The e-mail address is not assigned to any user account" msgstr "لم يتم تعيين عنوان البريد الإلكتروني لأي حساب مستخدم" #: account/forms.py:592 msgid "The password reset token was invalid." msgstr "خطأ في شهادة اعادة تعيين كلمة المرور." #: account/models.py:22 msgid "user" msgstr "مستخدم" #: account/models.py:28 account/models.py:83 msgid "e-mail address" msgstr "عنوان بريد إلكتروني" #: account/models.py:30 msgid "verified" msgstr "تمّ تحقيقه" #: account/models.py:31 msgid "primary" msgstr "أوّلي" #: account/models.py:36 msgid "email address" msgstr "عنوان بريد الكتروني" #: account/models.py:37 msgid "email addresses" msgstr "عناوين البريد الالكتروني" #: account/models.py:86 msgid "created" msgstr "تمّ إنشاؤه" #: account/models.py:87 msgid "sent" msgstr "تم ارساله" #: account/models.py:88 socialaccount/models.py:58 msgid "key" msgstr "مفتاح" #: account/models.py:93 msgid "email confirmation" msgstr "تأكيد البريد الإلكتروني" #: account/models.py:94 msgid "email confirmations" msgstr "تأكيدات البريد الإلكتروني" #: socialaccount/adapter.py:26 #, python-format msgid "" "An account already exists with this e-mail address. Please sign in to that " "account first, then connect your %s account." msgstr "" "حساب موجود بالفعل مع هذا عنوان البريد الإلكتروني. يرجى تسجيل الدخول إلى هذا " "الحساب أولا، ثم ربط حساب %s الخاص بك." #: socialaccount/adapter.py:131 msgid "Your account has no password set up." msgstr "حسابك ليس لديه كلمة مرور اقامة." #: socialaccount/adapter.py:138 msgid "Your account has no verified e-mail address." msgstr "حسابك ليس لديه عنوان البريد الإلكتروني تحققنا منها." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "حسابات التواصل الاجتماعية" #: socialaccount/models.py:41 socialaccount/models.py:84 msgid "provider" msgstr "مزود" #: socialaccount/models.py:45 msgid "name" msgstr "اسم" #: socialaccount/models.py:47 msgid "client id" msgstr "" #: socialaccount/models.py:49 msgid "App ID, or consumer key" msgstr "" #: socialaccount/models.py:52 msgid "secret key" msgstr "" #: socialaccount/models.py:55 msgid "API secret, client secret, or consumer secret" msgstr "" #: socialaccount/models.py:58 msgid "Key" msgstr "" #: socialaccount/models.py:74 msgid "social application" msgstr "تطبيق اجتماعي" #: socialaccount/models.py:75 msgid "social applications" msgstr "تطبيقات اجتماعية" #: socialaccount/models.py:105 msgid "uid" msgstr "" #: socialaccount/models.py:107 msgid "last login" msgstr "أخر دخول" #: socialaccount/models.py:108 msgid "date joined" msgstr "تاريخ الانضمام" #: socialaccount/models.py:109 msgid "extra data" msgstr "بيانات اضافية" #: socialaccount/models.py:113 msgid "social account" msgstr "حساب تواصل اجتماعي" #: socialaccount/models.py:114 msgid "social accounts" msgstr "حسابات تواصل اجتماعي" #: socialaccount/models.py:139 msgid "token" msgstr "" #: socialaccount/models.py:140 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "" #: socialaccount/models.py:144 msgid "token secret" msgstr "" #: socialaccount/models.py:145 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "" #: socialaccount/models.py:148 msgid "expires at" msgstr "ينتهي في" #: socialaccount/models.py:153 msgid "social application token" msgstr "" #: socialaccount/models.py:154 msgid "social application tokens" msgstr "" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "معلومات بروفايل غير صالحة" #: socialaccount/providers/oauth/client.py:85 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "" #: socialaccount/providers/oauth/client.py:117 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "" #: socialaccount/providers/oauth/client.py:138 #, python-format msgid "No request token saved for \"%s\"." msgstr "" #: socialaccount/providers/oauth/client.py:189 #, python-format msgid "No access token saved for \"%s\"." msgstr "" #: socialaccount/providers/oauth/client.py:210 #, python-format msgid "No access to private resources at \"%s\"." msgstr "" #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:8 msgid "Account Inactive" msgstr "حساب غير نشط" #: templates/account/account_inactive.html:10 msgid "This account is inactive." msgstr "هذا الحساب غير نشط" #: templates/account/email.html:5 templates/account/email.html:8 msgid "E-mail Addresses" msgstr "عناوين البريد الالكتروني" #: templates/account/email.html:10 msgid "The following e-mail addresses are associated with your account:" msgstr "ترتبط عناوين البريد الإلكتروني التالية مع حسابك:" #: templates/account/email.html:24 msgid "Verified" msgstr "تمّ التحقق منه" #: templates/account/email.html:26 msgid "Unverified" msgstr "لم يتم التحقق منه" #: templates/account/email.html:28 msgid "Primary" msgstr "أولي" #: templates/account/email.html:34 msgid "Make Primary" msgstr "اجعله اولي" #: templates/account/email.html:35 msgid "Re-send Verification" msgstr "اعادة ارسال رسالة التأكيد" #: templates/account/email.html:36 templates/socialaccount/connections.html:35 msgid "Remove" msgstr "احذف" #: templates/account/email.html:43 msgid "Warning:" msgstr "تحذير‪:‬" #: templates/account/email.html:43 msgid "" "You currently do not have any e-mail address set up. You should really add " "an e-mail address so you can receive notifications, reset your password, etc." msgstr "" "ليس لديك أي عنوان البريد الإلكتروني. يجب أن تضيف عنوان البريدالإلكتروني حتى " "تتمكن من تلقي الاشعارات, إعادة تعيين كلمة المرور الخاصة بك، الخ" #: templates/account/email.html:48 msgid "Add E-mail Address" msgstr "أضف عنوان البريد الالكتروني" #: templates/account/email.html:53 msgid "Add E-mail" msgstr "أضف عنوان البريد الالكتروني" #: templates/account/email.html:63 msgid "Do you really want to remove the selected e-mail address?" msgstr "هل تريد حقا ان تحذف عنوان البريد الالكتروني المحدد؟" #: templates/account/email/base_message.txt:1 #, fuzzy, python-format #| msgid "" #| "Thank you from %(site_name)s!\n" #| "%(site_domain)s" msgid "Hello from %(site_name)s!" msgstr "" "شكرا لك من فريق %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "شكرا لاستخدامك %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because user %(user_display)s has given " #| "yours as an e-mail address to connect their account.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s\n" msgid "" "You're receiving this e-mail because user %(user_display)s has given your e-" "mail address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "مرحبا من %(site_name)s!\n" "\n" "تتلقى هذه الرسالة بسبب أن المستخدم %(user_display)s قام باضافة بريدك " "الالكترني لحسابه في الموقع.\n" "\n" "لتأكيد صحة هذا الاجراء, اضغط على الرابط %(activate_url)s\n" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your E-mail Address" msgstr "قم بتأكيد عنوان البريد الالكتروني" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this e-mail because you or someone else has requested a " "password for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "مرحبا من %(site_name)s!\n" "\n" "أنت تتلقى هذه الرسالة بسبب طلبك أو طلب شخص أخرالحصول على كلمة المرور الخاصة " "بك.\n" "اذا لم تقم بطلب كلمة مرور يمكنك تجاهل هذه الريالة. اضغط على الرابط بالاسفل " "لاعادة تعيين كلمة المرور." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "في حال كنت قد نسيت اسم المستخدم الخاص بك هو %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 msgid "Password Reset E-mail" msgstr "البريد الإلكتروني لإعادة تعيين كلمة المرور" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm E-mail Address" msgstr "قم بتحقيق عنوان البريد الالكتروني" #: templates/account/email_confirm.html:16 #, python-format msgid "" "Please confirm that %(email)s is an e-mail " "address for user %(user_display)s." msgstr "" "يرجى التأكيد ان %(email)s من إحدى العنوان " "للمستعمل %(user_display)s." #: templates/account/email_confirm.html:20 msgid "Confirm" msgstr "التأكيد" #: templates/account/email_confirm.html:27 #, python-format msgid "" "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgstr "" "هذا الرابط لتأكيد البريد الإلكتروني إنتهت فترة صلاحيته أو إنه غير صالح. يرجى " " إصدار البريد الإلكتروني طلب تأكيد الجديدة ." #: templates/account/login.html:6 templates/account/login.html:10 #: templates/account/login.html:43 msgid "Sign In" msgstr "تسجيل الدخول" #: templates/account/login.html:15 #, python-format msgid "" "Please sign in with one\n" "of your existing third party accounts. Or, sign " "up\n" "for a %(site_name)s account and sign in below:" msgstr "" "يرجى تسجيل الدخول مع واحد من حسابات طرف ثالث الموجودة لديك‪.‬ كما يمكنك الاشتراك‪‬ للتحصل على حساب في الموقع %(site_name)s " "ثم تسجيل الدخول بالأسفل‪.‬" #: templates/account/login.html:25 msgid "or" msgstr "أو" #: templates/account/login.html:32 #, python-format msgid "" "If you have not created an account yet, then please\n" "sign up first." msgstr "" "إذا لم تكن قد أنشأت حسابا حتى الآن، فالرجاء الاشتراك أولا." #: templates/account/login.html:42 templates/account/password_change.html:14 msgid "Forgot Password?" msgstr "هل نسيت كلمة المرور؟" #: templates/account/logout.html:5 templates/account/logout.html:8 #: templates/account/logout.html:17 msgid "Sign Out" msgstr "تسجيل الخروج" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "هل تريد حقا ان تسجل خروجك؟" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary e-mail address (%(email)s)." msgstr "لا يمكنك إزالة عنوان البريد الإلكتروني الرئيسي الخاص بك (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation e-mail sent to %(email)s." msgstr "قد أرسلنا رسالة تأكيد إلى العنوان %(email)s." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "قد اكّدت عنوان البريد الالكتروني %(email)s." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed e-mail address %(email)s." msgstr "قد أزلنا عنوان البريد الالكتروني %(email)s." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "لقد سجلت الدخول بنجاح يا %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "تم تسجيل خروجك." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "تم تغيير كلمة المرور بنجاح‪.‬" #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "تم إعداد كلمة المرور بنجاح‪.‬" #: templates/account/messages/primary_email_set.txt:2 msgid "Primary e-mail address set." msgstr "تمّ تعيين عنوان البريد الالكتروني الرئيسي‪.‬" #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary e-mail address must be verified." msgstr "لا بد من التحقق من صحة البريد الإلكتروني‪.‬" #: templates/account/password_change.html:5 #: templates/account/password_change.html:8 #: templates/account/password_change.html:13 #: templates/account/password_reset_from_key.html:4 #: templates/account/password_reset_from_key.html:7 #: templates/account/password_reset_from_key_done.html:4 #: templates/account/password_reset_from_key_done.html:7 msgid "Change Password" msgstr "غيّر كلمة المرور" #: templates/account/password_reset.html:6 #: templates/account/password_reset.html:10 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:9 msgid "Password Reset" msgstr "إعادة تعيين كلمة المرور" #: templates/account/password_reset.html:15 msgid "" "Forgotten your password? Enter your e-mail address below, and we'll send you " "an e-mail allowing you to reset it." msgstr "" "هل نسيت كلمة المرور؟ أدخل عنوان البريد الإلكتروني أدناه، وسوف نرسل لك عن " "طريق البريد الإلكتروني مما يتيح لك إعادة تعيينها." #: templates/account/password_reset.html:20 msgid "Reset My Password" msgstr "إعادة تعيين كلمة المرور الخاصة بي" #: templates/account/password_reset.html:23 msgid "Please contact us if you have any trouble resetting your password." msgstr "" "يرجى الاتصال بنا إذا كان لديك أي مشكلة في إعادة تعيين كلمة المرور الخاصة بك." #: templates/account/password_reset_done.html:15 msgid "" "We have sent you an e-mail. Please contact us if you do not receive it " "within a few minutes." msgstr "" "لقد قمنا بإرسال رسالة اليك عبر البريد الإلكتروني. يرجى الاتصال بنا اذا كنت " "لا تتلقى في غضون بضع دقائق." #: templates/account/password_reset_from_key.html:7 msgid "Bad Token" msgstr "" #: templates/account/password_reset_from_key.html:11 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "كان رابط إعادة تعيين كلمة المرور غير صالحة، ربما لأنه قد تم استخدامه مسبقا. " "يرجى طلب كلمة المرور الجديدة." #: templates/account/password_reset_from_key.html:17 msgid "change password" msgstr "تغيير كلمة المرور" #: templates/account/password_reset_from_key.html:20 #: templates/account/password_reset_from_key_done.html:8 msgid "Your password is now changed." msgstr "تم تغيير كلمة المرور الخاصة بك" #: templates/account/password_set.html:5 templates/account/password_set.html:8 #: templates/account/password_set.html:13 msgid "Set Password" msgstr "تعيين كلمة مرور" #: templates/account/signup.html:5 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "الاشتراك" #: templates/account/signup.html:8 templates/account/signup.html:18 #: templates/socialaccount/signup.html:8 templates/socialaccount/signup.html:19 msgid "Sign Up" msgstr "الاشتراك" #: templates/account/signup.html:10 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "لديك حساب؟ من فضلك قم بتسجيل الدخول." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:8 msgid "Sign Up Closed" msgstr "الاشتراك مغلق" #: templates/account/signup_closed.html:10 msgid "We are sorry, but the sign up is currently closed." msgstr "نحن آسفون‪:‬ الاشتراك مغلق حاليا‪.‬" #: templates/account/snippets/already_logged_in.html:5 msgid "Note" msgstr "ملاحظة" #: templates/account/snippets/already_logged_in.html:5 #, python-format msgid "you are already logged in as %(user_display)s." msgstr "تم تسجيل دخولك بالفعل يا %(user_display)s." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:8 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:8 msgid "Verify Your E-mail Address" msgstr "التحقق من عنوان البريد الإلكتروني الخاص بك" #: templates/account/verification_sent.html:10 msgid "" "We have sent an e-mail to you for verification. Follow the link provided to " "finalize the signup process. Please contact us if you do not receive it " "within a few minutes." msgstr "" "لقد أرسلنا رسالة بريد إلكتروني لك للتحقق. اتبع الارتباط المتوفر لإتمام عملية " "التسجيل. يرجى الاتصال بنا إذا كنت لا تحصل عليه في غضون دقائق قليلة." #: templates/account/verified_email_required.html:12 msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your e-mail address. " msgstr "" "هذا الجزء من الموقع يتطلب منك تثبيت هويتك. ولهذا الغرض، نطلب لك التحقق من " "ملكيتك لعنوان البريد الإلكتروني الخاص بك." #: templates/account/verified_email_required.html:16 msgid "" "We have sent an e-mail to you for\n" "verification. Please click on the link inside this e-mail. Please\n" "contact us if you do not receive it within a few minutes." msgstr "" "لقد أرسلنا رسالة بريد إلكتروني لك للتحقق. الرجاء النقر فوق الارتباط داخل هذا " "البريد الإلكتروني. يرجى الاتصال بنا إذا كنت لا تحصل عليه في غضون دقائق قليلة." #: templates/account/verified_email_required.html:20 #, python-format msgid "" "Note: you can still change your e-" "mail address." msgstr "" "ملاحظة: مازال يمكنك تغيير عنوان " "البريد الإلكتروني الخاص بك." #: templates/openid/login.html:9 msgid "OpenID Sign In" msgstr "تسجيل الدخول عبر OpenID" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:8 msgid "Social Network Login Failure" msgstr "فشل تسجيل الدخول الاجتماعي" #: templates/socialaccount/authentication_error.html:10 msgid "" "An error occurred while attempting to login via your social network account." msgstr "" "حدث خطأ أثناء محاولة تسجيل الدخول عن طريق حساب الشبكة الاجتماعية الخاصة بك." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:8 msgid "Account Connections" msgstr "اتصالات الحساب" #: templates/socialaccount/connections.html:11 msgid "" "You can sign in to your account using any of the following third party " "accounts:" msgstr "" "يمكنك تسجيل الدخول إلى الحساب الخاص بك باستخدام أي من حسابات الطرف الثالث " "التالية:" #: templates/socialaccount/connections.html:43 msgid "" "You currently have no social network accounts connected to this account." msgstr "ليس لديك حاليا اي شبكة اجتماعية متصلة بهذا الحساب." #: templates/socialaccount/connections.html:46 msgid "Add a 3rd Party Account" msgstr "إضافة حساب طرف الثالث" #: templates/socialaccount/login.html:6 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:8 #, python-format msgid "You are about to connect a new third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:10 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:12 #, python-format msgid "You are about to sign in using a third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "تم الغاء تسجيل الدخول" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "قد قررت إلغاء تسجيل الدخول إلى الموقع باستخدام أحد الحسابات الموجودة الخاصة " "بك. إذا كان هذا خطأ، الرجاء المتابعة تسجيل الدخول." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "قد تم ربط حساب التواصل الاجتماعي." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "حساب التواصل الاجتماعي متصل مسبقاً إلى حساب مختلف." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "تم قطع الاتصال بحساب التواصل الاجتماعي." #: templates/socialaccount/signup.html:10 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "أنت على وشك استخدام حسابك من %(provider_name)s لتسجيل الدخول إلى " "%(site_name)s. وكخطوة أخيرة، يرجى ملء النموذج التالي:" #~ msgid "Account" #~ msgstr "حساب" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "تسجيل الدخول و / أو كلمة المرور الذي حددته غير صحيحة." #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "يمكن أن تحتوي أسماء المستخدمين إلا على الحروف، الأرقام و @/‪.‬/-/+/_." #~ msgid "This username is already taken. Please choose another." #~ msgstr "اسم المستخدم مسجل مسبقا. الرجاء اختيار اسم اخر‪.‬" #, fuzzy #~ msgid "Shopify Sign In" #~ msgstr "تسجيل الدخول Shopify" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "لقد اكّدت ان %(email)s هو من إحدى عناوين " #~ "للمستعمل %(user_display)s." #~ msgid "Thanks for using our site!" #~ msgstr "شكرا لاستخدام موقعنا!" #~ msgid "Confirmation e-mail sent to %(email)s" #~ msgstr "ارسلت رسالة التأكيد الى بريدك الالكتروني %(email)s" #~ msgid "Delete Password" #~ msgstr "احذف كلمة المرور" #~ msgid "" #~ "You may delete your password since you are currently logged in using " #~ "OpenID." #~ msgstr "بامكانك حذف كلمة المرور بما انك قمت بتسجيل الدخول بواسطة OpenID" #~ msgid "delete my password" #~ msgstr "احذف كلمة المرور الخاصة بي" #~ msgid "Password Deleted" #~ msgstr "تم حذف كلمة المرور" #~ msgid "Your password has been deleted." #~ msgstr "تم حذف كلمة المرور الخاصة بك." django-allauth-0.47.0/allauth/locale/cs/000077500000000000000000000000001415442050100177665ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/cs/LC_MESSAGES/000077500000000000000000000000001415442050100215535ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/cs/LC_MESSAGES/django.po000066400000000000000000000656621415442050100233740ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Tomas Marcik , 2013. # Beda Kosata , 2018. # msgid "" msgstr "" "Project-Id-Version: 0.35\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-12-09 08:41-0600\n" "PO-Revision-Date: 2018-04-17 16:52+0200\n" "Last-Translator: Beda Kosata \n" "Language-Team: Czech <>\n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n " "<= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" "X-Generator: Gtranslator 2.91.7\n" #: account/adapter.py:45 msgid "Username can not be used. Please use other username." msgstr "Toto uživatelské jméno nemůže být zvoleno. Prosím, zvolte si jiné." #: account/adapter.py:51 msgid "Too many failed login attempts. Try again later." msgstr "Příliš mnoho pokusů o přihlášení. Zkuste to prosím později." #: account/adapter.py:53 msgid "A user is already registered with this e-mail address." msgstr "Uživatel s tímto e-mailem je již registrován." #: account/adapter.py:300 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Heslo musí obsahovat minimálně {0} znaků." #: account/apps.py:7 msgid "Accounts" msgstr "Účty" #: account/forms.py:59 account/forms.py:413 msgid "You must type the same password each time." msgstr "Hesla se musí shodovat." #: account/forms.py:92 account/forms.py:381 account/forms.py:498 msgid "Password" msgstr "Heslo" #: account/forms.py:93 msgid "Remember Me" msgstr "Zapamatovat" #: account/forms.py:97 msgid "This account is currently inactive." msgstr "Účet je v tuto chvíli neaktivní." #: account/forms.py:99 msgid "The e-mail address and/or password you specified are not correct." msgstr "Zadaný e-mail nebo heslo není správné." #: account/forms.py:102 msgid "The username and/or password you specified are not correct." msgstr "Zadané uživatelské jméno nebo heslo není správné." #: account/forms.py:113 account/forms.py:279 account/forms.py:439 #: account/forms.py:517 msgid "E-mail address" msgstr "E-mailová adresa" #: account/forms.py:117 account/forms.py:316 account/forms.py:436 #: account/forms.py:512 msgid "E-mail" msgstr "E-mail" #: account/forms.py:120 account/forms.py:123 account/forms.py:269 #: account/forms.py:272 msgid "Username" msgstr "Uživatelské jméno" #: account/forms.py:133 msgid "Username or e-mail" msgstr "Uživatelské jméno nebo e-mail" #: account/forms.py:136 msgctxt "field label" msgid "Login" msgstr "Login" #: account/forms.py:307 msgid "E-mail (again)" msgstr "E-mail (znovu)" #: account/forms.py:311 msgid "E-mail address confirmation" msgstr "Potrvzení e-mailové adresy" #: account/forms.py:319 msgid "E-mail (optional)" msgstr "E-mail (nepovinné)" #: account/forms.py:359 msgid "You must type the same email each time." msgstr "Vložené emaily se musí shodovat." #: account/forms.py:384 account/forms.py:499 msgid "Password (again)" msgstr "Heslo (znovu)" #: account/forms.py:448 msgid "This e-mail address is already associated with this account." msgstr "Tento e-mail je již k tomuto účtu přiřazen." #: account/forms.py:451 msgid "This e-mail address is already associated with another account." msgstr "Tento e-mail je již přiřazen k jinému účtu." #: account/forms.py:453 #, fuzzy, python-format #| msgid "Your account has no verified e-mail address." msgid "You cannot add more than %d e-mail addresses." msgstr "Váš účet nemá žádný ověřený e-mail." #: account/forms.py:478 msgid "Current Password" msgstr "Současné heslo" #: account/forms.py:480 account/forms.py:570 msgid "New Password" msgstr "Nové heslo" #: account/forms.py:481 account/forms.py:571 msgid "New Password (again)" msgstr "Nové heslo (znovu)" #: account/forms.py:489 msgid "Please type your current password." msgstr "Prosím, zadejte svoje současné heslo." #: account/forms.py:529 msgid "The e-mail address is not assigned to any user account" msgstr "E-mail není přiřazen k žádnému účtu" #: account/forms.py:592 msgid "The password reset token was invalid." msgstr "Token pro reset hesla není platný." #: account/models.py:22 msgid "user" msgstr "uživatel" #: account/models.py:28 account/models.py:83 msgid "e-mail address" msgstr "e-mailová adresa" #: account/models.py:30 msgid "verified" msgstr "ověřeno" #: account/models.py:31 msgid "primary" msgstr "primární" #: account/models.py:36 msgid "email address" msgstr "e-mailová adresa" #: account/models.py:37 msgid "email addresses" msgstr "e-mailové adresy" #: account/models.py:86 msgid "created" msgstr "vytvořil" #: account/models.py:87 msgid "sent" msgstr "odeslaný" #: account/models.py:88 socialaccount/models.py:58 msgid "key" msgstr "klíč" #: account/models.py:93 msgid "email confirmation" msgstr "Potvrzovací e-mail" #: account/models.py:94 msgid "email confirmations" msgstr "Ověřovací e-maily" #: socialaccount/adapter.py:26 #, python-format msgid "" "An account already exists with this e-mail address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Účet s touto e-mailovou adresou již existuje. Prosím přihlaste se nejdříve " "pod tímto účtem a potom připojte svůj %s účet." #: socialaccount/adapter.py:131 msgid "Your account has no password set up." msgstr "Váš účet nemá nastavené heslo." #: socialaccount/adapter.py:138 msgid "Your account has no verified e-mail address." msgstr "Váš účet nemá žádný ověřený e-mail." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Účty sociálních sítí" #: socialaccount/models.py:41 socialaccount/models.py:84 msgid "provider" msgstr "poskytovatel" #: socialaccount/models.py:45 msgid "name" msgstr "jméno" #: socialaccount/models.py:47 msgid "client id" msgstr "id klienta" #: socialaccount/models.py:49 msgid "App ID, or consumer key" msgstr "App ID nebo uživatelský klíč" #: socialaccount/models.py:52 msgid "secret key" msgstr "tajný klíč" #: socialaccount/models.py:55 msgid "API secret, client secret, or consumer secret" msgstr "tajný API klíč, tajný klientský klíč nebo uživatelský tajný klíč" #: socialaccount/models.py:58 msgid "Key" msgstr "Klíč" #: socialaccount/models.py:74 msgid "social application" msgstr "sociální aplikace" #: socialaccount/models.py:75 msgid "social applications" msgstr "sociální aplikace" #: socialaccount/models.py:105 msgid "uid" msgstr "uid" #: socialaccount/models.py:107 msgid "last login" msgstr "poslední přihlášení" #: socialaccount/models.py:108 msgid "date joined" msgstr "datum registrace" #: socialaccount/models.py:109 msgid "extra data" msgstr "extra data" #: socialaccount/models.py:113 msgid "social account" msgstr "účet sociální sítě" #: socialaccount/models.py:114 msgid "social accounts" msgstr "účty sociálních sítí" #: socialaccount/models.py:139 msgid "token" msgstr "token" #: socialaccount/models.py:140 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "\"oauth_token\" (OAuth1) nebo přístupový token (OAuth2)" #: socialaccount/models.py:144 msgid "token secret" msgstr "tajný token" #: socialaccount/models.py:145 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "\"oauth_token_secret\" (OAuth1) nebo token pro obnovu (OAuth2)" #: socialaccount/models.py:148 msgid "expires at" msgstr "vyprší" #: socialaccount/models.py:153 msgid "social application token" msgstr "token sociální aplikace" #: socialaccount/models.py:154 msgid "social application tokens" msgstr "tokeny sociálních aplikací" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "Neplatná data profilu" #: socialaccount/providers/oauth/client.py:85 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Chyba při odesílání požadavku: \"%s\"." #: socialaccount/providers/oauth/client.py:117 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Chyba připojení: \"%s\"." #: socialaccount/providers/oauth/client.py:138 #, python-format msgid "No request token saved for \"%s\"." msgstr "Není uložen žádný požadavek pro: \"%s\"." #: socialaccount/providers/oauth/client.py:189 #, python-format msgid "No access token saved for \"%s\"." msgstr "Není uloženo žádné připojení pro: \"%s\"." #: socialaccount/providers/oauth/client.py:210 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Není přístup k privátním zdrojům: \"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:8 msgid "Account Inactive" msgstr "Neaktivní účet" #: templates/account/account_inactive.html:10 msgid "This account is inactive." msgstr "Tento účet není aktivní." #: templates/account/email.html:5 templates/account/email.html:8 msgid "E-mail Addresses" msgstr "E-mailové adresy" #: templates/account/email.html:10 msgid "The following e-mail addresses are associated with your account:" msgstr "K vašemu účtu jsou přiřazeny tyto e-mailové adresy:" #: templates/account/email.html:24 msgid "Verified" msgstr "Ověřeno" #: templates/account/email.html:26 msgid "Unverified" msgstr "Neověřeno" #: templates/account/email.html:28 msgid "Primary" msgstr "Primární" #: templates/account/email.html:34 msgid "Make Primary" msgstr "Zvolit jako primární" #: templates/account/email.html:35 msgid "Re-send Verification" msgstr "Znovu zaslat oveřovací e-mail" #: templates/account/email.html:36 templates/socialaccount/connections.html:35 msgid "Remove" msgstr "Odstranit" #: templates/account/email.html:43 msgid "Warning:" msgstr "Varování:" #: templates/account/email.html:43 msgid "" "You currently do not have any e-mail address set up. You should really add " "an e-mail address so you can receive notifications, reset your password, etc." msgstr "" "V současné chvíli nemáte nastaveny žádné e-mailové adresy. Prosím, uložte si " "k účtu alespoň jeden e-mail, abyste moli dostávat upozornění nebo mohli " "použít funkci zapomenutého hesla apod." #: templates/account/email.html:48 msgid "Add E-mail Address" msgstr "Přidat e-mailovou adresu" #: templates/account/email.html:53 msgid "Add E-mail" msgstr "Přidat e-mail" #: templates/account/email.html:63 msgid "Do you really want to remove the selected e-mail address?" msgstr "Opravdu chcete odstranit zvolené e-mailové adresy?" #: templates/account/email/base_message.txt:1 #, fuzzy, python-format #| msgid "" #| "Thank you from %(site_name)s!\n" #| "%(site_domain)s" msgid "Hello from %(site_name)s!" msgstr "" "Díky z %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "Děkujeme, že používáte %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because user %(user_display)s has given " #| "yours as an e-mail address to connect their account.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s\n" msgid "" "You're receiving this e-mail because user %(user_display)s has given your e-" "mail address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "Zdravíme z %(site_name)s!\n" "\n" "Tento e-mail jste obdrželi protože uživatel %(user_display)s zadal vaši " "adresu jako e-mailovou adresu pro připojení svého účtu.\n" "\n" "Pro potvrzení, že je to v pořádku, pokračujte na %(activate_url)s\n" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your E-mail Address" msgstr "Potvrďte prosím svou e-mailovou adresu" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this e-mail because you or someone else has requested a " "password for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Zdravíme z %(site_name)s!\n" "\n" "Tento e-mail jste obdrželi protože jste vy nebo někdo jiný zažádal o změnu " "hesla uživatelského účtu.\n" "Pokud jste to nebyli vy, můžete tento e-mail ignorovat. Pokud ano, klikněte " "na odkaz níže pro změnu vašeho hesla." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "" "Pro případ, že byste zapomněli, vaše uživatelské jméno je %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 msgid "Password Reset E-mail" msgstr "E-mail pro reset hesla" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm E-mail Address" msgstr "Potvrzení e-mailové adresy" #: templates/account/email_confirm.html:16 #, python-format msgid "" "Please confirm that %(email)s is an e-mail " "address for user %(user_display)s." msgstr "" "Prosím, potvrďte, že %(email)s je e-mailová " "adresa uživatele %(user_display)s." #: templates/account/email_confirm.html:20 msgid "Confirm" msgstr "Potvrdit" #: templates/account/email_confirm.html:27 #, python-format msgid "" "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgstr "" "Tento ověřovací odkaz již vypršel nebo není správný. Prosím, zažádejte si o nový." #: templates/account/login.html:6 templates/account/login.html:10 #: templates/account/login.html:43 msgid "Sign In" msgstr "Přihlásit se" #: templates/account/login.html:15 #, python-format msgid "" "Please sign in with one\n" "of your existing third party accounts. Or, sign " "up\n" "for a %(site_name)s account and sign in below:" msgstr "" "Přihlašte se prosím výběrem jednoho\n" "z vašich účtů třetích stran. Nebo se zaregistruje na stránky %(site_name)s a přihlašte se níže:" #: templates/account/login.html:25 msgid "or" msgstr "nebo" #: templates/account/login.html:32 #, python-format msgid "" "If you have not created an account yet, then please\n" "sign up first." msgstr "" "Pokud jste si ještě nevytvořili účet, nejprve se zaregistrujte." #: templates/account/login.html:42 templates/account/password_change.html:14 msgid "Forgot Password?" msgstr "Zapomenuté heslo?" #: templates/account/logout.html:5 templates/account/logout.html:8 #: templates/account/logout.html:17 msgid "Sign Out" msgstr "Odhlásit se" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Jste si jisti, že se chcete odhlásit?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary e-mail address (%(email)s)." msgstr "Nemůžete odstranit primární e-mailovou adresu (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation e-mail sent to %(email)s." msgstr "Ověření e-mailu posláno na %(email)s." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "Ověřili jste %(email)s." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed e-mail address %(email)s." msgstr "E-mailová adresa %(email)s byla odebrána." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Úspěšně přihlášen jako %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Právě jste byl odhlášen." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Heslo bylo úspěšně změněno." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Heslo bylo úspěšně nastaveno." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary e-mail address set." msgstr "Primární e-mail byla nastavena." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary e-mail address must be verified." msgstr "Vaše primární e-mailová adresa musí být ověřena." #: templates/account/password_change.html:5 #: templates/account/password_change.html:8 #: templates/account/password_change.html:13 #: templates/account/password_reset_from_key.html:4 #: templates/account/password_reset_from_key.html:7 #: templates/account/password_reset_from_key_done.html:4 #: templates/account/password_reset_from_key_done.html:7 msgid "Change Password" msgstr "Změnit heslo" #: templates/account/password_reset.html:6 #: templates/account/password_reset.html:10 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:9 msgid "Password Reset" msgstr "Vyžádání nového hesla" #: templates/account/password_reset.html:15 msgid "" "Forgotten your password? Enter your e-mail address below, and we'll send you " "an e-mail allowing you to reset it." msgstr "" "Zapomněli jste heslo? Zadejte prosím svoji e-mailovou adresu a do e-mailové " "schránky Vám přijde návod na jeho obnovu." #: templates/account/password_reset.html:20 msgid "Reset My Password" msgstr "Vyžádat nové heslo" #: templates/account/password_reset.html:23 msgid "Please contact us if you have any trouble resetting your password." msgstr "" "Prosím, kontaktujte nás, pokud máte jakékoliv potíže s resetováním hesla." #: templates/account/password_reset_done.html:15 msgid "" "We have sent you an e-mail. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Zaslali jsme vám e-mail. Prosím, kontaktujte nás, pokud ho nedostanete do " "několika minut." #: templates/account/password_reset_from_key.html:7 msgid "Bad Token" msgstr "Chyba serveru" #: templates/account/password_reset_from_key.html:11 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Odkaz pro změnu hesla není platný, protože již byl použit. Prosím, zažádejte si o nové." #: templates/account/password_reset_from_key.html:17 msgid "change password" msgstr "změnit heslo" #: templates/account/password_reset_from_key.html:20 #: templates/account/password_reset_from_key_done.html:8 msgid "Your password is now changed." msgstr "Vaše heslo bylo změněno." #: templates/account/password_set.html:5 templates/account/password_set.html:8 #: templates/account/password_set.html:13 msgid "Set Password" msgstr "Nastavit helso" #: templates/account/signup.html:5 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Zaregistrovat se" #: templates/account/signup.html:8 templates/account/signup.html:18 #: templates/socialaccount/signup.html:8 templates/socialaccount/signup.html:19 msgid "Sign Up" msgstr "Zaregistrovat se" #: templates/account/signup.html:10 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "Máte již účet? Přihlašte se, prosím." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:8 msgid "Sign Up Closed" msgstr "Registrace je uzavřena" #: templates/account/signup_closed.html:10 msgid "We are sorry, but the sign up is currently closed." msgstr "Omlouváme se, ale registrace je momentálně uzavřena." #: templates/account/snippets/already_logged_in.html:5 msgid "Note" msgstr "Poznámka" #: templates/account/snippets/already_logged_in.html:5 #, python-format msgid "you are already logged in as %(user_display)s." msgstr "momentálně jste přihlášen jako %(user_display)s." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:8 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:8 msgid "Verify Your E-mail Address" msgstr "Ověřte svoji e-mailovou adresu." #: templates/account/verification_sent.html:10 msgid "" "We have sent an e-mail to you for verification. Follow the link provided to " "finalize the signup process. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Byl vám zaslán ověřovací e-mail. Následujte odkaz v e-mailu pro dokončení " "registračního procesu. Neváhejte nás kontaktovat v případě, pokud e-mail do " "několika minut neobdržíte." #: templates/account/verified_email_required.html:12 msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your e-mail address. " msgstr "" "Tato část stránek vyžaduje ověření,\n" "že jste ten, kdo tvrdíte. K těmto účelům požadujeme\n" "ověření vlastnictví vaší e-mailové adresy." #: templates/account/verified_email_required.html:16 msgid "" "We have sent an e-mail to you for\n" "verification. Please click on the link inside this e-mail. Please\n" "contact us if you do not receive it within a few minutes." msgstr "" "Zaslali jsme na vaši e-mailovou adresu\n" "ověřovací e-mail. Prosím, klikněte na odkaz uvnitř e-mailu.\n" "Neváhejte nás kontaktovat v případě, pokud e-mail nedostanete do několika " "minut." #: templates/account/verified_email_required.html:20 #, python-format msgid "" "Note: you can still change your e-" "mail address." msgstr "" "Poznámka: stále můžete změnit " "vaši e-mailovou adresu.." #: templates/openid/login.html:9 msgid "OpenID Sign In" msgstr "Přihlášeníí OpenID" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:8 msgid "Social Network Login Failure" msgstr "Přihlášení pomocí sociální sítě selhalo." #: templates/socialaccount/authentication_error.html:10 msgid "" "An error occurred while attempting to login via your social network account." msgstr "Nastala chyba při přihlašování pomocí vašeho účtu sociální sítě." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:8 msgid "Account Connections" msgstr "Propojení účtu" #: templates/socialaccount/connections.html:11 msgid "" "You can sign in to your account using any of the following third party " "accounts:" msgstr "Můžete se přihlásit pomocí jakéhokoliv následujícího účtu:" #: templates/socialaccount/connections.html:43 msgid "" "You currently have no social network accounts connected to this account." msgstr "V současné chvíli nemáte připojeny žádné účty sociálních sítí." #: templates/socialaccount/connections.html:46 msgid "Add a 3rd Party Account" msgstr "Přidejte další účet" #: templates/socialaccount/login.html:6 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:8 #, python-format msgid "You are about to connect a new third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:10 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:12 #, python-format msgid "You are about to sign in using a third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Přihlášení zrušeno" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Rozhodli jste se zrušit přihlašování jednoho z vašich účtů. Pokud je to " "omylem, následujte přihlášení." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "Účet sociální sítě byl připojen." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "Účet sociální sítě je již spojen s jiným účtem." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Účet sociální sítě byl odpojen." #: templates/socialaccount/signup.html:10 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Chystáte se použít vaš %(provider_name)s účtu k přihlášení na naše stránky \n" "%(site_name)s. Jako poslední krok, prosím, vyplňte následující formulář:" #~ msgid "Account" #~ msgstr "Účet" #~| msgid "The password reset token was invalid." #~ msgid "The provided password is not valid." #~ msgstr "Použité heslo není platné." #~ msgid "The login and/or password you specified are not correct." #~ msgstr "Zadané přihlašovací údaje nejsou správné." #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "" #~ "Uživatelské jméno může obsahovat pouze písmena, číslice a znaky @/./+/-/_." #~ msgid "This username is already taken. Please choose another." #~ msgstr "Toto uživatelské jméno je již zvoleno. Prosím, vyberte si jiné." #, fuzzy #~| msgid "Sign In" #~ msgid "Shopify Sign In" #~ msgstr "Přihlásit se" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "Potvrdili jste e-mailovou adresu %(email)s uživateli %(user_display)s." #~ msgid "Thanks for using our site!" #~ msgstr "Děkujeme za využívání našich stránek!" #~ msgid "Confirmation e-mail sent to %(email)s" #~ msgstr "Ověřovací e-mail byl zaslán: %(email)s" #~ msgid "Delete Password" #~ msgstr "Smazat heslo" #~ msgid "" #~ "You may delete your password since you are currently logged in using " #~ "OpenID." #~ msgstr "Můžete si smazat heslo, protože používáte jiné způsoby přihlášení." #~ msgid "delete my password" #~ msgstr "Odstanit moje heslo" #~ msgid "Password Deleted" #~ msgstr "Heslo bylo odstraněno" #~ msgid "Your password has been deleted." #~ msgstr "Vaše heslo bylo smazáno." django-allauth-0.47.0/allauth/locale/da/000077500000000000000000000000001415442050100177455ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/da/LC_MESSAGES/000077500000000000000000000000001415442050100215325ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/da/LC_MESSAGES/django.po000066400000000000000000000615511415442050100233440ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-12-09 08:41-0600\n" "PO-Revision-Date: 2018-09-03 16:04+0200\n" "Last-Translator: b'Tuk Bredsdorff '\n" "Language-Team: \n" "Language: da\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.1.1\n" #: account/adapter.py:45 msgid "Username can not be used. Please use other username." msgstr "Brugernavn kan ikke bruges. Brug venligst et andet brugernavn." #: account/adapter.py:51 msgid "Too many failed login attempts. Try again later." msgstr "Der er for mange mislykkede logonforsøg. Prøv igen senere." #: account/adapter.py:53 #, fuzzy #| msgid "A user is already registered with this address." msgid "A user is already registered with this e-mail address." msgstr "En bruger er allerede registreret med denne emailadresse." #: account/adapter.py:300 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Adgangskoden skal være på mindst {0} tegn." #: account/apps.py:7 msgid "Accounts" msgstr "Konti" #: account/forms.py:59 account/forms.py:413 msgid "You must type the same password each time." msgstr "Du skal skrive den samme adgangskode hver gang." #: account/forms.py:92 account/forms.py:381 account/forms.py:498 msgid "Password" msgstr "Adgangskode" #: account/forms.py:93 msgid "Remember Me" msgstr "Husk mig" #: account/forms.py:97 msgid "This account is currently inactive." msgstr "Denne konto er i øjeblikket inaktiv." #: account/forms.py:99 msgid "The e-mail address and/or password you specified are not correct." msgstr "Den angivne emailadresse og/eller adgangskode er ikke korrekt." #: account/forms.py:102 msgid "The username and/or password you specified are not correct." msgstr "Det angivne brugernavn og/eller adgangskoden er ikke korrekt." #: account/forms.py:113 account/forms.py:279 account/forms.py:439 #: account/forms.py:517 msgid "E-mail address" msgstr "Emailadresse" #: account/forms.py:117 account/forms.py:316 account/forms.py:436 #: account/forms.py:512 msgid "E-mail" msgstr "Email" #: account/forms.py:120 account/forms.py:123 account/forms.py:269 #: account/forms.py:272 msgid "Username" msgstr "Brugernavn" #: account/forms.py:133 msgid "Username or e-mail" msgstr "Brugernavn eller email" #: account/forms.py:136 msgctxt "field label" msgid "Login" msgstr "Bruger" #: account/forms.py:307 msgid "E-mail (again)" msgstr "Email (igen)" #: account/forms.py:311 msgid "E-mail address confirmation" msgstr "Bekræftelse af emailadresse" #: account/forms.py:319 msgid "E-mail (optional)" msgstr "Email (valgfri)" #: account/forms.py:359 msgid "You must type the same email each time." msgstr "Du skal skrive den samme emailadresse hver gang." #: account/forms.py:384 account/forms.py:499 msgid "Password (again)" msgstr "Adgangskode (igen)" #: account/forms.py:448 msgid "This e-mail address is already associated with this account." msgstr "Denne emailadresse er allerede knyttet til denne konto." #: account/forms.py:451 msgid "This e-mail address is already associated with another account." msgstr "Denne emailadresse er allerede knyttet til en anden konto." #: account/forms.py:453 #, fuzzy, python-format #| msgid "Your account has no verified e-mail address." msgid "You cannot add more than %d e-mail addresses." msgstr "Din konto har ikke nogen bekræftet emailadresse." #: account/forms.py:478 msgid "Current Password" msgstr "Nuværende adgangskode" #: account/forms.py:480 account/forms.py:570 msgid "New Password" msgstr "Ny adgangskode" #: account/forms.py:481 account/forms.py:571 msgid "New Password (again)" msgstr "Ny adgangskode (igen)" #: account/forms.py:489 msgid "Please type your current password." msgstr "Indtast din nuværende adgangskode." #: account/forms.py:529 msgid "The e-mail address is not assigned to any user account" msgstr "Emailadressen er ikke tildelt til nogen brugerkonto" #: account/forms.py:592 msgid "The password reset token was invalid." msgstr "Token for nulstilling af adgangskode var ugyldig." #: account/models.py:22 msgid "user" msgstr "bruger" #: account/models.py:28 account/models.py:83 msgid "e-mail address" msgstr "emailadresse" #: account/models.py:30 msgid "verified" msgstr "bekræftet" #: account/models.py:31 msgid "primary" msgstr "primær" #: account/models.py:36 msgid "email address" msgstr "emailadresse" #: account/models.py:37 msgid "email addresses" msgstr "emailadresser" #: account/models.py:86 msgid "created" msgstr "oprettet" #: account/models.py:87 msgid "sent" msgstr "sendt" #: account/models.py:88 socialaccount/models.py:58 msgid "key" msgstr "nøgle" #: account/models.py:93 msgid "email confirmation" msgstr "emailbekræfelse" #: account/models.py:94 msgid "email confirmations" msgstr "emailbekræftelse" #: socialaccount/adapter.py:26 #, python-format msgid "" "An account already exists with this e-mail address. Please sign in to that " "account first, then connect your %s account." msgstr "" "En konto med denne emailadresse eksisterer allerede. Log venligst ind med " "den konto først og tilknyt din %s konto derefter." #: socialaccount/adapter.py:131 msgid "Your account has no password set up." msgstr "Der er ikke oprettet noget password til din konto." #: socialaccount/adapter.py:138 msgid "Your account has no verified e-mail address." msgstr "Din konto har ikke nogen bekræftet emailadresse." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Sociale konti" #: socialaccount/models.py:41 socialaccount/models.py:84 msgid "provider" msgstr "udbyder" #: socialaccount/models.py:45 msgid "name" msgstr "navn" #: socialaccount/models.py:47 msgid "client id" msgstr "klient id" #: socialaccount/models.py:49 msgid "App ID, or consumer key" msgstr "App ID, eller konsumer nøgle" #: socialaccount/models.py:52 msgid "secret key" msgstr "hemmelig nøgle" #: socialaccount/models.py:55 msgid "API secret, client secret, or consumer secret" msgstr "API hemmelighed, klient hemmelighed eller konsumet hemmelighed" #: socialaccount/models.py:58 msgid "Key" msgstr "Nøgle" #: socialaccount/models.py:74 msgid "social application" msgstr "social applikation" #: socialaccount/models.py:75 msgid "social applications" msgstr "sociale applikationer" #: socialaccount/models.py:105 msgid "uid" msgstr "uid" #: socialaccount/models.py:107 msgid "last login" msgstr "sidste log ind" #: socialaccount/models.py:108 msgid "date joined" msgstr "dato oprettet" #: socialaccount/models.py:109 msgid "extra data" msgstr "ekstra data" #: socialaccount/models.py:113 msgid "social account" msgstr "social konto" #: socialaccount/models.py:114 msgid "social accounts" msgstr "sociale konti" #: socialaccount/models.py:139 msgid "token" msgstr "token" #: socialaccount/models.py:140 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "“oauth_token” (OAuth1) eller adgangstoken (OAuth2)" #: socialaccount/models.py:144 msgid "token secret" msgstr "token hemmelighed" #: socialaccount/models.py:145 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "“oauth_token_secret” (OAuth1) eller fornyelsestoken (OAuth2)" #: socialaccount/models.py:148 msgid "expires at" msgstr "udløber den" #: socialaccount/models.py:153 msgid "social application token" msgstr "socialt applikationstoken" #: socialaccount/models.py:154 msgid "social application tokens" msgstr "sociale applikationstokener" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "Ugyldig profildata" #: socialaccount/providers/oauth/client.py:85 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Ugyldig respons under forsøg på at hente request token fra “%s”." #: socialaccount/providers/oauth/client.py:117 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Ugyldig respons under forsøg på at hente adgangstoken fra “%s”." #: socialaccount/providers/oauth/client.py:138 #, python-format msgid "No request token saved for \"%s\"." msgstr "Intet request token gemt for “%s”." #: socialaccount/providers/oauth/client.py:189 #, python-format msgid "No access token saved for \"%s\"." msgstr "Intet adgangstoken gemt for “%s”." #: socialaccount/providers/oauth/client.py:210 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Ingen adgang til private ressourcer på “%s”." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:8 msgid "Account Inactive" msgstr "Inaktiv konto" #: templates/account/account_inactive.html:10 msgid "This account is inactive." msgstr "Denne konto er inaktiv." #: templates/account/email.html:5 templates/account/email.html:8 msgid "E-mail Addresses" msgstr "Emailadresser" #: templates/account/email.html:10 msgid "The following e-mail addresses are associated with your account:" msgstr "De følgende emailadresser er tilknyttet din konto:" #: templates/account/email.html:24 msgid "Verified" msgstr "Bekæftet" #: templates/account/email.html:26 msgid "Unverified" msgstr "Ubekræftet" #: templates/account/email.html:28 msgid "Primary" msgstr "Primær" #: templates/account/email.html:34 msgid "Make Primary" msgstr "Gør primær" #: templates/account/email.html:35 msgid "Re-send Verification" msgstr "Send bekræftelse igen" #: templates/account/email.html:36 templates/socialaccount/connections.html:35 msgid "Remove" msgstr "Fjern" #: templates/account/email.html:43 msgid "Warning:" msgstr "Advarsel:" #: templates/account/email.html:43 msgid "" "You currently do not have any e-mail address set up. You should really add " "an e-mail address so you can receive notifications, reset your password, etc." msgstr "" "Du har på nuværende tidspunkt ikke nogen emailadresser tilknyttet. Du bør " "virkelig tilknytte en emailadresse, så du kan modtage notifikationer, " "resette dit password osv." #: templates/account/email.html:48 msgid "Add E-mail Address" msgstr "Tilføj emailadresse" #: templates/account/email.html:53 msgid "Add E-mail" msgstr "Tilføj email" #: templates/account/email.html:63 msgid "Do you really want to remove the selected e-mail address?" msgstr "Vil du virkelig fjerne den valgte emailadresse?" #: templates/account/email/base_message.txt:1 #, fuzzy, python-format #| msgid "" #| "Thank you from %(site_name)s!\n" #| "%(site_domain)s" msgid "Hello from %(site_name)s!" msgstr "" "Tak fra %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "Tak fordi du bruger %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because user %(user_display)s has given " #| "yours as an e-mail address to connect their account.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s\n" msgid "" "You're receiving this e-mail because user %(user_display)s has given your e-" "mail address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "Hej fra %(site_name)s!\n" "\n" "Du modtager denne email, fordi brugeren %(user_display)s ønsker at bruge den " "til sin konto.\n" "\n" "For at bekræfte dette, gå til %(activate_url)s\n" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your E-mail Address" msgstr "Bekræft venligst din emailadresse" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this e-mail because you or someone else has requested a " "password for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Hej fra %(site_name)s!\n" "\n" "Du har modtaget denne email fordi du eller en anden har bedt om et password " "til din konto.\n" "Den kan trygt ses bort fra, hvis du ikke har bedt om at få nulstillet dit " "password. Klik linket herunder for at nulstille dit password." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "I tilfælde af at du har glemt det er dit brugernavn %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 msgid "Password Reset E-mail" msgstr "Token for nulstilling af adgangskode var ugyldig" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm E-mail Address" msgstr "Bekræft venligst din emailadresse" #: templates/account/email_confirm.html:16 #, python-format msgid "" "Please confirm that %(email)s is an e-mail " "address for user %(user_display)s." msgstr "" "Bekræft venligst at %(email)s er en e-mail " "adresse for %(user_display)s." #: templates/account/email_confirm.html:20 msgid "Confirm" msgstr "Bekræft" #: templates/account/email_confirm.html:27 #, python-format msgid "" "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgstr "" "Dette link til bekræftelse af email er udløbet eller ugyldigt. Lav venligst " "et nyt." #: templates/account/login.html:6 templates/account/login.html:10 #: templates/account/login.html:43 msgid "Sign In" msgstr "Log ind" #: templates/account/login.html:15 #, python-format msgid "" "Please sign in with one\n" "of your existing third party accounts. Or, sign " "up\n" "for a %(site_name)s account and sign in below:" msgstr "" "Log venligst ind med en\n" "af dine eksisterende tredjeparts konti. Eller, opret\n" "en konto på %(site_name)s og log ind herunder:" #: templates/account/login.html:25 msgid "or" msgstr "eller" #: templates/account/login.html:32 #, python-format msgid "" "If you have not created an account yet, then please\n" "sign up first." msgstr "" "Hvis du ikke allerede har oprettet en konto, så\n" "opret dig først." #: templates/account/login.html:42 templates/account/password_change.html:14 msgid "Forgot Password?" msgstr "Glemt password?" #: templates/account/logout.html:5 templates/account/logout.html:8 #: templates/account/logout.html:17 msgid "Sign Out" msgstr "Log ud" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Er du sikker på, at du vil logge af?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary e-mail address (%(email)s)." msgstr "Du kan ikke fjerne din primære emailadresse (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation e-mail sent to %(email)s." msgstr "Bekræftelses-email sendt til %(email)s." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "Du har bekræftet %(email)s." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed e-mail address %(email)s." msgstr "Fjernede emailadressen %(email)s." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Loggede succesfuldt ind med %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Du har logget ud." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Password ændret med success." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Password indstillet med success." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary e-mail address set." msgstr "Primær emailadresse indstillet." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary e-mail address must be verified." msgstr "Din primære emailadresse skal bekræftes." #: templates/account/password_change.html:5 #: templates/account/password_change.html:8 #: templates/account/password_change.html:13 #: templates/account/password_reset_from_key.html:4 #: templates/account/password_reset_from_key.html:7 #: templates/account/password_reset_from_key_done.html:4 #: templates/account/password_reset_from_key_done.html:7 msgid "Change Password" msgstr "Ændr password" #: templates/account/password_reset.html:6 #: templates/account/password_reset.html:10 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:9 msgid "Password Reset" msgstr "Nulstil password" #: templates/account/password_reset.html:15 msgid "" "Forgotten your password? Enter your e-mail address below, and we'll send you " "an e-mail allowing you to reset it." msgstr "" "Glemt dit password? Skriv din emailadresse herunder, og vi vil sende dig en " "email, hvorfra du kan nulstille det." #: templates/account/password_reset.html:20 msgid "Reset My Password" msgstr "Nulstil mit password" #: templates/account/password_reset.html:23 msgid "Please contact us if you have any trouble resetting your password." msgstr "" "Kontakt os venligst, hvis du har problemer med at nulstille dit password." #: templates/account/password_reset_done.html:15 msgid "" "We have sent you an e-mail. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Vi har sendt dig en email. Kontakt os venligst, hvis du ikke modtager den i " "løbet af et par minutter." #: templates/account/password_reset_from_key.html:7 msgid "Bad Token" msgstr "Ugyldigt token" #: templates/account/password_reset_from_key.html:11 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Linket til nulstilling af password var ugyldigt, muligvis fordi det allerede " "er blevet brugt. Lav venligst et nyt." #: templates/account/password_reset_from_key.html:17 msgid "change password" msgstr "ændr password" #: templates/account/password_reset_from_key.html:20 #: templates/account/password_reset_from_key_done.html:8 msgid "Your password is now changed." msgstr "Dit password er nu ændret." #: templates/account/password_set.html:5 templates/account/password_set.html:8 #: templates/account/password_set.html:13 msgid "Set Password" msgstr "Indstil password" #: templates/account/signup.html:5 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Opret" #: templates/account/signup.html:8 templates/account/signup.html:18 #: templates/socialaccount/signup.html:8 templates/socialaccount/signup.html:19 msgid "Sign Up" msgstr "Opret konto" #: templates/account/signup.html:10 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "Har du allerede en konto? Så log ind." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:8 msgid "Sign Up Closed" msgstr "Lukket for nye konti" #: templates/account/signup_closed.html:10 msgid "We are sorry, but the sign up is currently closed." msgstr "Vi beklager, men der er for tiden lukket for oprettelse af nye konti." #: templates/account/snippets/already_logged_in.html:5 msgid "Note" msgstr "Note" #: templates/account/snippets/already_logged_in.html:5 #, python-format msgid "you are already logged in as %(user_display)s." msgstr "du er allerede logget ind som %(user_display)s." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:8 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:8 msgid "Verify Your E-mail Address" msgstr "Bekræft din emailadresse" #: templates/account/verification_sent.html:10 msgid "" "We have sent an e-mail to you for verification. Follow the link provided to " "finalize the signup process. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Vi har sendt en email til dig. Følg linket i den for at færdiggøre " "oprettelsesprocessen. Kontakt os venligst, hvis du ikke modtager den i løbet " "af et par minutter." #: templates/account/verified_email_required.html:12 msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your e-mail address. " msgstr "" "Denne del af siden kræver, at du bekræfter, at\n" "du er hvem du påstår du er. Derfor er du nødt til at\n" "bekræfte, at du ejer din emailadresse " #: templates/account/verified_email_required.html:16 msgid "" "We have sent an e-mail to you for\n" "verification. Please click on the link inside this e-mail. Please\n" "contact us if you do not receive it within a few minutes." msgstr "" "Vi har sendt en email til dig for bekræftelse.\n" "Klik på linket i den. Kontakt os venligst, hvis du ikke modtager\n" " den i løbet af et par minutter." #: templates/account/verified_email_required.html:20 #, python-format msgid "" "Note: you can still change your e-" "mail address." msgstr "" "Bemærk: du kan stadig ændre din " "emailadresse." #: templates/openid/login.html:9 msgid "OpenID Sign In" msgstr "OpenID Log ind" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:8 msgid "Social Network Login Failure" msgstr "Social Network log ind-fejl" #: templates/socialaccount/authentication_error.html:10 msgid "" "An error occurred while attempting to login via your social network account." msgstr "" "Der opstod en fejl under forsøget på at logge ind via din social konto." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:8 msgid "Account Connections" msgstr "Kontoforbindelser" #: templates/socialaccount/connections.html:11 msgid "" "You can sign in to your account using any of the following third party " "accounts:" msgstr "Du kan logge ind med følgende tredjepartskonti:" #: templates/socialaccount/connections.html:43 msgid "" "You currently have no social network accounts connected to this account." msgstr "Du har ikke nogle social netværks-konti tilknyttet denne konto." #: templates/socialaccount/connections.html:46 msgid "Add a 3rd Party Account" msgstr "Tilføj tredjeparts konto" #: templates/socialaccount/login.html:6 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:8 #, python-format msgid "You are about to connect a new third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:10 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:12 #, python-format msgid "You are about to sign in using a third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Log ind afbrudt" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Du valgte at afbryde log ind på vores side med en af dine eksisterende " "konti. Hvis det var en fejl, så fortsæt venligst til log ind." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "Den social konto er tilknyttet." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "Den sociale konto er allerede tilknyttet en anden konto." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Tilknytningen til den social konto er blevet afbrydt." #: templates/socialaccount/signup.html:10 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Du er ved at bruge din %(provider_name)s -konto til at logge ind i\n" "%(site_name)s. Som et sidste skridt, udfyld venligst denne formular:" #~ msgid "Account" #~ msgstr "Konto" django-allauth-0.47.0/allauth/locale/de/000077500000000000000000000000001415442050100177515ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/de/LC_MESSAGES/000077500000000000000000000000001415442050100215365ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/de/LC_MESSAGES/django.po000066400000000000000000000635651415442050100233570ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Jannis Vajen, 2013-2014 msgid "" msgstr "" "Project-Id-Version: django-allauth\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-12-09 08:41-0600\n" "PO-Revision-Date: 2020-10-15 19:48+0200\n" "Last-Translator: Jannis Vajen \n" "Language-Team: German (http://www.transifex.com/projects/p/django-allauth/" "language/de/)\n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.2.1\n" #: account/adapter.py:45 msgid "Username can not be used. Please use other username." msgstr "" "Anmeldename kann nicht verwendet werden. Bitte wähle einen anderen Namen." #: account/adapter.py:51 msgid "Too many failed login attempts. Try again later." msgstr "" "Zu viele gescheiterte Anmeldeversuche. Bitte versuche es später erneut." #: account/adapter.py:53 msgid "A user is already registered with this e-mail address." msgstr "Es ist bereits jemand mit dieser E-Mail-Adresse registriert." #: account/adapter.py:300 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Das Passwort muss aus mindestens {0} Zeichen bestehen." #: account/apps.py:7 msgid "Accounts" msgstr "Konten" #: account/forms.py:59 account/forms.py:413 msgid "You must type the same password each time." msgstr "Du musst zweimal das selbe Passwort eingeben." #: account/forms.py:92 account/forms.py:381 account/forms.py:498 msgid "Password" msgstr "Passwort" #: account/forms.py:93 msgid "Remember Me" msgstr "Angemeldet bleiben" #: account/forms.py:97 msgid "This account is currently inactive." msgstr "Dieses Konto ist derzeit inaktiv." #: account/forms.py:99 msgid "The e-mail address and/or password you specified are not correct." msgstr "Die E-Mail-Adresse und/oder das Passwort sind leider falsch." #: account/forms.py:102 msgid "The username and/or password you specified are not correct." msgstr "Der Anmeldename und/oder das Passwort sind leider falsch." #: account/forms.py:113 account/forms.py:279 account/forms.py:439 #: account/forms.py:517 msgid "E-mail address" msgstr "E-Mail-Adresse" #: account/forms.py:117 account/forms.py:316 account/forms.py:436 #: account/forms.py:512 msgid "E-mail" msgstr "E-Mail" #: account/forms.py:120 account/forms.py:123 account/forms.py:269 #: account/forms.py:272 msgid "Username" msgstr "Anmeldename" #: account/forms.py:133 msgid "Username or e-mail" msgstr "Anmeldename oder E-Mail" #: account/forms.py:136 msgctxt "field label" msgid "Login" msgstr "Anmeldung" #: account/forms.py:307 msgid "E-mail (again)" msgstr "E-Mail (wiederholen)" #: account/forms.py:311 msgid "E-mail address confirmation" msgstr "Bestätigung der E-Mail-Adresse" #: account/forms.py:319 msgid "E-mail (optional)" msgstr "E-Mail (optional)" #: account/forms.py:359 msgid "You must type the same email each time." msgstr "Du musst zweimal dieselbe E-Mail-Adresse eingeben." #: account/forms.py:384 account/forms.py:499 msgid "Password (again)" msgstr "Passwort (Wiederholung)" #: account/forms.py:448 msgid "This e-mail address is already associated with this account." msgstr "Diese E-Mail-Adresse wird bereits in diesem Konto verwendet." #: account/forms.py:451 msgid "This e-mail address is already associated with another account." msgstr "Diese E-Mail-Adresse wird bereits in einem anderen Konto verwendet." #: account/forms.py:453 #, fuzzy, python-format #| msgid "Your account has no verified e-mail address." msgid "You cannot add more than %d e-mail addresses." msgstr "Dein Konto hat keine bestätigte E-Mail-Adresse." #: account/forms.py:478 msgid "Current Password" msgstr "Aktuelles Passwort" #: account/forms.py:480 account/forms.py:570 msgid "New Password" msgstr "Neues Passwort" #: account/forms.py:481 account/forms.py:571 msgid "New Password (again)" msgstr "Neues Passwort (Wiederholung)" #: account/forms.py:489 msgid "Please type your current password." msgstr "Bitte gib dein aktuelles Passwort ein." #: account/forms.py:529 msgid "The e-mail address is not assigned to any user account" msgstr "Diese E-Mail-Adresse ist keinem Konto zugeordnet" #: account/forms.py:592 msgid "The password reset token was invalid." msgstr "Das Sicherheits-Token zum Zurücksetzen des Passwortes war ungültig." #: account/models.py:22 msgid "user" msgstr "Benutzer" #: account/models.py:28 account/models.py:83 msgid "e-mail address" msgstr "E-Mail-Adresse" #: account/models.py:30 msgid "verified" msgstr "bestätigt" #: account/models.py:31 msgid "primary" msgstr "Primär" #: account/models.py:36 msgid "email address" msgstr "E-Mail-Adresse" #: account/models.py:37 msgid "email addresses" msgstr "E-Mail-Adressen" #: account/models.py:86 msgid "created" msgstr "Erstellt" #: account/models.py:87 msgid "sent" msgstr "Gesendet" #: account/models.py:88 socialaccount/models.py:58 msgid "key" msgstr "Schlüssel" #: account/models.py:93 msgid "email confirmation" msgstr "E-Mail-Bestätigung" #: account/models.py:94 msgid "email confirmations" msgstr "E-Mail-Bestätigungen" #: socialaccount/adapter.py:26 #, python-format msgid "" "An account already exists with this e-mail address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Es existiert bereits ein Konto mit dieser E-Mail-Adresse. Bitte melde dich " "zuerst mit diesem Konto an, und verknüpfe es dann mit deinem %s-Konto." #: socialaccount/adapter.py:131 msgid "Your account has no password set up." msgstr "Für dein Konto wurde noch kein Passwort festgelegt." #: socialaccount/adapter.py:138 msgid "Your account has no verified e-mail address." msgstr "Dein Konto hat keine bestätigte E-Mail-Adresse." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Konto" #: socialaccount/models.py:41 socialaccount/models.py:84 msgid "provider" msgstr "Anbieter" #: socialaccount/models.py:45 msgid "name" msgstr "Anmeldename" #: socialaccount/models.py:47 msgid "client id" msgstr "Client-ID" #: socialaccount/models.py:49 msgid "App ID, or consumer key" msgstr "App-ID oder 'Consumer key'" #: socialaccount/models.py:52 msgid "secret key" msgstr "Geheimer Schlüssel" #: socialaccount/models.py:55 msgid "API secret, client secret, or consumer secret" msgstr "'API secret', 'client secret' oder 'consumer secret'" #: socialaccount/models.py:58 msgid "Key" msgstr "Schlüssel" #: socialaccount/models.py:74 msgid "social application" msgstr "Soziale Anwendung" #: socialaccount/models.py:75 msgid "social applications" msgstr "Soziale Anwendungen" #: socialaccount/models.py:105 msgid "uid" msgstr "UID" #: socialaccount/models.py:107 msgid "last login" msgstr "Letzte Anmeldung" #: socialaccount/models.py:108 msgid "date joined" msgstr "Registrierdatum" #: socialaccount/models.py:109 msgid "extra data" msgstr "Weitere Daten" #: socialaccount/models.py:113 msgid "social account" msgstr "Soziales Konto" #: socialaccount/models.py:114 msgid "social accounts" msgstr "Soziale Konten" #: socialaccount/models.py:139 msgid "token" msgstr "Token" #: socialaccount/models.py:140 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "\"oauth_token\" (OAuth1) oder \"access token\" (OAuth2)" #: socialaccount/models.py:144 msgid "token secret" msgstr "Geheimes Token" #: socialaccount/models.py:145 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "\"oauth_token_secret\" (OAuth1) oder \"refresh token\" (OAuth2)" #: socialaccount/models.py:148 msgid "expires at" msgstr "Läuft ab" #: socialaccount/models.py:153 msgid "social application token" msgstr "Token für soziale Anwendung" #: socialaccount/models.py:154 msgid "social application tokens" msgstr "Tokens für soziale Anwendungen" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "Ungültige Profildaten" #: socialaccount/providers/oauth/client.py:85 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Ungültige Antwort von \"%s\" als Anfrageschlüssel erbeten wurde." #: socialaccount/providers/oauth/client.py:117 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Ungültige Antwort von \"%s\" als Zugangsschlüssel erbeten wurde." #: socialaccount/providers/oauth/client.py:138 #, python-format msgid "No request token saved for \"%s\"." msgstr "Kein Request-Token gespeichert für \"%s\"." #: socialaccount/providers/oauth/client.py:189 #, python-format msgid "No access token saved for \"%s\"." msgstr "Kein Access-Token gespeichert für \"%s\"." #: socialaccount/providers/oauth/client.py:210 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Kein Zugriff zu privaten Daten auf \"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:8 msgid "Account Inactive" msgstr "Konto inaktiv" #: templates/account/account_inactive.html:10 msgid "This account is inactive." msgstr "Dieses Konto ist inaktiv." #: templates/account/email.html:5 templates/account/email.html:8 msgid "E-mail Addresses" msgstr "E-Mail-Adressen" #: templates/account/email.html:10 msgid "The following e-mail addresses are associated with your account:" msgstr "Folgende E-Mail-Adressen sind mit diesem Konto verknüpft:" #: templates/account/email.html:24 msgid "Verified" msgstr "Bestätigt" #: templates/account/email.html:26 msgid "Unverified" msgstr "Unbestätigt" #: templates/account/email.html:28 msgid "Primary" msgstr "Primär" #: templates/account/email.html:34 msgid "Make Primary" msgstr "Als primäre Adresse festlegen" #: templates/account/email.html:35 msgid "Re-send Verification" msgstr "Bestätigungs-Mail nochmal verschicken" #: templates/account/email.html:36 templates/socialaccount/connections.html:35 msgid "Remove" msgstr "Ausgewählte entfernen" #: templates/account/email.html:43 msgid "Warning:" msgstr "Warnung:" #: templates/account/email.html:43 msgid "" "You currently do not have any e-mail address set up. You should really add " "an e-mail address so you can receive notifications, reset your password, etc." msgstr "" "Du hast derzeit keine E-Mail-Adressen angegeben. Das solltest du allerdings " "tun, denn nur so können wir dich benachrichtigen und dein Passwort " "zurücksetzen." #: templates/account/email.html:48 msgid "Add E-mail Address" msgstr "E-Mail-Adresse hinzufügen" #: templates/account/email.html:53 msgid "Add E-mail" msgstr "E-Mail hinzufügen" #: templates/account/email.html:63 msgid "Do you really want to remove the selected e-mail address?" msgstr "Möchtest du wirklich die ausgewählte E-Mail-Adresse entfernen?" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "Hallo von %(site_name)s!" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "Danke dass du %(site_name)s nutzt!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, python-format msgid "" "You're receiving this e-mail because user %(user_display)s has given your e-" "mail address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "Du erhältst diese E-Mail, weil der Nutzer %(user_display)s von " "%(site_domain)s deine E-Mail-Adresse als seine angab, um sie mit seinem " "Konto zu verknüpfen.\n" "\n" "Um dies zu bestätigen, rufe bitte folgende Adresse auf: %(activate_url)s" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your E-mail Address" msgstr "Bitte bestätige deine E-Mail-Adresse" #: templates/account/email/password_reset_key_message.txt:4 msgid "" "You're receiving this e-mail because you or someone else has requested a " "password for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Du erhältst diese E-Mail weil du oder jemand anderes die Zurücksetzung des " "Passwortes für dein Konto gefordert hat.\n" "Falls es sich dabei nicht um dich handelt, kann diese Nachricht ignoriert " "werden. Rufe folgende Adresse auf um dein Passwort zurückzusetzen." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "" "Falls du deinen Anmeldenamen vergessen haben solltest; er lautet " "%(username)s." #: templates/account/email/password_reset_key_subject.txt:3 msgid "Password Reset E-mail" msgstr "E-Mail zum Zurücksetzen des Passworts" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm E-mail Address" msgstr "E-Mail-Adresse bestätigen" #: templates/account/email_confirm.html:16 #, python-format msgid "" "Please confirm that %(email)s is an e-mail " "address for user %(user_display)s." msgstr "" "Bitte bestätige, dass %(email)s eine E-Mail-" "Adresse von %(user_display)s ist." #: templates/account/email_confirm.html:20 msgid "Confirm" msgstr "Bestätigen" #: templates/account/email_confirm.html:27 #, python-format msgid "" "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgstr "" "Dieser Bestätigungslink ist leider abgelaufen. Lass Dir bitte eine neue Bestätigungs-Mail schicken." #: templates/account/login.html:6 templates/account/login.html:10 #: templates/account/login.html:43 msgid "Sign In" msgstr "Anmeldung" #: templates/account/login.html:15 #, python-format msgid "" "Please sign in with one\n" "of your existing third party accounts. Or, sign " "up\n" "for a %(site_name)s account and sign in below:" msgstr "" "Bitte melde dich mit einem der folgenden Netzwerkkonten an, oder registriere dich auf %(site_name)s, dann kannst " "du dich unten mit deinem Konto anmelden:" #: templates/account/login.html:25 msgid "or" msgstr "oder" #: templates/account/login.html:32 #, python-format msgid "" "If you have not created an account yet, then please\n" "sign up first." msgstr "" "Du hast noch kein Konto bei uns? Dann erstelle bitte zunächst eins." #: templates/account/login.html:42 templates/account/password_change.html:14 msgid "Forgot Password?" msgstr "Passwort vergessen?" #: templates/account/logout.html:5 templates/account/logout.html:8 #: templates/account/logout.html:17 msgid "Sign Out" msgstr "Abmelden" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Bist du sicher, dass du dich abmelden möchtest?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary e-mail address (%(email)s)." msgstr "Du kannst deine primäre E-Mail-Adresse (%(email)s) nicht löschen." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation e-mail sent to %(email)s." msgstr "Bestätigungs-E-Mail wurde an %(email)s verschickt." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "Du hast die Adresse %(email)s bestätigt." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed e-mail address %(email)s." msgstr "E-Mailadresse %(email)s entfernt." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Erfolgreich als %(name)s angemeldet." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Du hast dich abgemeldet." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Das Passwort wurde geändert." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Das Passwort wurde erfolgreich gesetzt." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary e-mail address set." msgstr "Primäre E-Mailadresse festgelegt." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary e-mail address must be verified." msgstr "Deine primäre E-Mailadresse muss bestätigt werden." #: templates/account/password_change.html:5 #: templates/account/password_change.html:8 #: templates/account/password_change.html:13 #: templates/account/password_reset_from_key.html:4 #: templates/account/password_reset_from_key.html:7 #: templates/account/password_reset_from_key_done.html:4 #: templates/account/password_reset_from_key_done.html:7 msgid "Change Password" msgstr "Passwort ändern" #: templates/account/password_reset.html:6 #: templates/account/password_reset.html:10 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:9 msgid "Password Reset" msgstr "Passwort zurücksetzen" #: templates/account/password_reset.html:15 msgid "" "Forgotten your password? Enter your e-mail address below, and we'll send you " "an e-mail allowing you to reset it." msgstr "" "Passwort vergessen? Gib deine E-Mail-Adresse unten ein, dann schicken wir " "dir einen Link, unter dem du dein Passwort zurücksetzen kannst." #: templates/account/password_reset.html:20 msgid "Reset My Password" msgstr "Passwort zurücksetzen" #: templates/account/password_reset.html:23 msgid "Please contact us if you have any trouble resetting your password." msgstr "" "Bitte kontaktiere uns, wenn das Zurücksetzen des Passworts nicht klappt." #: templates/account/password_reset_done.html:15 msgid "" "We have sent you an e-mail. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Wir haben Dir eine E-Mail geschickt. Bitte kontaktiere uns, wenn du sie " "nicht in ein paar Minuten erhalten hast." #: templates/account/password_reset_from_key.html:7 msgid "Bad Token" msgstr "Falsches Token" #: templates/account/password_reset_from_key.html:11 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Der Link zum Zurücksetzen des Passworts war ungültig, womöglich wurde dieser " "Link bereits benutzt. Bitte lass dein Passwort noch mal zurücksetzen." #: templates/account/password_reset_from_key.html:17 msgid "change password" msgstr "Passwort ändern" #: templates/account/password_reset_from_key.html:20 #: templates/account/password_reset_from_key_done.html:8 msgid "Your password is now changed." msgstr "Dein Passwort wurde geändert." #: templates/account/password_set.html:5 templates/account/password_set.html:8 #: templates/account/password_set.html:13 msgid "Set Password" msgstr "Passwort setzen" #: templates/account/signup.html:5 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Registrieren" #: templates/account/signup.html:8 templates/account/signup.html:18 #: templates/socialaccount/signup.html:8 templates/socialaccount/signup.html:19 msgid "Sign Up" msgstr "Registrieren" #: templates/account/signup.html:10 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "" "Du hast bereits ein Konto bei uns? Dann bitte hier " "entlang." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:8 msgid "Sign Up Closed" msgstr "Registrierung geschlossen" #: templates/account/signup_closed.html:10 msgid "We are sorry, but the sign up is currently closed." msgstr "Es tut uns leid, aber die Registrierung ist derzeit geschlossen." #: templates/account/snippets/already_logged_in.html:5 msgid "Note" msgstr "Anmerkung" #: templates/account/snippets/already_logged_in.html:5 #, python-format msgid "you are already logged in as %(user_display)s." msgstr "Du bist bereits als %(user_display)s angemeldet." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:8 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:8 msgid "Verify Your E-mail Address" msgstr "Bestätige deine E-Mail-Adresse" #: templates/account/verification_sent.html:10 msgid "" "We have sent an e-mail to you for verification. Follow the link provided to " "finalize the signup process. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Wir haben dir eine E-Mail geschickt, um deine Adresse zu verifizieren. Bitte " "folge dem Link in der E-Mail um den Anmeldeprozess abzuschließen. Bitte " "kontaktiere uns, falls die E-Mail nicht in ein paar Minuten angekommen ist." #: templates/account/verified_email_required.html:12 msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your e-mail address. " msgstr "" "Auf diesem Teil der Webseite möchten wie sichergehen,\n" "dass du die Person bist für die du dich ausgibst.\n" "Dazu musst du deine E-Mail-Adresse verifizieren. " #: templates/account/verified_email_required.html:16 msgid "" "We have sent an e-mail to you for\n" "verification. Please click on the link inside this e-mail. Please\n" "contact us if you do not receive it within a few minutes." msgstr "" "Wir haben Dir eine E-Mail geschickt, um deine\n" "Adresse zu verifizieren. Bitte klick auf den Link\n" "in der E-Mail. Wenn die E-Mail nicht in ein paar Minuten\n" "angekommen ist, gib uns bitte Bescheid." #: templates/account/verified_email_required.html:20 #, python-format msgid "" "Note: you can still change your e-" "mail address." msgstr "" "Anmerkung: Du kannst Deine E-Mail-" "Adresse ändern." #: templates/openid/login.html:9 msgid "OpenID Sign In" msgstr "OpenID-Anmeldung" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:8 msgid "Social Network Login Failure" msgstr "Fehler bei der Anmeldung am sozialen Netzwerk" #: templates/socialaccount/authentication_error.html:10 msgid "" "An error occurred while attempting to login via your social network account." msgstr "" "Ein Fehler ist aufgetreten; die Anmeldung beim sozialen Netzwerk hat nicht " "geklappt." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:8 msgid "Account Connections" msgstr "Konto-Verknüpfungen" #: templates/socialaccount/connections.html:11 msgid "" "You can sign in to your account using any of the following third party " "accounts:" msgstr "Du kannst dich bei uns über folgende soziale Netzwerke anmelden:" #: templates/socialaccount/connections.html:43 msgid "" "You currently have no social network accounts connected to this account." msgstr "Dein Konto ist derzeit mit keinen sozialen Netzwerken verknüpft." #: templates/socialaccount/connections.html:46 msgid "Add a 3rd Party Account" msgstr "Soziales Netzwerk hinzufügen" #: templates/socialaccount/login.html:6 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:8 #, python-format msgid "You are about to connect a new third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:10 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:12 #, python-format msgid "You are about to sign in using a third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Anmeldung abgebrochen" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Du hast die Anmeldung abgebrochen. Wenn das nur ein Versehen oder ein Fehler " "war, folge bitte diesem Link um dich " "anzumelden." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "Konten wurden erfolgreich verknüpft." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "" "Das Konto des Drittanbieters ist bereits mit einem anderen Konto dieser " "Seite verknüpft." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Die Verknüpfung mit dem sozialen Netzwerk wurde aufgehoben." #: templates/socialaccount/signup.html:10 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Du verwendest dein %(provider_name)s-Konto, um dich bei\n" "%(site_name)s anzumelden. Zum Abschluss bitte das folgende Formular " "ausfüllen:" #~ msgid "Account" #~ msgstr "Konto" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "Die Anmeldedaten sind leider falsch." #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "" #~ "Anmeldenamen dürfen nur Buchstaben und Ziffern und folgende Zeichen " #~ "enthalten: @/./+/-/_." #~ msgid "This username is already taken. Please choose another." #~ msgstr "Der Anmeldename ist bereits vergeben – bitte wähle einen anderen." #, fuzzy #~| msgid "Sign In" #~ msgid "Shopify Sign In" #~ msgstr "Anmeldung" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "Du hast bestätigt, dass %(email)s eine " #~ "gültige Adresse von %(user_display)s ist." #~ msgid "Thanks for using our site!" #~ msgstr "Danke, dass du unsere Seite nutzt!" django-allauth-0.47.0/allauth/locale/el/000077500000000000000000000000001415442050100177615ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/el/LC_MESSAGES/000077500000000000000000000000001415442050100215465ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/el/LC_MESSAGES/django.po000066400000000000000000000757621415442050100233710ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-12-09 08:41-0600\n" "PO-Revision-Date: 2014-08-12 00:29+0200\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: account/adapter.py:45 msgid "Username can not be used. Please use other username." msgstr "Δεν μπορεί να χρησιμοποιηθεί αυτό το όνομα χρήστη. Δοκιμάστε άλλο." #: account/adapter.py:51 msgid "Too many failed login attempts. Try again later." msgstr "Πολλές αποτυχημένες προσπάθειες σύνδεσης. Προσπαθήστε ξανά αργότερα." #: account/adapter.py:53 msgid "A user is already registered with this e-mail address." msgstr "Υπάρχει ήδη εγγεγραμμένος χρήστης με αυτό το e-mail." #: account/adapter.py:300 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Το συνθηματικό πρέπει να περιέχει τουλάχιστον {0} χαρακτήρες." #: account/apps.py:7 msgid "Accounts" msgstr "Λογαριασμοί" #: account/forms.py:59 account/forms.py:413 msgid "You must type the same password each time." msgstr "Πρέπει να δοθεί το ίδιο συνθηματικό κάθε φορά." #: account/forms.py:92 account/forms.py:381 account/forms.py:498 msgid "Password" msgstr "Συνθηματικό" #: account/forms.py:93 msgid "Remember Me" msgstr "Αυτόματη Σύνδεση" #: account/forms.py:97 msgid "This account is currently inactive." msgstr "Αυτός ο λογαριασμός είναι ανενεργός." #: account/forms.py:99 msgid "The e-mail address and/or password you specified are not correct." msgstr "Η διέυθυνση e-mail ή/και το συνθηματικό που δόθηκαν δεν είναι σωστά." #: account/forms.py:102 msgid "The username and/or password you specified are not correct." msgstr "Το όνομα χρήστη ή/και το συνθηματικό που δόθηκαν δεν είναι σωστά." #: account/forms.py:113 account/forms.py:279 account/forms.py:439 #: account/forms.py:517 msgid "E-mail address" msgstr "Διεύθυνση e-mail" #: account/forms.py:117 account/forms.py:316 account/forms.py:436 #: account/forms.py:512 msgid "E-mail" msgstr "E-mail" #: account/forms.py:120 account/forms.py:123 account/forms.py:269 #: account/forms.py:272 msgid "Username" msgstr "Όνομα χρήστη" #: account/forms.py:133 msgid "Username or e-mail" msgstr "Όνομα χρήστη ή e-mail" #: account/forms.py:136 msgctxt "field label" msgid "Login" msgstr "Σύνδεση" #: account/forms.py:307 #, fuzzy #| msgid "E-mail (optional)" msgid "E-mail (again)" msgstr "E-mail (επιβεβαίωση)" #: account/forms.py:311 #, fuzzy #| msgid "email confirmation" msgid "E-mail address confirmation" msgstr "Επιβεβαίωση διεύθυνσης e-mail" #: account/forms.py:319 msgid "E-mail (optional)" msgstr "E-mail (προαιρετικό)" #: account/forms.py:359 #, fuzzy #| msgid "You must type the same password each time." msgid "You must type the same email each time." msgstr "Πρέπει να δοθεί το ίδιο email κάθε φορά." #: account/forms.py:384 account/forms.py:499 msgid "Password (again)" msgstr "Συνθηματικό (επιβεβαίωση)" #: account/forms.py:448 msgid "This e-mail address is already associated with this account." msgstr "Αυτό το e-mail χρησιμοποιείται ήδη από αυτό το λογαριασμό." #: account/forms.py:451 msgid "This e-mail address is already associated with another account." msgstr "Αυτό το e-mail χρησιμοποιείται ήδη από άλλο λογαριασμό." #: account/forms.py:453 #, fuzzy, python-format #| msgid "Your account has no verified e-mail address." msgid "You cannot add more than %d e-mail addresses." msgstr "Δεν έχει επιβεβαιωθεί κανένα e-mail του λογαριασμού σας." #: account/forms.py:478 msgid "Current Password" msgstr "Τρέχον συνθηματικό" #: account/forms.py:480 account/forms.py:570 msgid "New Password" msgstr "Νέο συνθηματικό" #: account/forms.py:481 account/forms.py:571 msgid "New Password (again)" msgstr "Νέο συνθηματικό (επιβεβαίωση)" #: account/forms.py:489 msgid "Please type your current password." msgstr "Παρακαλώ γράψτε το τρέχον συνθηματικό σας." #: account/forms.py:529 msgid "The e-mail address is not assigned to any user account" msgstr "Το e-mail δεν χρησιμοποιείται από κανέναν λογαριασμό" #: account/forms.py:592 msgid "The password reset token was invalid." msgstr "Το κουπόνι επαναφοράς του συνθηματικού δεν ήταν έγκυρο." #: account/models.py:22 msgid "user" msgstr "χρήστης" #: account/models.py:28 account/models.py:83 msgid "e-mail address" msgstr "διεύθυνση e-mail" #: account/models.py:30 msgid "verified" msgstr "επαληθευμένο" #: account/models.py:31 msgid "primary" msgstr "πρωτεύον" #: account/models.py:36 msgid "email address" msgstr "διεύθυνση e-mail" #: account/models.py:37 msgid "email addresses" msgstr "διευθύνσεις e-mail" #: account/models.py:86 msgid "created" msgstr "δημιουργήθηκε" #: account/models.py:87 msgid "sent" msgstr "απστάλει" #: account/models.py:88 socialaccount/models.py:58 msgid "key" msgstr "κλειδί" #: account/models.py:93 msgid "email confirmation" msgstr "e-mail επιβεβαίωσης" #: account/models.py:94 msgid "email confirmations" msgstr "e-mail επιβεβαίωσης" #: socialaccount/adapter.py:26 #, python-format msgid "" "An account already exists with this e-mail address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Υπάρχει ήδη ένας λογαριασμός με αυτό το e-mail. Συνδεθείτε πρώτα με αυτόνκαι " "μετά συνδέστε τον λογαριασμό %s." #: socialaccount/adapter.py:131 msgid "Your account has no password set up." msgstr "Δεν έχει οριστεί συνθηματικό στον λογαριασμό σας." #: socialaccount/adapter.py:138 msgid "Your account has no verified e-mail address." msgstr "Δεν έχει επιβεβαιωθεί κανένα e-mail του λογαριασμού σας." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Λογαριασμοί Κοινωνικών Μέσων" #: socialaccount/models.py:41 socialaccount/models.py:84 msgid "provider" msgstr "πάροχος" #: socialaccount/models.py:45 msgid "name" msgstr "όνομα" #: socialaccount/models.py:47 msgid "client id" msgstr "id πελάτη" #: socialaccount/models.py:49 msgid "App ID, or consumer key" msgstr "App ID ή consumer key(κλειδί καταναλωτή)" #: socialaccount/models.py:52 msgid "secret key" msgstr "μυστικό κλειδί" #: socialaccount/models.py:55 msgid "API secret, client secret, or consumer secret" msgstr "API secret, client secret, ή consumer secret" #: socialaccount/models.py:58 msgid "Key" msgstr "Κλειδί" #: socialaccount/models.py:74 msgid "social application" msgstr "εφαρμογή κοινωνικών μέσων" #: socialaccount/models.py:75 msgid "social applications" msgstr "εφαρμογές κοινωνικών μέσων" #: socialaccount/models.py:105 msgid "uid" msgstr "uid" #: socialaccount/models.py:107 msgid "last login" msgstr "τελευταία σύνδεση" #: socialaccount/models.py:108 msgid "date joined" msgstr "ημερομηνία εγγραφής" #: socialaccount/models.py:109 msgid "extra data" msgstr "έξτρα δεδομένα" #: socialaccount/models.py:113 msgid "social account" msgstr "λογαριασμός κοινωνικών μέσων" #: socialaccount/models.py:114 msgid "social accounts" msgstr "λογαριασμοί κοινωνικών μέσων" #: socialaccount/models.py:139 msgid "token" msgstr "κουπόνι" #: socialaccount/models.py:140 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "\"oauth_token\" (OAuth1) ή access token (OAuth2)" #: socialaccount/models.py:144 msgid "token secret" msgstr "token secret" #: socialaccount/models.py:145 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "\"oauth_token_secret\" (OAuth1) ή refresh token (OAuth2)" #: socialaccount/models.py:148 msgid "expires at" msgstr "λήγει στις" #: socialaccount/models.py:153 msgid "social application token" msgstr "token (κουπόνι) εφαρμογής κοινωνικών μέσων" #: socialaccount/models.py:154 msgid "social application tokens" msgstr "tokens (κουπόνια) εφαρμογής κοινωνικών μέσων" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "Άκυρα δεδομένα προφίλ" #: socialaccount/providers/oauth/client.py:85 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Μη-έγκυρη απάντηση κατά την απόκτηση κουπονιού αιτήματος από \"%s\"." #: socialaccount/providers/oauth/client.py:117 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Μη-έγκυρη απάντηση κατά την απόκτηση κουπονιού πρόσβασης από \"%s\"." #: socialaccount/providers/oauth/client.py:138 #, python-format msgid "No request token saved for \"%s\"." msgstr "Δεν υπάρχει αποθηκευμένο κουπόνι αιτήματος για \"%s\"." #: socialaccount/providers/oauth/client.py:189 #, python-format msgid "No access token saved for \"%s\"." msgstr "Δεν υπάρχει αποθηκευμένο κουπόνι πρόσβασης για \"%s\"." #: socialaccount/providers/oauth/client.py:210 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Αδύνατη πρόσβαση σε ιδιοτικούς πόρους στο \"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:8 msgid "Account Inactive" msgstr "Λογαριασμός Ανενεργός" #: templates/account/account_inactive.html:10 msgid "This account is inactive." msgstr "Αυτός ο λογαριασμός είναι ανενεργός." #: templates/account/email.html:5 templates/account/email.html:8 msgid "E-mail Addresses" msgstr "Διεύθυνση e-mail" #: templates/account/email.html:10 msgid "The following e-mail addresses are associated with your account:" msgstr "" "Οι διευθύνσεις e-mail που ακολουθούν είναι συσχετισμένες με τον λογαριασμό " "σας:" #: templates/account/email.html:24 msgid "Verified" msgstr "Εγκεκριμένος" #: templates/account/email.html:26 msgid "Unverified" msgstr "Μη-επιβεβαιωμένο" #: templates/account/email.html:28 msgid "Primary" msgstr "Πρωτεύον" #: templates/account/email.html:34 msgid "Make Primary" msgstr "Ορισμός ως Πρωτεύον" #: templates/account/email.html:35 msgid "Re-send Verification" msgstr "Επανάληψη αποστολής Επαλήθευσης" #: templates/account/email.html:36 templates/socialaccount/connections.html:35 msgid "Remove" msgstr "Αφαίρεση" #: templates/account/email.html:43 msgid "Warning:" msgstr "Προσοχη:" #: templates/account/email.html:43 msgid "" "You currently do not have any e-mail address set up. You should really add " "an e-mail address so you can receive notifications, reset your password, etc." msgstr "" "Δεν έχετε ρυθμίσει καμία διεύθυνση e-mail. Προτείνουμε να προσθέσετε μία " "ώστε να μπορείτε να λάβετε ειδοποιήσεις, να ανακτήσετε το συνθηματικό σας " "κλπ." #: templates/account/email.html:48 msgid "Add E-mail Address" msgstr "Προσθήκη διέυθυνσης e-mail" #: templates/account/email.html:53 msgid "Add E-mail" msgstr "Προσθήκη e-mail" #: templates/account/email.html:63 msgid "Do you really want to remove the selected e-mail address?" msgstr "Θέλετε να αφαιρέσετε την επλεγμένη διεύθυνση e-mail?" #: templates/account/email/base_message.txt:1 #, fuzzy, python-format #| msgid "" #| "Thank you from %(site_name)s!\n" #| "%(site_domain)s" msgid "Hello from %(site_name)s!" msgstr "" "Ευχαριστούμε από το %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "Ευχαριστούμε που χρησιμοποιήσατε το %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because user %(user_display)s has given " #| "yours as an e-mail address to connect their account.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s\n" msgid "" "You're receiving this e-mail because user %(user_display)s has given your e-" "mail address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "Χαιρετίσματα από το %(site_name)s!\n" "\n" "Λαμβάνετε αυτό το e-mail επειδή ο χρήστης %(user_display)s έκανε αίτηση " "σύνδεσης της διέυθυνσης e-mail σας με τον λογαριασμό του.\n" "\n" "Για να επιβεβαιώσετε αυτή την ενέργεια, πηγαίνετε στο %(activate_url)s\n" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your E-mail Address" msgstr "Παρακαλούμε να επιβεβαιώσετε την διεύθυνση e-mail σας" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this e-mail because you or someone else has requested a " "password for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Χαιρετίσματα από το %(site_name)s!\n" "\n" "Λαμβάνετε αυτό το e-mail επειδή εσείς ή κάποιος άλλος έχει κάνει αίτηση " "συνθηματικού για τον λογαριασμό σας.\n" "Αν δεν ζητήσατε επαναφορά συνθηματικού, μπορεί να αγνοηθεί με ασφάλεια. " "Πατήστε στον σύνδεσμο που ακολουθεί για να επαναφέρετε το συνθηματικό σας." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "Σε περίπτωση που ξεχάσατε, το όνομα χρήστη σας είναι %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 msgid "Password Reset E-mail" msgstr "E-mail επαναφοράς συνθηματικού" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm E-mail Address" msgstr "Επιβεβαίωση διεύθυνση e-mail" #: templates/account/email_confirm.html:16 #, python-format msgid "" "Please confirm that %(email)s is an e-mail " "address for user %(user_display)s." msgstr "" "Παρακαλούμε επιβεβαιώστε ότι το %(email)s " "αποτελεί διεύθυνση e-mail για τον χρήστη %(user_display)s." #: templates/account/email_confirm.html:20 msgid "Confirm" msgstr "Επιβεβαίωση" #: templates/account/email_confirm.html:27 #, python-format msgid "" "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgstr "" "Αυτός ο σύνδεσμος επιβεβαίωσης έχει λήξει ή δεν είναι έγκυρος. Παρακαλούμε " "κάντε καινούρια αίτηση επιβεβαίωσης e-mail." #: templates/account/login.html:6 templates/account/login.html:10 #: templates/account/login.html:43 msgid "Sign In" msgstr "Σύνδεση" #: templates/account/login.html:15 #, python-format msgid "" "Please sign in with one\n" "of your existing third party accounts. Or, sign " "up\n" "for a %(site_name)s account and sign in below:" msgstr "" "Παρακαλούμε συνδεθείτε με έναν\n" "από τους ήδη υπάρχοντες εξωτερικούς λογαριασμούς σας. Ή, κάντε εγγραφή\n" "για έναν λογαριασμό %(site_name)s και συνδεθείτε παρακάτω:" #: templates/account/login.html:25 msgid "or" msgstr "ή" #: templates/account/login.html:32 #, python-format msgid "" "If you have not created an account yet, then please\n" "sign up first." msgstr "" "Αν δεν έχετε δημιουργήσει λογαριασμό, πρώτα κάντε\n" "εγγραφή" #: templates/account/login.html:42 templates/account/password_change.html:14 msgid "Forgot Password?" msgstr "Ξέχασα το συνθηματικό μου" #: templates/account/logout.html:5 templates/account/logout.html:8 #: templates/account/logout.html:17 msgid "Sign Out" msgstr "Αποσύνδεση" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Είστε σίγουροι ότι θέλετε να αποσυνδεθείτε;" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary e-mail address (%(email)s)." msgstr "Δεν μπορείτε να αφαιρέσετε την πρωτεύον διεύθυνση email (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation e-mail sent to %(email)s." msgstr "E-mail επιβεβαίωσης στάλθηκε στο %(email)s." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "Έχετε επιβεβαιώσει το %(email)s." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed e-mail address %(email)s." msgstr "Αφαιρέθηκε η διεύθυνση e-mail %(email)s." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Επιτυχημένη σύνδεση ως %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Έχετε αποσυνδεθεί." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Αλλαγή συνθηματικού ολοκληρώθηκε επιτυχώς." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Συνθηματικό ορίστηκε επιτυχώς." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary e-mail address set." msgstr "Ορίστηκε η πρωτεύον διεύθυνση e-mail." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary e-mail address must be verified." msgstr "Η πρωτεύον διεύθυνση e-mail πρέπει να επιβεβαιωθεί." #: templates/account/password_change.html:5 #: templates/account/password_change.html:8 #: templates/account/password_change.html:13 #: templates/account/password_reset_from_key.html:4 #: templates/account/password_reset_from_key.html:7 #: templates/account/password_reset_from_key_done.html:4 #: templates/account/password_reset_from_key_done.html:7 msgid "Change Password" msgstr "Αλλάξτε Συνθηματικό" #: templates/account/password_reset.html:6 #: templates/account/password_reset.html:10 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:9 msgid "Password Reset" msgstr "Επαναφορά Συνθηματικού" #: templates/account/password_reset.html:15 msgid "" "Forgotten your password? Enter your e-mail address below, and we'll send you " "an e-mail allowing you to reset it." msgstr "" "Ξεχάσατε το συνθηματικό σας? Γράψτε το e-mail σας παρακάτω, και θα σας " "στείλουμε ενα e-mail για να το επαναφέρετε." #: templates/account/password_reset.html:20 msgid "Reset My Password" msgstr "Επαναφορά του Συνθηματικού Μου" #: templates/account/password_reset.html:23 msgid "Please contact us if you have any trouble resetting your password." msgstr "" "Παρακαλούμε επικοινωνήστε μαζί μας αν υπάρξει οποιοδήποτε πρόβλημα κατα την " "επαναφορά του συνθηματικού σας." #: templates/account/password_reset_done.html:15 msgid "" "We have sent you an e-mail. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Σας έχουμε στείλει ένα e-mail. Παρακαλούμε επικοινωνήστε μαζί μας αν δεν το " "έχετε παραλάβει μέσα σε λίγα λεπτά." #: templates/account/password_reset_from_key.html:7 msgid "Bad Token" msgstr "Μη-έγκυρο Κουπόνι" #: templates/account/password_reset_from_key.html:11 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Ο σύνδεσμος επαναφορά συνθηματικού δεν ήταν έγκυρος, πιθανών να έχει ήδη " "χρησιμοποιηθεί. Παρακαλούμε κάντε εκ νέου επαναφορά συνθηματικού." #: templates/account/password_reset_from_key.html:17 msgid "change password" msgstr "αλλαγή συνθηματικού" #: templates/account/password_reset_from_key.html:20 #: templates/account/password_reset_from_key_done.html:8 msgid "Your password is now changed." msgstr "Το συνθηματικό σας έχει αλλάξει." #: templates/account/password_set.html:5 templates/account/password_set.html:8 #: templates/account/password_set.html:13 msgid "Set Password" msgstr "Ορισμός Συνθηματικού" #: templates/account/signup.html:5 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Εγγραφή" #: templates/account/signup.html:8 templates/account/signup.html:18 #: templates/socialaccount/signup.html:8 templates/socialaccount/signup.html:19 msgid "Sign Up" msgstr "Εγγραφή" #: templates/account/signup.html:10 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "" "Έχετε ήδη λογαριασμό; Τότε παρακαλούμε συνδεθείτε." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:8 msgid "Sign Up Closed" msgstr "Φραγή Εγγραφών" #: templates/account/signup_closed.html:10 msgid "We are sorry, but the sign up is currently closed." msgstr "Ζητούμε συγνώμη, αλλά η δυνατότητα εγγραφής είναι υπό φραγή." #: templates/account/snippets/already_logged_in.html:5 msgid "Note" msgstr "Σημείωση" #: templates/account/snippets/already_logged_in.html:5 #, python-format msgid "you are already logged in as %(user_display)s." msgstr "είστε ήδη συνδεδεμένος ως %(user_display)s." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:8 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:8 msgid "Verify Your E-mail Address" msgstr "Επιβεβαιώστε την διεύθυνση e-mail σας" #: templates/account/verification_sent.html:10 msgid "" "We have sent an e-mail to you for verification. Follow the link provided to " "finalize the signup process. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Σας στείλαμε ένα e-mail για επαλήθευση. Ακολουθήστε τον σύνδεσμο που λάβατε " "γιατην ολοκλήρωση της διαδικασίας εγγραφής. Παρακαλούμε επικοινωνήστε μαζί " "μας αν δεν το έχετε παραλάβει μέσα σε λίγα λεπτά." #: templates/account/verified_email_required.html:12 msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your e-mail address. " msgstr "" "Αυτή η λειτουργία της σελίδας απαιτεί την επαλήθευση\n" "της ταυτότηας σας. Γι' αυτό, σας ζητούμε να\n" "επαληθεύσετε την ιδιοκτησία της e-mail διεύθυνσης σας. " #: templates/account/verified_email_required.html:16 msgid "" "We have sent an e-mail to you for\n" "verification. Please click on the link inside this e-mail. Please\n" "contact us if you do not receive it within a few minutes." msgstr "" "Σας στείλαμε ένα e-mail για επαλήθευση.\n" "Παρακαλούμε ακολουθήστε τον σύνδεσμο που αυτό περιέχει. Παρακαλούμε\n" "επικοινωνήστε μαζί μας αν δεν το έχετε παραλάβει μέσα σε λίγα λεπτά." #: templates/account/verified_email_required.html:20 #, python-format msgid "" "Note: you can still change your e-" "mail address." msgstr "" "Σημείωση: μπορείτε ακόμα να αλλάξετε τηνδιεύθυνση e-mail σας." #: templates/openid/login.html:9 msgid "OpenID Sign In" msgstr "Σύνδεση OpenID" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:8 msgid "Social Network Login Failure" msgstr "Σύνδεση μέσω Κοινωνικών Μέσων ανεπιτυχής" #: templates/socialaccount/authentication_error.html:10 msgid "" "An error occurred while attempting to login via your social network account." msgstr "" "Παρουσιάστηκε ένα σφάλμα κατά την σύνδεση μέσω του λογαριασμού κοινωνικών " "μέσων σας." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:8 msgid "Account Connections" msgstr "Συνδέσεις Λογαριασμού" #: templates/socialaccount/connections.html:11 msgid "" "You can sign in to your account using any of the following third party " "accounts:" msgstr "" "Μπορείτε να συνδεθείτε στον λογαριασμό σας με οποιοδήποτε από τους παρακάτω " "εξωτερικούς λογαριασμούς:" #: templates/socialaccount/connections.html:43 msgid "" "You currently have no social network accounts connected to this account." msgstr "" "Δεν έχετε συνδέσει κανένα λογαριασμό κοινωνικών μέσων με αυτό τον λογαριασμό." #: templates/socialaccount/connections.html:46 msgid "Add a 3rd Party Account" msgstr "Προσθήκη εξωτερικού λογαριασμού" #: templates/socialaccount/login.html:6 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:8 #, python-format msgid "You are about to connect a new third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:10 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:12 #, python-format msgid "You are about to sign in using a third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Σύνδεση ακυρώθηκε" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Αποφασίσατε να ακυρώσετε την σύνδεση σας στην ιστοσελίδα με έναν από τους " "υπάρχοντες λογαριασμούς σας. Αν έγινε κατά λάθος, παρακαλώ συνδεθείτε." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "Ο λογαριασμός κοινωνικών μέσων έχει συνδεθεί." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "" "Ο λογαριασμός κοινωνικών μέσων είναι ήδη συνδεδεμένος με διαφορετικό " "λογαριασμό." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Ο λογαριασμός κοινωνικών μέσων έχει αποσυνδεθεί." #: templates/socialaccount/signup.html:10 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Πρόκειται να χρησιμοποιήσετε τον %(provider_name)s λογαριασμό σας για να " "συνδεθείτε στην σελίδα\n" "%(site_name)s. Ως τελικό βήμα, παρακαλούμε συμπληρώστε την παρακάτω φόρμα:" #~ msgid "Account" #~ msgstr "Λογαριασμός" django-allauth-0.47.0/allauth/locale/en/000077500000000000000000000000001415442050100177635ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/en/LC_MESSAGES/000077500000000000000000000000001415442050100215505ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/en/LC_MESSAGES/django.po000066400000000000000000000436001415442050100233550ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-12-09 08:41-0600\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: account/adapter.py:45 msgid "Username can not be used. Please use other username." msgstr "" #: account/adapter.py:51 msgid "Too many failed login attempts. Try again later." msgstr "" #: account/adapter.py:53 msgid "A user is already registered with this e-mail address." msgstr "" #: account/adapter.py:300 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "" #: account/apps.py:7 msgid "Accounts" msgstr "" #: account/forms.py:59 account/forms.py:413 msgid "You must type the same password each time." msgstr "" #: account/forms.py:92 account/forms.py:381 account/forms.py:498 msgid "Password" msgstr "" #: account/forms.py:93 msgid "Remember Me" msgstr "" #: account/forms.py:97 msgid "This account is currently inactive." msgstr "" #: account/forms.py:99 msgid "The e-mail address and/or password you specified are not correct." msgstr "" #: account/forms.py:102 msgid "The username and/or password you specified are not correct." msgstr "" #: account/forms.py:113 account/forms.py:279 account/forms.py:439 #: account/forms.py:517 msgid "E-mail address" msgstr "" #: account/forms.py:117 account/forms.py:316 account/forms.py:436 #: account/forms.py:512 msgid "E-mail" msgstr "" #: account/forms.py:120 account/forms.py:123 account/forms.py:269 #: account/forms.py:272 msgid "Username" msgstr "" #: account/forms.py:133 msgid "Username or e-mail" msgstr "" #: account/forms.py:136 msgctxt "field label" msgid "Login" msgstr "" #: account/forms.py:307 msgid "E-mail (again)" msgstr "" #: account/forms.py:311 msgid "E-mail address confirmation" msgstr "" #: account/forms.py:319 msgid "E-mail (optional)" msgstr "" #: account/forms.py:359 msgid "You must type the same email each time." msgstr "" #: account/forms.py:384 account/forms.py:499 msgid "Password (again)" msgstr "" #: account/forms.py:448 msgid "This e-mail address is already associated with this account." msgstr "" #: account/forms.py:451 msgid "This e-mail address is already associated with another account." msgstr "" #: account/forms.py:453 #, python-format msgid "You cannot add more than %d e-mail addresses." msgstr "" #: account/forms.py:478 msgid "Current Password" msgstr "" #: account/forms.py:480 account/forms.py:570 msgid "New Password" msgstr "" #: account/forms.py:481 account/forms.py:571 msgid "New Password (again)" msgstr "" #: account/forms.py:489 msgid "Please type your current password." msgstr "" #: account/forms.py:529 msgid "The e-mail address is not assigned to any user account" msgstr "" #: account/forms.py:592 msgid "The password reset token was invalid." msgstr "" #: account/models.py:22 msgid "user" msgstr "" #: account/models.py:28 account/models.py:83 msgid "e-mail address" msgstr "" #: account/models.py:30 msgid "verified" msgstr "" #: account/models.py:31 msgid "primary" msgstr "" #: account/models.py:36 msgid "email address" msgstr "" #: account/models.py:37 msgid "email addresses" msgstr "" #: account/models.py:86 msgid "created" msgstr "" #: account/models.py:87 msgid "sent" msgstr "" #: account/models.py:88 socialaccount/models.py:58 msgid "key" msgstr "" #: account/models.py:93 msgid "email confirmation" msgstr "" #: account/models.py:94 msgid "email confirmations" msgstr "" #: socialaccount/adapter.py:26 #, python-format msgid "" "An account already exists with this e-mail address. Please sign in to that " "account first, then connect your %s account." msgstr "" #: socialaccount/adapter.py:131 msgid "Your account has no password set up." msgstr "" #: socialaccount/adapter.py:138 msgid "Your account has no verified e-mail address." msgstr "" #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "" #: socialaccount/models.py:41 socialaccount/models.py:84 msgid "provider" msgstr "" #: socialaccount/models.py:45 msgid "name" msgstr "" #: socialaccount/models.py:47 msgid "client id" msgstr "" #: socialaccount/models.py:49 msgid "App ID, or consumer key" msgstr "" #: socialaccount/models.py:52 msgid "secret key" msgstr "" #: socialaccount/models.py:55 msgid "API secret, client secret, or consumer secret" msgstr "" #: socialaccount/models.py:58 msgid "Key" msgstr "" #: socialaccount/models.py:74 msgid "social application" msgstr "" #: socialaccount/models.py:75 msgid "social applications" msgstr "" #: socialaccount/models.py:105 msgid "uid" msgstr "" #: socialaccount/models.py:107 msgid "last login" msgstr "" #: socialaccount/models.py:108 msgid "date joined" msgstr "" #: socialaccount/models.py:109 msgid "extra data" msgstr "" #: socialaccount/models.py:113 msgid "social account" msgstr "" #: socialaccount/models.py:114 msgid "social accounts" msgstr "" #: socialaccount/models.py:139 msgid "token" msgstr "" #: socialaccount/models.py:140 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "" #: socialaccount/models.py:144 msgid "token secret" msgstr "" #: socialaccount/models.py:145 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "" #: socialaccount/models.py:148 msgid "expires at" msgstr "" #: socialaccount/models.py:153 msgid "social application token" msgstr "" #: socialaccount/models.py:154 msgid "social application tokens" msgstr "" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "" #: socialaccount/providers/oauth/client.py:85 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "" #: socialaccount/providers/oauth/client.py:117 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "" #: socialaccount/providers/oauth/client.py:138 #, python-format msgid "No request token saved for \"%s\"." msgstr "" #: socialaccount/providers/oauth/client.py:189 #, python-format msgid "No access token saved for \"%s\"." msgstr "" #: socialaccount/providers/oauth/client.py:210 #, python-format msgid "No access to private resources at \"%s\"." msgstr "" #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:8 msgid "Account Inactive" msgstr "" #: templates/account/account_inactive.html:10 msgid "This account is inactive." msgstr "" #: templates/account/email.html:5 templates/account/email.html:8 msgid "E-mail Addresses" msgstr "" #: templates/account/email.html:10 msgid "The following e-mail addresses are associated with your account:" msgstr "" #: templates/account/email.html:24 msgid "Verified" msgstr "" #: templates/account/email.html:26 msgid "Unverified" msgstr "" #: templates/account/email.html:28 msgid "Primary" msgstr "" #: templates/account/email.html:34 msgid "Make Primary" msgstr "" #: templates/account/email.html:35 msgid "Re-send Verification" msgstr "" #: templates/account/email.html:36 templates/socialaccount/connections.html:35 msgid "Remove" msgstr "" #: templates/account/email.html:43 msgid "Warning:" msgstr "" #: templates/account/email.html:43 msgid "" "You currently do not have any e-mail address set up. You should really add " "an e-mail address so you can receive notifications, reset your password, etc." msgstr "" #: templates/account/email.html:48 msgid "Add E-mail Address" msgstr "" #: templates/account/email.html:53 msgid "Add E-mail" msgstr "" #: templates/account/email.html:63 msgid "Do you really want to remove the selected e-mail address?" msgstr "" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" #: templates/account/email/email_confirmation_message.txt:5 #, python-format msgid "" "You're receiving this e-mail because user %(user_display)s has given your e-" "mail address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your E-mail Address" msgstr "" #: templates/account/email/password_reset_key_message.txt:4 msgid "" "You're receiving this e-mail because you or someone else has requested a " "password for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "" #: templates/account/email/password_reset_key_subject.txt:3 msgid "Password Reset E-mail" msgstr "" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm E-mail Address" msgstr "" #: templates/account/email_confirm.html:16 #, python-format msgid "" "Please confirm that %(email)s is an e-mail " "address for user %(user_display)s." msgstr "" #: templates/account/email_confirm.html:20 msgid "Confirm" msgstr "" #: templates/account/email_confirm.html:27 #, python-format msgid "" "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgstr "" #: templates/account/login.html:6 templates/account/login.html:10 #: templates/account/login.html:43 msgid "Sign In" msgstr "" #: templates/account/login.html:15 #, python-format msgid "" "Please sign in with one\n" "of your existing third party accounts. Or, sign " "up\n" "for a %(site_name)s account and sign in below:" msgstr "" #: templates/account/login.html:25 msgid "or" msgstr "" #: templates/account/login.html:32 #, python-format msgid "" "If you have not created an account yet, then please\n" "sign up first." msgstr "" #: templates/account/login.html:42 templates/account/password_change.html:14 msgid "Forgot Password?" msgstr "" #: templates/account/logout.html:5 templates/account/logout.html:8 #: templates/account/logout.html:17 msgid "Sign Out" msgstr "" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary e-mail address (%(email)s)." msgstr "" #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation e-mail sent to %(email)s." msgstr "" #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "" #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed e-mail address %(email)s." msgstr "" #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "" #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "" #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "" #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "" #: templates/account/messages/primary_email_set.txt:2 msgid "Primary e-mail address set." msgstr "" #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary e-mail address must be verified." msgstr "" #: templates/account/password_change.html:5 #: templates/account/password_change.html:8 #: templates/account/password_change.html:13 #: templates/account/password_reset_from_key.html:4 #: templates/account/password_reset_from_key.html:7 #: templates/account/password_reset_from_key_done.html:4 #: templates/account/password_reset_from_key_done.html:7 msgid "Change Password" msgstr "" #: templates/account/password_reset.html:6 #: templates/account/password_reset.html:10 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:9 msgid "Password Reset" msgstr "" #: templates/account/password_reset.html:15 msgid "" "Forgotten your password? Enter your e-mail address below, and we'll send you " "an e-mail allowing you to reset it." msgstr "" #: templates/account/password_reset.html:20 msgid "Reset My Password" msgstr "" #: templates/account/password_reset.html:23 msgid "Please contact us if you have any trouble resetting your password." msgstr "" #: templates/account/password_reset_done.html:15 msgid "" "We have sent you an e-mail. Please contact us if you do not receive it " "within a few minutes." msgstr "" #: templates/account/password_reset_from_key.html:7 msgid "Bad Token" msgstr "" #: templates/account/password_reset_from_key.html:11 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" #: templates/account/password_reset_from_key.html:17 msgid "change password" msgstr "" #: templates/account/password_reset_from_key.html:20 #: templates/account/password_reset_from_key_done.html:8 msgid "Your password is now changed." msgstr "" #: templates/account/password_set.html:5 templates/account/password_set.html:8 #: templates/account/password_set.html:13 msgid "Set Password" msgstr "" #: templates/account/signup.html:5 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "" #: templates/account/signup.html:8 templates/account/signup.html:18 #: templates/socialaccount/signup.html:8 templates/socialaccount/signup.html:19 msgid "Sign Up" msgstr "" #: templates/account/signup.html:10 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "" #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:8 msgid "Sign Up Closed" msgstr "" #: templates/account/signup_closed.html:10 msgid "We are sorry, but the sign up is currently closed." msgstr "" #: templates/account/snippets/already_logged_in.html:5 msgid "Note" msgstr "" #: templates/account/snippets/already_logged_in.html:5 #, python-format msgid "you are already logged in as %(user_display)s." msgstr "" #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:8 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:8 msgid "Verify Your E-mail Address" msgstr "" #: templates/account/verification_sent.html:10 msgid "" "We have sent an e-mail to you for verification. Follow the link provided to " "finalize the signup process. Please contact us if you do not receive it " "within a few minutes." msgstr "" #: templates/account/verified_email_required.html:12 msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your e-mail address. " msgstr "" #: templates/account/verified_email_required.html:16 msgid "" "We have sent an e-mail to you for\n" "verification. Please click on the link inside this e-mail. Please\n" "contact us if you do not receive it within a few minutes." msgstr "" #: templates/account/verified_email_required.html:20 #, python-format msgid "" "Note: you can still change your e-" "mail address." msgstr "" #: templates/openid/login.html:9 msgid "OpenID Sign In" msgstr "" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:8 msgid "Social Network Login Failure" msgstr "" #: templates/socialaccount/authentication_error.html:10 msgid "" "An error occurred while attempting to login via your social network account." msgstr "" #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:8 msgid "Account Connections" msgstr "" #: templates/socialaccount/connections.html:11 msgid "" "You can sign in to your account using any of the following third party " "accounts:" msgstr "" #: templates/socialaccount/connections.html:43 msgid "" "You currently have no social network accounts connected to this account." msgstr "" #: templates/socialaccount/connections.html:46 msgid "Add a 3rd Party Account" msgstr "" #: templates/socialaccount/login.html:6 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:8 #, python-format msgid "You are about to connect a new third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:10 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:12 #, python-format msgid "You are about to sign in using a third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "" #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "" #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "" #: templates/socialaccount/signup.html:10 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" django-allauth-0.47.0/allauth/locale/es/000077500000000000000000000000001415442050100177705ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/es/LC_MESSAGES/000077500000000000000000000000001415442050100215555ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/es/LC_MESSAGES/django.po000066400000000000000000000657001415442050100233670ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: django-allauth\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-12-09 08:41-0600\n" "PO-Revision-Date: 2018-02-14 17:46-0600\n" "Last-Translator: Jannis Š\n" "Language-Team: Spanish (http://www.transifex.com/projects/p/django-allauth/" "language/es/)\n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 1.8.7.1\n" #: account/adapter.py:45 msgid "Username can not be used. Please use other username." msgstr "Este nombre de usuario no puede ser usado. Por favor ingresa otro." #: account/adapter.py:51 msgid "Too many failed login attempts. Try again later." msgstr "Demasiados intentos fallidos, intenta más tarde." #: account/adapter.py:53 msgid "A user is already registered with this e-mail address." msgstr "Un usuario ya fue registrado con esta dirección de correo electrónico." #: account/adapter.py:300 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Una contraseña necesita al menos {0} caracteres." #: account/apps.py:7 msgid "Accounts" msgstr "Cuentas" #: account/forms.py:59 account/forms.py:413 msgid "You must type the same password each time." msgstr "Debes escribir la misma contraseña cada vez." #: account/forms.py:92 account/forms.py:381 account/forms.py:498 msgid "Password" msgstr "Contraseña" #: account/forms.py:93 msgid "Remember Me" msgstr "Recordarme" #: account/forms.py:97 msgid "This account is currently inactive." msgstr "Esta cuenta está desactivada actualmente." #: account/forms.py:99 msgid "The e-mail address and/or password you specified are not correct." msgstr "" "El correo electrónico y/o la contraseña que especificaste no son correctos." #: account/forms.py:102 msgid "The username and/or password you specified are not correct." msgstr "El usuario y/o la contraseña que especificaste no son correctos." #: account/forms.py:113 account/forms.py:279 account/forms.py:439 #: account/forms.py:517 msgid "E-mail address" msgstr "Correo electrónico" #: account/forms.py:117 account/forms.py:316 account/forms.py:436 #: account/forms.py:512 msgid "E-mail" msgstr "Correo electrónico" #: account/forms.py:120 account/forms.py:123 account/forms.py:269 #: account/forms.py:272 msgid "Username" msgstr "Usuario" #: account/forms.py:133 msgid "Username or e-mail" msgstr "Nombre de usuario o correo electrónico" #: account/forms.py:136 msgctxt "field label" msgid "Login" msgstr "Iniciar sesión" #: account/forms.py:307 msgid "E-mail (again)" msgstr "Correo Electrónico (otra vez)" #: account/forms.py:311 msgid "E-mail address confirmation" msgstr "Confirmación de la dirección de correo electrónico" #: account/forms.py:319 msgid "E-mail (optional)" msgstr "Correo Electrónico (opcional)" #: account/forms.py:359 msgid "You must type the same email each time." msgstr "Debe escribir el mismo correo electrónico cada vez." #: account/forms.py:384 account/forms.py:499 msgid "Password (again)" msgstr "Contraseña (de nuevo)" #: account/forms.py:448 msgid "This e-mail address is already associated with this account." msgstr "Este correo electrónico ya está asociado con esta cuenta." #: account/forms.py:451 msgid "This e-mail address is already associated with another account." msgstr "Este correo electrónico ya está asociado con otra cuenta." #: account/forms.py:453 #, fuzzy, python-format #| msgid "Your account has no verified e-mail address." msgid "You cannot add more than %d e-mail addresses." msgstr "Tu cuenta no tiene un correo electrónico verificado." #: account/forms.py:478 msgid "Current Password" msgstr "Contraseña actual" #: account/forms.py:480 account/forms.py:570 msgid "New Password" msgstr "Nueva contraseña" #: account/forms.py:481 account/forms.py:571 msgid "New Password (again)" msgstr "Nueva contraseña (de nuevo)" #: account/forms.py:489 msgid "Please type your current password." msgstr "Por favor, escribe tu contraseña actual." #: account/forms.py:529 msgid "The e-mail address is not assigned to any user account" msgstr "" "La dirección de correo electrónico no está asignada a ninguna cuenta de " "usuario" #: account/forms.py:592 msgid "The password reset token was invalid." msgstr "" #: account/models.py:22 msgid "user" msgstr "usuario" #: account/models.py:28 account/models.py:83 msgid "e-mail address" msgstr "correo electrónico" #: account/models.py:30 msgid "verified" msgstr "verificado" #: account/models.py:31 msgid "primary" msgstr "primero" #: account/models.py:36 msgid "email address" msgstr "correo electrónico" #: account/models.py:37 msgid "email addresses" msgstr "correos electrónicos" #: account/models.py:86 msgid "created" msgstr "creado" #: account/models.py:87 msgid "sent" msgstr "enviado" #: account/models.py:88 socialaccount/models.py:58 msgid "key" msgstr "" #: account/models.py:93 msgid "email confirmation" msgstr "confirmación de correo electrónico" #: account/models.py:94 msgid "email confirmations" msgstr "confirmación de correos electrónicos" #: socialaccount/adapter.py:26 #, python-format msgid "" "An account already exists with this e-mail address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Ya existe una cuenta asociada a esta dirección de correo electrónico. Por " "favor, autentícate usando esa cuenta, y luego vincula tu cuenta de %s." #: socialaccount/adapter.py:131 msgid "Your account has no password set up." msgstr "Tu cuenta no tiene una contraseña definida." #: socialaccount/adapter.py:138 msgid "Your account has no verified e-mail address." msgstr "Tu cuenta no tiene un correo electrónico verificado." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Cuentas Sociales" #: socialaccount/models.py:41 socialaccount/models.py:84 msgid "provider" msgstr "proveedor" #: socialaccount/models.py:45 msgid "name" msgstr "nombre" #: socialaccount/models.py:47 msgid "client id" msgstr "" #: socialaccount/models.py:49 msgid "App ID, or consumer key" msgstr "" #: socialaccount/models.py:52 msgid "secret key" msgstr "" #: socialaccount/models.py:55 msgid "API secret, client secret, or consumer secret" msgstr "" #: socialaccount/models.py:58 msgid "Key" msgstr "" #: socialaccount/models.py:74 msgid "social application" msgstr "" #: socialaccount/models.py:75 msgid "social applications" msgstr "" #: socialaccount/models.py:105 msgid "uid" msgstr "" #: socialaccount/models.py:107 msgid "last login" msgstr "último inicio de sesión" #: socialaccount/models.py:108 msgid "date joined" msgstr "" #: socialaccount/models.py:109 msgid "extra data" msgstr "" #: socialaccount/models.py:113 msgid "social account" msgstr "" #: socialaccount/models.py:114 msgid "social accounts" msgstr "" #: socialaccount/models.py:139 msgid "token" msgstr "" #: socialaccount/models.py:140 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "" #: socialaccount/models.py:144 msgid "token secret" msgstr "" #: socialaccount/models.py:145 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "" #: socialaccount/models.py:148 msgid "expires at" msgstr "" #: socialaccount/models.py:153 msgid "social application token" msgstr "" #: socialaccount/models.py:154 msgid "social application tokens" msgstr "" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "Datos de perfil inválidos" #: socialaccount/providers/oauth/client.py:85 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Respuesta no válida al obtener token de solicitud de \"%s\"." #: socialaccount/providers/oauth/client.py:117 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Respuesta inválida al obtener token de acceso de \"%s\"." #: socialaccount/providers/oauth/client.py:138 #, python-format msgid "No request token saved for \"%s\"." msgstr "No hay token de solicitud guardados para \"%s\"." #: socialaccount/providers/oauth/client.py:189 #, python-format msgid "No access token saved for \"%s\"." msgstr "No hay token de acceso guardado para \"%s\"." #: socialaccount/providers/oauth/client.py:210 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Sin acceso a recursos privados de \"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:8 msgid "Account Inactive" msgstr "Cuenta desactivada" #: templates/account/account_inactive.html:10 msgid "This account is inactive." msgstr "Esta cuenta está desactivada." #: templates/account/email.html:5 templates/account/email.html:8 msgid "E-mail Addresses" msgstr "Direcciones de correo electrónico" #: templates/account/email.html:10 msgid "The following e-mail addresses are associated with your account:" msgstr "" "Las siguientes direcciones de correo electrónico están asociadas a tu cuenta:" #: templates/account/email.html:24 msgid "Verified" msgstr "Verificado" #: templates/account/email.html:26 msgid "Unverified" msgstr "Sin verificar" #: templates/account/email.html:28 msgid "Primary" msgstr "Principal" #: templates/account/email.html:34 msgid "Make Primary" msgstr "Definir como principal" #: templates/account/email.html:35 msgid "Re-send Verification" msgstr "Reenviar Verificación" #: templates/account/email.html:36 templates/socialaccount/connections.html:35 msgid "Remove" msgstr "Eliminar" #: templates/account/email.html:43 msgid "Warning:" msgstr "Advertencia:" #: templates/account/email.html:43 msgid "" "You currently do not have any e-mail address set up. You should really add " "an e-mail address so you can receive notifications, reset your password, etc." msgstr "" "Actualmente no tienes ninguna dirección de correo electrónico definida. " "Debes añadir una dirección de correo electrónico para poder recibir " "notificaciones, restablecer la contraseña, etc." #: templates/account/email.html:48 msgid "Add E-mail Address" msgstr "Añadir correo electrónico" #: templates/account/email.html:53 msgid "Add E-mail" msgstr "Añadir correo electrónico" #: templates/account/email.html:63 msgid "Do you really want to remove the selected e-mail address?" msgstr "" "¿Estás seguro de querer eliminar la dirección de correo electrónico " "seleccionada?" #: templates/account/email/base_message.txt:1 #, fuzzy, python-format #| msgid "" #| "Thank you from %(site_name)s!\n" #| "%(site_domain)s" msgid "Hello from %(site_name)s!" msgstr "" "Gracias %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "Muchas gracias por usar %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because user %(user_display)s has given " #| "yours as an e-mail address to connect their account.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s\n" msgid "" "You're receiving this e-mail because user %(user_display)s has given your e-" "mail address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "¡Te saluda %(site_name)s!\n" "\n" "Estás recibiendo este correo electrónico porque el usuario %(user_display)s " "ha dado su correo electrónico para conectar su cuenta.\n" "\n" "Para confirmar que esto es correcto, haz clic en %(activate_url)s\n" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your E-mail Address" msgstr "Por favor confirmar dirección de correo electrónico" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this e-mail because you or someone else has requested a " "password for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "¡Te saluda %(site_name)s!\n" "\n" "Estás recibiendo este correo electrónico porque usted u otra persona ha " "solicitado una contraseña para su cuenta de usuario.\n" "Se puede ignorar de forma segura si no solicitó un restablecimiento de " "contraseña. Haga clic en el siguiente enlace para restablecer su contraseña." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "En caso de haber olvidado tu nombre de usuario, es %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 msgid "Password Reset E-mail" msgstr "Correo para restablecer contraseña" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm E-mail Address" msgstr "Confirmar dirección de correo electrónico" #: templates/account/email_confirm.html:16 #, python-format msgid "" "Please confirm that %(email)s is an e-mail " "address for user %(user_display)s." msgstr "" "Por favor confirma que %(email)s es una " "dirección de correo electrónico del usuario %(user_display)s." #: templates/account/email_confirm.html:20 msgid "Confirm" msgstr "Confirmar" #: templates/account/email_confirm.html:27 #, python-format msgid "" "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgstr "" "Este enlace de verificación de correo ha expirado o es inválido. Por favor " "solicita una nueva verificación por correo " "electrónico.." #: templates/account/login.html:6 templates/account/login.html:10 #: templates/account/login.html:43 msgid "Sign In" msgstr "Iniciar sesión" #: templates/account/login.html:15 #, python-format msgid "" "Please sign in with one\n" "of your existing third party accounts. Or, sign " "up\n" "for a %(site_name)s account and sign in below:" msgstr "" "Por favor inicia sesión con una\n" "cuenta de otra red social. O, regístrese \n" "como usuario de %(site_name)s e inicia sesión a continuación:" #: templates/account/login.html:25 msgid "or" msgstr "o" #: templates/account/login.html:32 #, python-format msgid "" "If you have not created an account yet, then please\n" "sign up first." msgstr "" "Si todavía no has creado una cuenta, entonces por favor\n" "regístrate primero." #: templates/account/login.html:42 templates/account/password_change.html:14 msgid "Forgot Password?" msgstr "¿Olvidaste tu contraseña?" #: templates/account/logout.html:5 templates/account/logout.html:8 #: templates/account/logout.html:17 msgid "Sign Out" msgstr "Cerrar sesión" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "¿Estás seguro de querer cerrar sesión?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary e-mail address (%(email)s)." msgstr "No puedes eliminar tu correo electrónico principal (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation e-mail sent to %(email)s." msgstr "Correo electrónico enviado a %(email)s." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "Has confirmado %(email)s." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed e-mail address %(email)s." msgstr "Correo electrónico eliminado %(email)s." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Has iniciado sesión exitosamente como %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Has cerrado sesión." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Contraseña cambiada con éxito." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Contraseña establecida exitosamente." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary e-mail address set." msgstr "Dirección principal de correo eletrónico establecida." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary e-mail address must be verified." msgstr "Tu dirección principal de correo eletrónico debe ser verificado." #: templates/account/password_change.html:5 #: templates/account/password_change.html:8 #: templates/account/password_change.html:13 #: templates/account/password_reset_from_key.html:4 #: templates/account/password_reset_from_key.html:7 #: templates/account/password_reset_from_key_done.html:4 #: templates/account/password_reset_from_key_done.html:7 msgid "Change Password" msgstr "Cambiar Contraseña" #: templates/account/password_reset.html:6 #: templates/account/password_reset.html:10 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:9 msgid "Password Reset" msgstr "Restablecer Contraseña" #: templates/account/password_reset.html:15 msgid "" "Forgotten your password? Enter your e-mail address below, and we'll send you " "an e-mail allowing you to reset it." msgstr "" "¿Has olvidado tu contraseña? Ingresa tu correo electrónico y te enviaremos " "un correo que te permitirá restablecerla." #: templates/account/password_reset.html:20 msgid "Reset My Password" msgstr "Restablecer mi contraseña" #: templates/account/password_reset.html:23 msgid "Please contact us if you have any trouble resetting your password." msgstr "" "Si tiene alguna dificultad para restablecer tu contraseña, por favor " "contáctanos." #: templates/account/password_reset_done.html:15 msgid "" "We have sent you an e-mail. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Te hemos enviado un correo electrónico. Por favor contáctanos si no recibes " "el correo en unos minutos." #: templates/account/password_reset_from_key.html:7 msgid "Bad Token" msgstr "Hay un problema con el token" #: templates/account/password_reset_from_key.html:11 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "El enlace para restablecer la contraseña es inválido, probablemente porque " "ya ha sido utilizado. Por favor solicita retablecer la contraseña de nuevo." #: templates/account/password_reset_from_key.html:17 msgid "change password" msgstr "cambiar la contraseña" #: templates/account/password_reset_from_key.html:20 #: templates/account/password_reset_from_key_done.html:8 msgid "Your password is now changed." msgstr "Tu contraseña ha cambiado." #: templates/account/password_set.html:5 templates/account/password_set.html:8 #: templates/account/password_set.html:13 msgid "Set Password" msgstr "Establecer contraseña" #: templates/account/signup.html:5 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Regístrate" #: templates/account/signup.html:8 templates/account/signup.html:18 #: templates/socialaccount/signup.html:8 templates/socialaccount/signup.html:19 msgid "Sign Up" msgstr "Regístrate" #: templates/account/signup.html:10 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "" "¿Ya tienes una cuenta? Por favor inicia sesión." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:8 msgid "Sign Up Closed" msgstr "Registro cerrado" #: templates/account/signup_closed.html:10 msgid "We are sorry, but the sign up is currently closed." msgstr "Lo sentimos, en este momento el registro está cerrado." #: templates/account/snippets/already_logged_in.html:5 msgid "Note" msgstr "Nota" #: templates/account/snippets/already_logged_in.html:5 #, python-format msgid "you are already logged in as %(user_display)s." msgstr "has iniciado sesión como %(user_display)s." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:8 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:8 msgid "Verify Your E-mail Address" msgstr "Verifica tu dirección de correo electrónico" #: templates/account/verification_sent.html:10 msgid "" "We have sent an e-mail to you for verification. Follow the link provided to " "finalize the signup process. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Te hemos enviado un correo electrónico para tu verificación. Sigue el enlace " "para completar el proceso de registro. Por favor contáctanos si no recibes " "el correo en unos minutos." #: templates/account/verified_email_required.html:12 msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your e-mail address. " msgstr "" "Esta parte del sitio requiere que verifiquemos que tu eres quien dices ser. " "Para este fin, pedimos que verifiques que eres el dueño de tu correo " "electrónico. " #: templates/account/verified_email_required.html:16 msgid "" "We have sent an e-mail to you for\n" "verification. Please click on the link inside this e-mail. Please\n" "contact us if you do not receive it within a few minutes." msgstr "" "Te hemos enviado un correo electrónico para tu verificación. Por favor, haz " "clic en el enlace de este correo. Por favor contáctanos si no recibes el " "correo en unos minutos." #: templates/account/verified_email_required.html:20 #, python-format msgid "" "Note: you can still change your e-" "mail address." msgstr "" "Nota: todavía puede cambiar tu " "dirección de correo electrónico." #: templates/openid/login.html:9 msgid "OpenID Sign In" msgstr "Iniciar sesión con OpenID" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:8 msgid "Social Network Login Failure" msgstr "Error de inicio de sesión con Red Social" #: templates/socialaccount/authentication_error.html:10 msgid "" "An error occurred while attempting to login via your social network account." msgstr "" "Se produjo un error al intentar iniciar sesión a través de tu cuenta de red " "social." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:8 msgid "Account Connections" msgstr "Conexiones de Cuenta" #: templates/socialaccount/connections.html:11 msgid "" "You can sign in to your account using any of the following third party " "accounts:" msgstr "Puedes iniciar sesión con alguna de las siguientes cuentas externas:" #: templates/socialaccount/connections.html:43 msgid "" "You currently have no social network accounts connected to this account." msgstr "" "Actualmente no tienes ninguna cuenta de red social asociada a esta cuenta." #: templates/socialaccount/connections.html:46 msgid "Add a 3rd Party Account" msgstr "Agregar una cuenta de una red social externa" #: templates/socialaccount/login.html:6 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:8 #, python-format msgid "You are about to connect a new third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:10 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:12 #, python-format msgid "You are about to sign in using a third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Incio de sesión cancelado" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Has decidido cancelar el inicio de sesión a nuestro sitio usando una de tus " "cuentas. Si esto fue un error, inicie sesión." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "La cuenta externa ha sido conectada." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "Esta cuenta externa ya ha sido conetada a otra cuenta." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "La cuenta externa ha sido desconectada." #: templates/socialaccount/signup.html:10 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Estás a punto de utilizar tu cuenta %(provider_name)s para acceder a " "%(site_name)s. Como paso final, por favor completa el siguiente formulario:" #~ msgid "Account" #~ msgstr "Cuenta" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "" #~ "El correo electrónico/usuario y/o la contraseña que especificaste no son " #~ "correctos." #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "" #~ "Los nombres de usuarios pueden contener solamente letras, números, y @/./" #~ "+/-/_." #~ msgid "This username is already taken. Please choose another." #~ msgstr "Este usuario ya está en uso. Por favor elije otro." #, fuzzy #~| msgid "Sign In" #~ msgid "Shopify Sign In" #~ msgstr "Iniciar sesión" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "Has confirmado que %(email)s es una " #~ "dirección de correo electrónico del usuario %(user_display)s." #~ msgid "Thanks for using our site!" #~ msgstr "¡Gracias por utilizar nuestro sitio!" #~ msgid "Confirmation e-mail sent to %(email)s" #~ msgstr "Correo de confirmación enviado a %(email)s" #~ msgid "Delete Password" #~ msgstr "Eliminar Contraseña" #~ msgid "" #~ "You may delete your password since you are currently logged in using " #~ "OpenID." #~ msgstr "Puedes eliminar tu contraseña ya que ingresaste con OpenID." #~ msgid "delete my password" #~ msgstr "eliminar mi contraseña" #~ msgid "Password Deleted" #~ msgstr "Contraseña Eliminada" #~ msgid "Your password has been deleted." #~ msgstr "Tu contraseña fue eliminada." django-allauth-0.47.0/allauth/locale/eu/000077500000000000000000000000001415442050100177725ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/eu/LC_MESSAGES/000077500000000000000000000000001415442050100215575ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/eu/LC_MESSAGES/django.po000066400000000000000000000612511415442050100233660ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: django-allauth\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-12-09 08:41-0600\n" "PO-Revision-Date: 2018-08-29 08:16+0200\n" "Last-Translator: Eneko Illarramendi \n" "Language-Team: Basque \n" "Language: eu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.1.1\n" #: account/adapter.py:45 msgid "Username can not be used. Please use other username." msgstr "" "Erabiltzaile izen hau ezin da erabili. Aukeratu beste erabiltzaile izen bat." #: account/adapter.py:51 msgid "Too many failed login attempts. Try again later." msgstr "Huts egite gehiegi saioa hasterakoan. Saiatu berriro beranduago." #: account/adapter.py:53 msgid "A user is already registered with this e-mail address." msgstr "" "Erabiltzaile batek kontu bat sortu du iada helbide elektroniko honekin." #: account/adapter.py:300 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Pasahitzak gutxienez {0} karaktere izan behar ditu." #: account/apps.py:7 msgid "Accounts" msgstr "Kontuak" #: account/forms.py:59 account/forms.py:413 msgid "You must type the same password each time." msgstr "Pasahitz berdina idatzi behar duzu aldi bakoitzean." #: account/forms.py:92 account/forms.py:381 account/forms.py:498 msgid "Password" msgstr "Pasahitza" #: account/forms.py:93 msgid "Remember Me" msgstr "Gogora nazazue" #: account/forms.py:97 msgid "This account is currently inactive." msgstr "Kontu hau ez dago aktiboa orain." #: account/forms.py:99 msgid "The e-mail address and/or password you specified are not correct." msgstr "Sartutako helbide elektronikoa eta/edo pasahitza ez dira zuzenak." #: account/forms.py:102 msgid "The username and/or password you specified are not correct." msgstr "Sartutako erabiltzailea eta/edo pasahitza ez dira zuzenak." #: account/forms.py:113 account/forms.py:279 account/forms.py:439 #: account/forms.py:517 msgid "E-mail address" msgstr "Helbide elektronikoa" #: account/forms.py:117 account/forms.py:316 account/forms.py:436 #: account/forms.py:512 msgid "E-mail" msgstr "Emaila" #: account/forms.py:120 account/forms.py:123 account/forms.py:269 #: account/forms.py:272 msgid "Username" msgstr "Erabiltzailea" #: account/forms.py:133 msgid "Username or e-mail" msgstr "Erabiltzailea edo emaila" #: account/forms.py:136 msgctxt "field label" msgid "Login" msgstr "Logina" #: account/forms.py:307 msgid "E-mail (again)" msgstr "Emaila (berriro)" #: account/forms.py:311 msgid "E-mail address confirmation" msgstr "Helbide elektronikoaren egiaztapena" #: account/forms.py:319 msgid "E-mail (optional)" msgstr "Emaila (hautazkoa)" #: account/forms.py:359 msgid "You must type the same email each time." msgstr "Email berdina idatzi behar duzu aldi bakoitzean." #: account/forms.py:384 account/forms.py:499 msgid "Password (again)" msgstr "Pasahitza (berriro)" #: account/forms.py:448 msgid "This e-mail address is already associated with this account." msgstr "Helbide elektroniko hau dagoeneko kontu honi lotuta dago." #: account/forms.py:451 msgid "This e-mail address is already associated with another account." msgstr "Helbide elektroniko hau dagoeneko beste kontu bati lotuta dago." #: account/forms.py:453 #, python-format msgid "You cannot add more than %d e-mail addresses." msgstr "Ezin dituzu %d email helbide baino gehiago erabili." #: account/forms.py:478 msgid "Current Password" msgstr "Oraingo pasahitza" #: account/forms.py:480 account/forms.py:570 msgid "New Password" msgstr "Pasahitz berria" #: account/forms.py:481 account/forms.py:571 msgid "New Password (again)" msgstr "Pasahitz berria (berriro)" #: account/forms.py:489 msgid "Please type your current password." msgstr "Mesedez idatzi zure oraingo pasahitza." #: account/forms.py:529 msgid "The e-mail address is not assigned to any user account" msgstr "Helbide elektroniko hau ez dago kontu bati lotuta" #: account/forms.py:592 msgid "The password reset token was invalid." msgstr "Pasahitza berrezartzeko \"token\"-a baliogabea da." #: account/models.py:22 msgid "user" msgstr "erabiltzailea" #: account/models.py:28 account/models.py:83 msgid "e-mail address" msgstr "helbide elektronikoa" #: account/models.py:30 msgid "verified" msgstr "egiaztatuta" #: account/models.py:31 msgid "primary" msgstr "nagusia" #: account/models.py:36 msgid "email address" msgstr "helbide elektronikoa" #: account/models.py:37 msgid "email addresses" msgstr "helbide elektronikoak" #: account/models.py:86 msgid "created" msgstr "sortuta" #: account/models.py:87 msgid "sent" msgstr "bidalita" #: account/models.py:88 socialaccount/models.py:58 msgid "key" msgstr "giltza" #: account/models.py:93 msgid "email confirmation" msgstr "email egiaztapena" #: account/models.py:94 msgid "email confirmations" msgstr "email egiaztapenak" #: socialaccount/adapter.py:26 #, python-format msgid "" "An account already exists with this e-mail address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Kontu bat sortu da iada helbide elektroniko honekin. Mesedez hasi saio berri " "bat kontu honekin eta gero zure %s kontua honi lotu." #: socialaccount/adapter.py:131 msgid "Your account has no password set up." msgstr "Zure kontuak ez du pasahitzik zehaztuta." #: socialaccount/adapter.py:138 msgid "Your account has no verified e-mail address." msgstr "Zure kontuak ez du egiaztatutako emailik." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Sare sozial kontuak" #: socialaccount/models.py:41 socialaccount/models.py:84 msgid "provider" msgstr "zerbitzua" #: socialaccount/models.py:45 msgid "name" msgstr "izena" #: socialaccount/models.py:47 msgid "client id" msgstr "client id" #: socialaccount/models.py:49 msgid "App ID, or consumer key" msgstr "Aplikazioaren ID-a, edo \"consumer key\"-a" #: socialaccount/models.py:52 msgid "secret key" msgstr "\"secret key\"-a" #: socialaccount/models.py:55 msgid "API secret, client secret, or consumer secret" msgstr "\"API secret\"-a, \"client secret\"-a edo \"consumer secret\"-a" #: socialaccount/models.py:58 msgid "Key" msgstr "Giltza" #: socialaccount/models.py:74 msgid "social application" msgstr "aplikazio soziala" #: socialaccount/models.py:75 msgid "social applications" msgstr "aplikazio sozialak" #: socialaccount/models.py:105 msgid "uid" msgstr "uid" #: socialaccount/models.py:107 msgid "last login" msgstr "azken logina" #: socialaccount/models.py:108 msgid "date joined" msgstr "erregistro eguna" #: socialaccount/models.py:109 msgid "extra data" msgstr "datu gehigarriak" #: socialaccount/models.py:113 msgid "social account" msgstr "sare sozial kontua" #: socialaccount/models.py:114 msgid "social accounts" msgstr "sare sozial kontuak" #: socialaccount/models.py:139 msgid "token" msgstr "\"token\"-a" #: socialaccount/models.py:140 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "\"oauth_token\"-a (OAuth1) edo \"access token\"-a (OAuth2)" #: socialaccount/models.py:144 msgid "token secret" msgstr "\"token secret\"-a" #: socialaccount/models.py:145 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "\"oauth_token_secret\"-a (OAuth1) edo \"refresh token\"-a (OAuth2)" #: socialaccount/models.py:148 msgid "expires at" msgstr "iraungitze data" #: socialaccount/models.py:153 msgid "social application token" msgstr "aplikazio sozial \"token\"-a" #: socialaccount/models.py:154 msgid "social application tokens" msgstr "aplikazio sozial \"token\"-ak" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "Profil datu baliogabeak" #: socialaccount/providers/oauth/client.py:85 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Erantzun baliogabea \"%s\"-tik \"request token\"-a eskuratzean." #: socialaccount/providers/oauth/client.py:117 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Erantzun baliogabea \"%s\"-tik \"access token\"-a eskuratzean." #: socialaccount/providers/oauth/client.py:138 #, python-format msgid "No request token saved for \"%s\"." msgstr "Ez dago \"request token\"-ik gordeta \"%s\"-entzat." #: socialaccount/providers/oauth/client.py:189 #, python-format msgid "No access token saved for \"%s\"." msgstr "Ez dago \"access token\"-ik gordeta \"%s\"-entzat." #: socialaccount/providers/oauth/client.py:210 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Ez duzu baliabide pribatuetara sarbiderik: \"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:8 msgid "Account Inactive" msgstr "Kontu ez aktiboa" #: templates/account/account_inactive.html:10 msgid "This account is inactive." msgstr "Kontu hau ez dago aktiboa." #: templates/account/email.html:5 templates/account/email.html:8 msgid "E-mail Addresses" msgstr "Helbide elektronikoak" #: templates/account/email.html:10 msgid "The following e-mail addresses are associated with your account:" msgstr "Helbide elektroniko hauek zure kontuari lotuta daude:" #: templates/account/email.html:24 msgid "Verified" msgstr "Egiaztatuta" #: templates/account/email.html:26 msgid "Unverified" msgstr "Egiaztatu gabe" #: templates/account/email.html:28 msgid "Primary" msgstr "Nagusia" #: templates/account/email.html:34 msgid "Make Primary" msgstr "Nagusia egin" #: templates/account/email.html:35 msgid "Re-send Verification" msgstr "Egiaztapen emaila berbidali" #: templates/account/email.html:36 templates/socialaccount/connections.html:35 msgid "Remove" msgstr "Ezabatu" #: templates/account/email.html:43 msgid "Warning:" msgstr "Adi:" #: templates/account/email.html:43 msgid "" "You currently do not have any e-mail address set up. You should really add " "an e-mail address so you can receive notifications, reset your password, etc." msgstr "" "Oraingoz ez duzu helbide elektronikorik zehaztu. Helbide elektroniko bat " "gehitu beharko zenuke notifikazioak jaso ahal izateko, pasahitza " "berrezartzeko, etab." #: templates/account/email.html:48 msgid "Add E-mail Address" msgstr "Helbide elektronikoa gehitu" #: templates/account/email.html:53 msgid "Add E-mail" msgstr "Emaila gehitu" #: templates/account/email.html:63 msgid "Do you really want to remove the selected e-mail address?" msgstr "Ziur al zaude aukeratutako helbide elektronikoa ezabatu nahi duzula?" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "Kaixo %(site_name)s webgunetik!" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "Mila esker %(site_name)s webgunea erabiltzeagatik!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, python-format msgid "" "You're receiving this e-mail because user %(user_display)s has given your e-" "mail address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "Email hau jaso duzu %(user_display)s erabiltzaileak zure helbide " "elektronikoa bere kontuarekin lotu nahi duelako %(site_domain)s orrialdean.\n" "\n" "Hau zuzena dela baieztatzeko, egin klik hemen: %(activate_url)s" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your E-mail Address" msgstr "Mesedez egiaztatu zure helbide elektronikoa" #: templates/account/email/password_reset_key_message.txt:4 msgid "" "You're receiving this e-mail because you or someone else has requested a " "password for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Email hau jaso duzu zuk edo beste norbaitek pasahitza berrezartzeko eskaera " "egin duelako zure kontuarentzat.\n" "Eskaera zuk egin ez baduzu mezu hau alde batera utzi dezakezu. Edo egin klik " "ondorengo estekan zure pasahitza berrezartzeko." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "Ahaztu baduzu, zure erabiltzaile izena %(username)s da." #: templates/account/email/password_reset_key_subject.txt:3 msgid "Password Reset E-mail" msgstr "Pasahitza berrezartzeko emaila" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm E-mail Address" msgstr "Helbide elektronikoa egiaztatu" #: templates/account/email_confirm.html:16 #, python-format msgid "" "Please confirm that %(email)s is an e-mail " "address for user %(user_display)s." msgstr "" "Mesedez egiaztatu %(email)s " "%(user_display)s erabiltzailearen helbide elektroniko bat dela." #: templates/account/email_confirm.html:20 msgid "Confirm" msgstr "Egiaztatu" #: templates/account/email_confirm.html:27 #, python-format msgid "" "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgstr "" "Egiaztapen esteka hau iraungirik dago edo baliogabea da. Mesedez eskatu egiaztapen email berri bat." #: templates/account/login.html:6 templates/account/login.html:10 #: templates/account/login.html:43 msgid "Sign In" msgstr "Saioa hasi" #: templates/account/login.html:15 #, python-format msgid "" "Please sign in with one\n" "of your existing third party accounts. Or, sign " "up\n" "for a %(site_name)s account and sign in below:" msgstr "" "Mesedez hasi saioa lotutako sare sozial kontu bat\n" "erabiliz, edo sortu kontu bat\n" "%(site_name)s webgunean eta saioa hasi hemen:" #: templates/account/login.html:25 msgid "or" msgstr "edo" #: templates/account/login.html:32 #, python-format msgid "" "If you have not created an account yet, then please\n" "sign up first." msgstr "" "Oraindik kontu bat sortu ez baduzu, mesedez\n" "sortu kontu bat lehenik." #: templates/account/login.html:42 templates/account/password_change.html:14 msgid "Forgot Password?" msgstr "Pasahitza ahaztu duzu?" #: templates/account/logout.html:5 templates/account/logout.html:8 #: templates/account/logout.html:17 msgid "Sign Out" msgstr "Saioa amaitu" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Ziur al zaude saioa amaitu nahi duzula?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary e-mail address (%(email)s)." msgstr "Ezin duzu zure helbide elektroniko nagusia ezabatu (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation e-mail sent to %(email)s." msgstr "Egiaztapen emaila bidali da %(email)s helbidera." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "%(email)s emaila egiaztatu duzu." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed e-mail address %(email)s." msgstr "%(email)s helbide elektronikoa ezabatu da." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "%(name)s bezala hasi duzu saioa." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Saioa amaitu duzu." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Pasahitza behar bezala aldatu da." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Pasahitza behar bezala zehaztu da." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary e-mail address set." msgstr "Helbide elektroniko nagusia zehaztu da." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary e-mail address must be verified." msgstr "Zure email nagusiak egiaztatuta egon behar du." #: templates/account/password_change.html:5 #: templates/account/password_change.html:8 #: templates/account/password_change.html:13 #: templates/account/password_reset_from_key.html:4 #: templates/account/password_reset_from_key.html:7 #: templates/account/password_reset_from_key_done.html:4 #: templates/account/password_reset_from_key_done.html:7 msgid "Change Password" msgstr "Pasahitza aldatu" #: templates/account/password_reset.html:6 #: templates/account/password_reset.html:10 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:9 msgid "Password Reset" msgstr "Pasahitza berrezarri" #: templates/account/password_reset.html:15 msgid "" "Forgotten your password? Enter your e-mail address below, and we'll send you " "an e-mail allowing you to reset it." msgstr "" "Zure pasahitza ahaztu al duzu? Idatzi zure helbide elektronikoa hemen eta " "pasahitza berrezartzeko email bat bidaliko dizugu." #: templates/account/password_reset.html:20 msgid "Reset My Password" msgstr "Nire pasahitza berrezarri" #: templates/account/password_reset.html:23 msgid "Please contact us if you have any trouble resetting your password." msgstr "" "Mesedez jarri gurekin kontaktuan zure pasahitza berrezartzeko arazorik " "baduzu." #: templates/account/password_reset_done.html:15 msgid "" "We have sent you an e-mail. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Email bat bidali dizugu. Mesedez jarri gurekin kontaktuan hurrengo " "minutuetan jasotzen ez baduzu." #: templates/account/password_reset_from_key.html:7 msgid "Bad Token" msgstr "Token baliogabea" #: templates/account/password_reset_from_key.html:11 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Pasahitza berrezartzeko esteka baliogabea da, beharbada lehendik ere erabili " "delako. Mesedez eskatu pasahitza " "berrezartzeko email berri bat." #: templates/account/password_reset_from_key.html:17 msgid "change password" msgstr "pasahitza aldatu" #: templates/account/password_reset_from_key.html:20 #: templates/account/password_reset_from_key_done.html:8 msgid "Your password is now changed." msgstr "Zure pasahitza aldatuta dago orain." #: templates/account/password_set.html:5 templates/account/password_set.html:8 #: templates/account/password_set.html:13 msgid "Set Password" msgstr "Pasahitza zehaztu" #: templates/account/signup.html:5 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Kontua sortu" #: templates/account/signup.html:8 templates/account/signup.html:18 #: templates/socialaccount/signup.html:8 templates/socialaccount/signup.html:19 msgid "Sign Up" msgstr "Kontua sortu" #: templates/account/signup.html:10 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "" "Lehendik kontu bat sortua duzu? Saioa hasi " "orduan." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:8 msgid "Sign Up Closed" msgstr "Ezin da konturik sortu iada" #: templates/account/signup_closed.html:10 msgid "We are sorry, but the sign up is currently closed." msgstr "Sentitzen dugu baina ezin da kontu berririk sortu." #: templates/account/snippets/already_logged_in.html:5 msgid "Note" msgstr "Oharra" #: templates/account/snippets/already_logged_in.html:5 #, python-format msgid "you are already logged in as %(user_display)s." msgstr "lehendik saioa hasita duzu %(user_display)s bezala." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:8 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:8 msgid "Verify Your E-mail Address" msgstr "Zure helbide elektronikoa egiaztatu" #: templates/account/verification_sent.html:10 msgid "" "We have sent an e-mail to you for verification. Follow the link provided to " "finalize the signup process. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Email bat bidali dizugu zure helbidea egiaztatzeko. Mesedez egin klik bertan " "aurkituko duzun estekan kontua sortzeko prozesua amaitzeko, edo jarri " "gurekin kontaktuan hurrengo minutuetan emailik jasotzen ez baduzu." #: templates/account/verified_email_required.html:12 msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your e-mail address. " msgstr "" "Webguneko atal honek zuk diozuna zarela egiaztatzea\n" "eskatzen digu. Honetarako zure helbide elektronikoa\n" "egiaztatzea beharrezkoa da. " #: templates/account/verified_email_required.html:16 msgid "" "We have sent an e-mail to you for\n" "verification. Please click on the link inside this e-mail. Please\n" "contact us if you do not receive it within a few minutes." msgstr "" "Email bat bidali dizugu zure helbidea egiaztatzeko.\n" "Mesedez egin klik bertan aurkituko duzun estekan,\n" "edo jarri gurekin kontaktuan hurrengo minutuetan\n" "emailik jasotzen ez baduzu." #: templates/account/verified_email_required.html:20 #, python-format msgid "" "Note: you can still change your e-" "mail address." msgstr "" "Oharra: oraindik zure helbide " "elektronikoa aldatu dezakezu." #: templates/openid/login.html:9 msgid "OpenID Sign In" msgstr "OpenID-rekin sartu" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:8 msgid "Social Network Login Failure" msgstr "Arazoak sare sozialarekin logina egitean" #: templates/socialaccount/authentication_error.html:10 msgid "" "An error occurred while attempting to login via your social network account." msgstr "" "Arazoren bat izan da zure sare sozial kontua erabiltzen saioa hasteko " "ahaleginean." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:8 msgid "Account Connections" msgstr "Lotutako kontuak" #: templates/socialaccount/connections.html:11 msgid "" "You can sign in to your account using any of the following third party " "accounts:" msgstr "" "Ondorengo zerbitzu hauetako edozein erabili dezakezu zure kontuan sartzeko:" #: templates/socialaccount/connections.html:43 msgid "" "You currently have no social network accounts connected to this account." msgstr "Oraingoz ez duzu sare sozial konturik lotu kontu honekin." #: templates/socialaccount/connections.html:46 msgid "Add a 3rd Party Account" msgstr "Sare sozial kontu bat gehitu" #: templates/socialaccount/login.html:6 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:8 #, python-format msgid "You are about to connect a new third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:10 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:12 #, python-format msgid "You are about to sign in using a third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Baliogabetutako logina" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Lotutako kontu batekin saioa hasteko saiakera bertan behera utzi duzu. " "Oharkabean gertatu bada, mesedez saioa hasi " "berriro." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "Sare sozial kontua behar bezala lotu da." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "Sare sozial kontua dagoeneko beste kontu bati lotuta dago." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Sare sozial kontu honekin lotura ezabatu da." #: templates/socialaccount/signup.html:10 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Zure %(provider_name)s kontua erabiltzear zaude %(site_name)s\n" "webgunean saioa hasteko. Azken pausu bezala, mesedez osa ezazu\n" "formulario hau:" #~ msgid "Account" #~ msgstr "Kontua" django-allauth-0.47.0/allauth/locale/fa/000077500000000000000000000000001415442050100177475ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/fa/LC_MESSAGES/000077500000000000000000000000001415442050100215345ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/fa/LC_MESSAGES/django.po000066400000000000000000000722541415442050100233500ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-12-09 08:41-0600\n" "PO-Revision-Date: 2020-06-14 17:00-0000\n" "Last-Translator: Mohammad Ali Amini \n" "Language-Team: \n" "Language: fa\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.7.4\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: account/adapter.py:45 msgid "Username can not be used. Please use other username." msgstr "نام‌کاربری قابل استفاده نیست. لطفا نام‌کاربری دیگری استفاده کن." #: account/adapter.py:51 msgid "Too many failed login attempts. Try again later." msgstr "خیلی زیاد تلاش ناموفق کردی، لطفا بعدا ازنو سعی کن." #: account/adapter.py:53 msgid "A user is already registered with this e-mail address." msgstr "یک کاربر ازقبل با این نشانی رایانامه ثبت شده." #: account/adapter.py:300 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "گذرواژه باید حداقل {0} کاراکتر باشد." #: account/apps.py:7 #, fuzzy msgid "Accounts" msgstr "حساب‌ها" #: account/forms.py:59 account/forms.py:413 msgid "You must type the same password each time." msgstr "هربار باید گذرواژه‌ی یکسانی وارد کنی." #: account/forms.py:92 account/forms.py:381 account/forms.py:498 msgid "Password" msgstr "گذرواژه" #: account/forms.py:93 msgid "Remember Me" msgstr "مرا به یادآور" #: account/forms.py:97 msgid "This account is currently inactive." msgstr "اکنون این حساب غیرفعال است." #: account/forms.py:99 msgid "The e-mail address and/or password you specified are not correct." msgstr "نشانی رایانامه یا گذرواژه نادرست است." #: account/forms.py:102 msgid "The username and/or password you specified are not correct." msgstr "نام‌کاربری یا گذرواژه نادرست است." #: account/forms.py:113 account/forms.py:279 account/forms.py:439 #: account/forms.py:517 msgid "E-mail address" msgstr "نشانی رایانامه" #: account/forms.py:117 account/forms.py:316 account/forms.py:436 #: account/forms.py:512 msgid "E-mail" msgstr "رایانامه" #: account/forms.py:120 account/forms.py:123 account/forms.py:269 #: account/forms.py:272 msgid "Username" msgstr "نام‌کاربری" #: account/forms.py:133 msgid "Username or e-mail" msgstr "نام‌کاربری ویا رایانامه" #: account/forms.py:136 msgctxt "field label" msgid "Login" msgstr "ورود" #: account/forms.py:307 #, fuzzy #| msgid "E-mail (optional)" msgid "E-mail (again)" msgstr "رایانامه (ازنو)" #: account/forms.py:311 #, fuzzy #| msgid "email confirmation" msgid "E-mail address confirmation" msgstr "تاییدیه‌ی نشانی رایانامه" #: account/forms.py:319 msgid "E-mail (optional)" msgstr "رایانامه (اختیاری)" #: account/forms.py:359 #, fuzzy #| msgid "You must type the same password each time." msgid "You must type the same email each time." msgstr "هربار باید رایانامه‌ی یکسانی وارد کنی." #: account/forms.py:384 account/forms.py:499 msgid "Password (again)" msgstr "گذرواژه (ازنو)" #: account/forms.py:448 #, fuzzy #| msgid "This e-mail address is already associated with another account." msgid "This e-mail address is already associated with this account." msgstr "این نشانی رایانامه ازقبل به این حساب وصل شده." #: account/forms.py:451 msgid "This e-mail address is already associated with another account." msgstr "این نشانی رایانامه ازقبل به حساب دیگری وصل شده." #: account/forms.py:453 #, fuzzy, python-format #| msgid "Your account has no verified e-mail address." msgid "You cannot add more than %d e-mail addresses." msgstr "حساب‌ات هیچ رایانامه‌ي تایید‌شده‌ای ندارد." #: account/forms.py:478 msgid "Current Password" msgstr "گذرواژه کنونی" #: account/forms.py:480 account/forms.py:570 msgid "New Password" msgstr "گذرواژه جدید" #: account/forms.py:481 account/forms.py:571 msgid "New Password (again)" msgstr "گذرواژه جدید (ازنو)" #: account/forms.py:489 msgid "Please type your current password." msgstr "لطفا گذرواژه کنونی‌‌ات را وارد کن." #: account/forms.py:529 msgid "The e-mail address is not assigned to any user account" msgstr "این نشانی رایانامه به هیچ حساب کاربری‌ای منتسب نشده." #: account/forms.py:592 msgid "The password reset token was invalid." msgstr "توکن بازنشانی گذرواژه نامعتبر است." #: account/models.py:22 msgid "user" msgstr "کاربر" #: account/models.py:28 account/models.py:83 msgid "e-mail address" msgstr "نشانی رایانامه" #: account/models.py:30 msgid "verified" msgstr "تاییدشده" #: account/models.py:31 msgid "primary" msgstr "اصلی" #: account/models.py:36 msgid "email address" msgstr "نشانی رایانامه" #: account/models.py:37 msgid "email addresses" msgstr "نشانی‌های رایانامه" #: account/models.py:86 msgid "created" msgstr "ایجاد‌شده" #: account/models.py:87 msgid "sent" msgstr "ارسال شد" #: account/models.py:88 socialaccount/models.py:58 msgid "key" msgstr "کلید" #: account/models.py:93 msgid "email confirmation" msgstr "تاییدیه‌ی رایانامه" #: account/models.py:94 msgid "email confirmations" msgstr "تاییدیه‌های رایانامه" #: socialaccount/adapter.py:26 #, python-format msgid "" "An account already exists with this e-mail address. Please sign in to that " "account first, then connect your %s account." msgstr "" "یه حساب‌کاربری با این نشانی رایانامه وجود دارد. لطفا نخست وارد آن شو، سپس " "حساب %s ات را بهش وصل کن." #: socialaccount/adapter.py:131 msgid "Your account has no password set up." msgstr "هیچ گذرواژه‌ای برای حساب‌ات نهاده نشده." #: socialaccount/adapter.py:138 msgid "Your account has no verified e-mail address." msgstr "حساب‌ات هیچ رایانامه‌ي تایید‌شده‌ای ندارد." #: socialaccount/apps.py:7 #, fuzzy msgid "Social Accounts" msgstr "حساب‌های اجتماعی" #: socialaccount/models.py:41 socialaccount/models.py:84 msgid "provider" msgstr "فراهم‌کننده" #: socialaccount/models.py:45 #, fuzzy msgid "name" msgstr "نام" #: socialaccount/models.py:47 msgid "client id" msgstr "شناسه مشتری" #: socialaccount/models.py:49 msgid "App ID, or consumer key" msgstr "شناسه اپ، یا کلید مصرف‌کننده" #: socialaccount/models.py:52 msgid "secret key" msgstr "کلید محرمانه" #: socialaccount/models.py:55 msgid "API secret, client secret, or consumer secret" msgstr "رمز رابک (رابط برنامه‌ی کاربردی API)، رمز مشتری، یا رمز مصرف‌کننده" #: socialaccount/models.py:58 #, fuzzy msgid "Key" msgstr "کلید" #: socialaccount/models.py:74 msgid "social application" msgstr "اپلیکیشن اجتماعی" #: socialaccount/models.py:75 msgid "social applications" msgstr "اپلیکیشن‌های اجتماعی" #: socialaccount/models.py:105 msgid "uid" msgstr "شناسه‌کاربری" #: socialaccount/models.py:107 msgid "last login" msgstr "آخرین ورود" #: socialaccount/models.py:108 msgid "date joined" msgstr "تاریخ پیوست‌شده" #: socialaccount/models.py:109 msgid "extra data" msgstr "داده اضافی" #: socialaccount/models.py:113 msgid "social account" msgstr "حساب اجتماعی" #: socialaccount/models.py:114 msgid "social accounts" msgstr "حساب‌های اجتماعی" #: socialaccount/models.py:139 msgid "token" msgstr "توکن" #: socialaccount/models.py:140 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "\"oauth_token\" (OAuth1) یا توکن دسترسی (OAuth2)" #: socialaccount/models.py:144 msgid "token secret" msgstr "رمز توکن" #: socialaccount/models.py:145 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "\"oauth_token_secret\" (OAuth1) یا توکن تازه‌سازی (OAuth2)" #: socialaccount/models.py:148 msgid "expires at" msgstr "انقضا" #: socialaccount/models.py:153 msgid "social application token" msgstr "توکن اپلیکشن اجتماعی" #: socialaccount/models.py:154 msgid "social application tokens" msgstr "توکن‌های اپلیکیشن اجتماعی" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "داده نامعتبر نمایه" #: socialaccount/providers/oauth/client.py:85 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "پاسخ نامعتبر هنگام دریافت توکن درخواست از \"%s\"." #: socialaccount/providers/oauth/client.py:117 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "پاسخ نامعتبر هنگام دریافت توکن دسترسی از \"%s\"" #: socialaccount/providers/oauth/client.py:138 #, python-format msgid "No request token saved for \"%s\"." msgstr "توکن درخواست‌ْای برای \"%s\" ذخیره نشده." #: socialaccount/providers/oauth/client.py:189 #, python-format msgid "No access token saved for \"%s\"." msgstr "توکن دسترسی‌ای برای \"%s\" ذخیره نشده." #: socialaccount/providers/oauth/client.py:210 #, python-format msgid "No access to private resources at \"%s\"." msgstr "دسترسی به منابع خصوصی \"%s\" وجود ندارد." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:8 msgid "Account Inactive" msgstr "حساب غیرفعال" #: templates/account/account_inactive.html:10 msgid "This account is inactive." msgstr "این حساب‌کاربری غیرفعال است." #: templates/account/email.html:5 templates/account/email.html:8 msgid "E-mail Addresses" msgstr "نشانی‌های رایانامه" #: templates/account/email.html:10 msgid "The following e-mail addresses are associated with your account:" msgstr "نشانی‌های رایانامه زیر به حساب‌ات متصل شده‌اند:" #: templates/account/email.html:24 msgid "Verified" msgstr "تایید‌شده" #: templates/account/email.html:26 msgid "Unverified" msgstr "تایید‌نشده" #: templates/account/email.html:28 msgid "Primary" msgstr "اصلی" #: templates/account/email.html:34 msgid "Make Primary" msgstr "اصلی کردن" #: templates/account/email.html:35 msgid "Re-send Verification" msgstr "بازارسال تاییدیه" #: templates/account/email.html:36 templates/socialaccount/connections.html:35 msgid "Remove" msgstr "حذف" #: templates/account/email.html:43 msgid "Warning:" msgstr "هشدار:" #: templates/account/email.html:43 msgid "" "You currently do not have any e-mail address set up. You should really add " "an e-mail address so you can receive notifications, reset your password, etc." msgstr "" "اکنون هیچ نشانی رایانامه‌ی نهادیده‌ای نداری. درواقع باید یه نشانی رایانامه " "بافزایی تا بتوانی اعلان‌ها، بازنشان گذرواژه و غیره را دریافت کنی." #: templates/account/email.html:48 msgid "Add E-mail Address" msgstr "افزودن نشانی رایانامه" #: templates/account/email.html:53 msgid "Add E-mail" msgstr "افزودن رایانامه" #: templates/account/email.html:63 msgid "Do you really want to remove the selected e-mail address?" msgstr "واقعا می‌خواهی نشانی رایانامه‌ی انتخاب‌شده را حذف کنی؟" #: templates/account/email/base_message.txt:1 #, fuzzy, python-format #| msgid "" #| "Thank you from %(site_name)s!\n" #| "%(site_domain)s" msgid "Hello from %(site_name)s!" msgstr "" "سپاسگزارت %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "سپاس‌گزاریم برای استفاده از %(site_name)s.\n" "‏%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because user %(user_display)s at " #| "%(site_domain)s has given yours as an e-mail address to connect their " #| "account.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s\n" msgid "" "You're receiving this e-mail because user %(user_display)s has given your e-" "mail address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "سلام،\n" "\n" "این رایانامه را دریافت کردی چون کاربر %(user_display)s نشانی رایانامه‌ات را " "برای اتصال به حساب‌اش در %(site_name)s داده.\n" "\n" "برای تایید درستی این به ‌%(activate_url)s برو.\n" #: templates/account/email/email_confirmation_subject.txt:3 #, fuzzy #| msgid "Confirm E-mail Address" msgid "Please Confirm Your E-mail Address" msgstr "تایید نشانی رایانامه" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy msgid "" "You're receiving this e-mail because you or someone else has requested a " "password for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "سلام،\n" "\n" "این رایانامه را دریافت کرده‌ای چون برای حساب کاربری‌ات در %(site_name)s، از " "جانب خودت یا کسی دیگر، یه گذرواژه درخواست شده.\n" "برای بازنشانی گذرواژه پیوند زیر را دنبال کن. وگرنه چشم‌پوشی از این هنگامی که " "خودت هم درخواست نکردی می‌تواند امن باشد." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "در صورت فراموشی، نام‌کاربری‌ات %(username)s است." #: templates/account/email/password_reset_key_subject.txt:3 msgid "Password Reset E-mail" msgstr "رایانامه‌ی بازنشانی گذرواژه" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm E-mail Address" msgstr "تایید نشانی رایانامه" #: templates/account/email_confirm.html:16 #, python-format msgid "" "Please confirm that %(email)s is an e-mail " "address for user %(user_display)s." msgstr "" "لطفا تایید کن که %(email)s یه نشانی " "رایانامه برای کاربر %(user_display)s است." #: templates/account/email_confirm.html:20 msgid "Confirm" msgstr "تایید" #: templates/account/email_confirm.html:27 #, python-format msgid "" "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgstr "" "این پیوند تاییدیه رایانامه باطل‌شده ویا نامعتبر است. لطفا یه تاییدیه جدید رایانامه درخواست کن." #: templates/account/login.html:6 templates/account/login.html:10 #: templates/account/login.html:43 msgid "Sign In" msgstr "ورود" #: templates/account/login.html:15 #, python-format msgid "" "Please sign in with one\n" "of your existing third party accounts. Or, sign " "up\n" "for a %(site_name)s account and sign in below:" msgstr "" "لطفا با یکی از حساب‌های شخص سوم موجودت وارد شو. یا در %(site_name)sثبت‌نام کن و از زیر وارد شو:" #: templates/account/login.html:25 msgid "or" msgstr "یا" #: templates/account/login.html:32 #, python-format msgid "" "If you have not created an account yet, then please\n" "sign up first." msgstr "" "اگر هنوز یه حساب نساختی، پس لطفا نخست ثبت‌نام " "کن." #: templates/account/login.html:42 templates/account/password_change.html:14 msgid "Forgot Password?" msgstr "گذرواژه‌ات را فراموش کرده‌ای؟" #: templates/account/logout.html:5 templates/account/logout.html:8 #: templates/account/logout.html:17 msgid "Sign Out" msgstr "خروج" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "مطمئنی می‌خواهی خارج شوی؟" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary e-mail address (%(email)s)." msgstr "نمی‌توانی نشانی رایانامه‌ی اصلی‌ات (%(email)s) را حذف کنی." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation e-mail sent to %(email)s." msgstr "رایانامه‌ی تاییدیه به %(email)s فرستاده شد." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "نشانی رایانامه‌ %(email)s را تایید کرده‌ای." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed e-mail address %(email)s." msgstr "نشانی رایانامه %(email)s حذف شد." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "با %(name)s باموفقیت وارد شدی." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "خارج شده‌ای." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "گذرواژه باموفقیت تغییر کرد." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "گذرواژه باموفقیت نهاده شد." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary e-mail address set." msgstr "نشانی رانامه اصلی نهاده شد." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary e-mail address must be verified." msgstr "نشانی رایانامه‌ی اصلی‌ات باید تاییدشده باشد." #: templates/account/password_change.html:5 #: templates/account/password_change.html:8 #: templates/account/password_change.html:13 #: templates/account/password_reset_from_key.html:4 #: templates/account/password_reset_from_key.html:7 #: templates/account/password_reset_from_key_done.html:4 #: templates/account/password_reset_from_key_done.html:7 msgid "Change Password" msgstr "تغییر گذرواژه" #: templates/account/password_reset.html:6 #: templates/account/password_reset.html:10 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:9 msgid "Password Reset" msgstr "بازنشانی گذرواژه" #: templates/account/password_reset.html:15 msgid "" "Forgotten your password? Enter your e-mail address below, and we'll send you " "an e-mail allowing you to reset it." msgstr "" "گذرواژه‌ات را فراموش کرده‌ای؟ نشانی رایانامه‌ات را در زیر درج کن؛ ما رایانامه‌ی " "بازنشانی گذرواژه را برایت خواهیم فرستاد." #: templates/account/password_reset.html:20 msgid "Reset My Password" msgstr "درخواست بازنشانی" #: templates/account/password_reset.html:23 msgid "Please contact us if you have any trouble resetting your password." msgstr "اگر مشکلی در بازنشانی گذرواژه‌ات داری، لطفا با ما تماس بگیر." #: templates/account/password_reset_done.html:15 msgid "" "We have sent you an e-mail. Please contact us if you do not receive it " "within a few minutes." msgstr "" "بهت یه رایانامه فرستادیم. اگر تا چند دقیقه‌ی دیگر دریافتش نکردی باهامون تماس " "بگیر." #: templates/account/password_reset_from_key.html:7 msgid "Bad Token" msgstr "توکن نادرست" #: templates/account/password_reset_from_key.html:11 #, fuzzy, python-format #| msgid "" #| "The password reset link was invalid, possibly because it has already been " #| "used. Please request a new password " #| "reset." msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "پیوند بازنشانی گذرواژه نادرست است؛ شاید قبلا استفاده شده. لطفا یه بازنشان جدید گذرواژهدرخواست کن." #: templates/account/password_reset_from_key.html:17 msgid "change password" msgstr "تغییر گذرواژه" #: templates/account/password_reset_from_key.html:20 #: templates/account/password_reset_from_key_done.html:8 msgid "Your password is now changed." msgstr "گذرواژه‌ات اکنون تغییر کرد." #: templates/account/password_set.html:5 templates/account/password_set.html:8 #: templates/account/password_set.html:13 msgid "Set Password" msgstr "نهادن گذرواژه" #: templates/account/signup.html:5 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "ثبت‌نام" #: templates/account/signup.html:8 templates/account/signup.html:18 #: templates/socialaccount/signup.html:8 templates/socialaccount/signup.html:19 msgid "Sign Up" msgstr "ثبت نام" #: templates/account/signup.html:10 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "ازقبل یه حساب داری؟ پس لطفا ورود کن." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:8 msgid "Sign Up Closed" msgstr "توقف ثبت‌نام" #: templates/account/signup_closed.html:10 msgid "We are sorry, but the sign up is currently closed." msgstr "متاسفیم، ولی اکنون ثبت‌نام متوقف شده." #: templates/account/snippets/already_logged_in.html:5 msgid "Note" msgstr "توجه" #: templates/account/snippets/already_logged_in.html:5 #, python-format msgid "you are already logged in as %(user_display)s." msgstr "ازقبل با %(user_display)s وارد شده‌ای." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:8 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:8 msgid "Verify Your E-mail Address" msgstr "تایید نشانی رایانامه" #: templates/account/verification_sent.html:10 msgid "" "We have sent an e-mail to you for verification. Follow the link provided to " "finalize the signup process. Please contact us if you do not receive it " "within a few minutes." msgstr "" "یه رایانامه تاییدیه بهت فرستادیم. پیوند درونش را برای کامل کردن فرایند " "ثبت‌نام دنبال کن. اگر تا چند دقیقه‌ی دیگر دریافتش نکردی، لطفا با ما تماس بگیر." #: templates/account/verified_email_required.html:12 msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your e-mail address. " msgstr "" "این بخش از سایت نیاز دارد تایید کنیم شما کسی که ادعا کرده‌‌ای هستی.برای همین، " "نیازد داریم مالکیتت بر نشانی رایانامه‌ات را تایید کنی." #: templates/account/verified_email_required.html:16 msgid "" "We have sent an e-mail to you for\n" "verification. Please click on the link inside this e-mail. Please\n" "contact us if you do not receive it within a few minutes." msgstr "" "ما یه رایانامه تاییدیه بهت فرستادیم؛ لطفا روی پیوند درونش کلیک کن. اگر تا " "دقایقی دیگر دریافتش نکردی با ما تماس بگیر." #: templates/account/verified_email_required.html:20 #, python-format msgid "" "Note: you can still change your e-" "mail address." msgstr "" "توجه: هنوز می‌توانی تعویض نشانی " "رایانامه کنی." #: templates/openid/login.html:9 msgid "OpenID Sign In" msgstr "ورودبا OpenID" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:8 msgid "Social Network Login Failure" msgstr "ناموفق در ورود با شبکه اجتماعی" #: templates/socialaccount/authentication_error.html:10 msgid "" "An error occurred while attempting to login via your social network account." msgstr "یه خطا هنگام سعی برای ورود با حساب شبکه‌ی اجتماعی‌ات رخ داد." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:8 msgid "Account Connections" msgstr "اتصال‌های حساب" #: templates/socialaccount/connections.html:11 msgid "" "You can sign in to your account using any of the following third party " "accounts:" msgstr "با هریک از حساب‌های شخص سوم زیر می‌توانی به حساب‌ات وارد شوی:" #: templates/socialaccount/connections.html:43 msgid "" "You currently have no social network accounts connected to this account." msgstr "اکنون هیچ حساب شبکه‌ی اجتماعی‌ای به این حساب متصل نشده." #: templates/socialaccount/connections.html:46 msgid "Add a 3rd Party Account" msgstr "افزودن یه حساب سوم شخص" #: templates/socialaccount/login.html:6 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:8 #, python-format msgid "You are about to connect a new third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:10 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:12 #, python-format msgid "You are about to sign in using a third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "لغو ورود" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "ورودت به سایت‌مان با یکی از حساب‌هایت را لغو کردی. اگر اشتباهی شده، لطفا اقدام " "به ورود کن." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "حساب اجتماعی‌اِ متصل شد." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "حساب اجتماعی‌اِ به یه حساب دیگر متصل شده." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "حساب اجتماعی‌اِ قطع‌ارتباط شد." #: templates/socialaccount/signup.html:10 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "چند قدمی ورود به %(site_name)s با حساب‌ات %(provider_name)s هستی. در گام آخر، " "لطفا فرم زیر را کامل کن:" #~ msgid "Account" #~ msgstr "حساب" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "اطلاعات داده شده درست نیست." #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "نام‌کاربری تنها می‌تواند شامل حروف، اعداد، و @/./+/-/_. باشد" #~ msgid "This username is already taken. Please choose another." #~ msgstr "این نام‌کاربری قبلا گرفته شده. لطفا یکی دیگر انتخاب کن." #, fuzzy #~| msgid "Sign In" #~ msgid "Shopify Sign In" #~ msgstr "ورود با Shopify" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "تایید کرده‌ای که %(email)s یه نشانی " #~ "رایانامه برای کاربر %(user_display)s است." django-allauth-0.47.0/allauth/locale/fi/000077500000000000000000000000001415442050100177575ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/fi/LC_MESSAGES/000077500000000000000000000000001415442050100215445ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/fi/LC_MESSAGES/django.po000066400000000000000000000623401415442050100233530ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-12-09 08:41-0600\n" "PO-Revision-Date: 2020-10-15 19:56+0200\n" "Last-Translator: Anonymous User \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Translated-Using: django-rosetta 0.7.6\n" #: account/adapter.py:45 msgid "Username can not be used. Please use other username." msgstr "Käyttäjänimeä ei voi käyttää. Valitse toinen käyttäjänimi." #: account/adapter.py:51 msgid "Too many failed login attempts. Try again later." msgstr "" "Liian monta virheellistä kirjautumisyritystä. Yritä myöhemmin uudelleen." #: account/adapter.py:53 msgid "A user is already registered with this e-mail address." msgstr "Tämä sähköpostiosoite on jo käytössä." #: account/adapter.py:300 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Salasanan tulee olla vähintään {0} merkkiä pitkä." #: account/apps.py:7 msgid "Accounts" msgstr "Tili" #: account/forms.py:59 account/forms.py:413 msgid "You must type the same password each time." msgstr "Salasanojen tulee olla samat." #: account/forms.py:92 account/forms.py:381 account/forms.py:498 msgid "Password" msgstr "Salasana" #: account/forms.py:93 msgid "Remember Me" msgstr "Muista minut" #: account/forms.py:97 msgid "This account is currently inactive." msgstr "Tämä tili on poistettu käytöstä." #: account/forms.py:99 msgid "The e-mail address and/or password you specified are not correct." msgstr "Annettu sähköposti tai salasana ei ole oikein." #: account/forms.py:102 msgid "The username and/or password you specified are not correct." msgstr "Annettu käyttäjänimi tai salasana ei ole oikein." #: account/forms.py:113 account/forms.py:279 account/forms.py:439 #: account/forms.py:517 msgid "E-mail address" msgstr "Sähköpostiosoite" #: account/forms.py:117 account/forms.py:316 account/forms.py:436 #: account/forms.py:512 msgid "E-mail" msgstr "Sähköposti" #: account/forms.py:120 account/forms.py:123 account/forms.py:269 #: account/forms.py:272 msgid "Username" msgstr "Käyttäjänimi" #: account/forms.py:133 msgid "Username or e-mail" msgstr "Käyttäjänimi tai sähköposti" #: account/forms.py:136 msgctxt "field label" msgid "Login" msgstr "Käyttäjätunnus" #: account/forms.py:307 #, fuzzy #| msgid "E-mail (optional)" msgid "E-mail (again)" msgstr "Sähköpostiosoite (valinnainen)" #: account/forms.py:311 #, fuzzy #| msgid "email confirmation" msgid "E-mail address confirmation" msgstr "sähköpostivarmistus" #: account/forms.py:319 msgid "E-mail (optional)" msgstr "Sähköpostiosoite (valinnainen)" #: account/forms.py:359 #, fuzzy #| msgid "You must type the same password each time." msgid "You must type the same email each time." msgstr "Salasanojen tulee olla samat." #: account/forms.py:384 account/forms.py:499 msgid "Password (again)" msgstr "Salasana (uudestaan)" #: account/forms.py:448 msgid "This e-mail address is already associated with this account." msgstr "Sähköpostiosoite on jo liitetty tähän tilliin." #: account/forms.py:451 msgid "This e-mail address is already associated with another account." msgstr "Sähköpostiosoite on jo liitetty toiseen tiliin." #: account/forms.py:453 #, fuzzy, python-format #| msgid "Your account has no verified e-mail address." msgid "You cannot add more than %d e-mail addresses." msgstr "Tiliisi ei ole liitetty vahvistettua sähköpostiosoitetta." #: account/forms.py:478 msgid "Current Password" msgstr "Nykyinen salasana" #: account/forms.py:480 account/forms.py:570 msgid "New Password" msgstr "Uusi salasana" #: account/forms.py:481 account/forms.py:571 msgid "New Password (again)" msgstr "Uusi salasana (uudestaan)" #: account/forms.py:489 msgid "Please type your current password." msgstr "Ole hyvä ja anna nykyinen salasanasi." #: account/forms.py:529 msgid "The e-mail address is not assigned to any user account" msgstr "Sähköpostiosoite ei vastaa yhtäkään käyttäjätiliä." #: account/forms.py:592 msgid "The password reset token was invalid." msgstr "Salasanan uusimistarkiste ei kelpaa." #: account/models.py:22 msgid "user" msgstr "käyttäjä" #: account/models.py:28 account/models.py:83 msgid "e-mail address" msgstr "sähköpostiosoite" #: account/models.py:30 msgid "verified" msgstr "vahvistettu" #: account/models.py:31 msgid "primary" msgstr "ensisijainen" #: account/models.py:36 msgid "email address" msgstr "sähköpostiosoite" #: account/models.py:37 msgid "email addresses" msgstr "sähköpostiosoitteet" #: account/models.py:86 msgid "created" msgstr "luotu" #: account/models.py:87 msgid "sent" msgstr "lähetetty" #: account/models.py:88 socialaccount/models.py:58 msgid "key" msgstr "avain" #: account/models.py:93 msgid "email confirmation" msgstr "sähköpostivarmistus" #: account/models.py:94 msgid "email confirmations" msgstr "sähköpostivarmistukset" #: socialaccount/adapter.py:26 #, python-format msgid "" "An account already exists with this e-mail address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Sähköpostiosoite on jo liitetty olemassaolevaan tiliin. Kirjaudu ensin " "kyseiseen tiliin ja liitä %s-tilisi vasta sitten." #: socialaccount/adapter.py:131 msgid "Your account has no password set up." msgstr "Tilillesi ei ole asetettu salasanaa." #: socialaccount/adapter.py:138 msgid "Your account has no verified e-mail address." msgstr "Tiliisi ei ole liitetty vahvistettua sähköpostiosoitetta." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Sosiaalisen median tilit" #: socialaccount/models.py:41 socialaccount/models.py:84 msgid "provider" msgstr "tarjoaja" #: socialaccount/models.py:45 msgid "name" msgstr "nimi" #: socialaccount/models.py:47 msgid "client id" msgstr "asiakas id" #: socialaccount/models.py:49 msgid "App ID, or consumer key" msgstr "Sovellus ID tai kuluttajan avain" #: socialaccount/models.py:52 msgid "secret key" msgstr "salainen avain" #: socialaccount/models.py:55 msgid "API secret, client secret, or consumer secret" msgstr "API:n, asiakkaan tai kuluttajan salaisuus" #: socialaccount/models.py:58 msgid "Key" msgstr "Avain" #: socialaccount/models.py:74 msgid "social application" msgstr "sosiaalinen applikaatio" #: socialaccount/models.py:75 msgid "social applications" msgstr "sosiaaliset applikaatiot" #: socialaccount/models.py:105 msgid "uid" msgstr "uid" #: socialaccount/models.py:107 msgid "last login" msgstr "viimeisin sisäänkirjautuminen" #: socialaccount/models.py:108 msgid "date joined" msgstr "liittymispäivämäärä" #: socialaccount/models.py:109 msgid "extra data" msgstr "lisätiedot" #: socialaccount/models.py:113 msgid "social account" msgstr "sosiaalisen median tili" #: socialaccount/models.py:114 msgid "social accounts" msgstr "sosiaalisen median tilit" #: socialaccount/models.py:139 msgid "token" msgstr "" #: socialaccount/models.py:140 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "" #: socialaccount/models.py:144 msgid "token secret" msgstr "" #: socialaccount/models.py:145 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "" #: socialaccount/models.py:148 msgid "expires at" msgstr "vanhenee" #: socialaccount/models.py:153 msgid "social application token" msgstr "" #: socialaccount/models.py:154 msgid "social application tokens" msgstr "" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "" #: socialaccount/providers/oauth/client.py:85 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Virheellinen vastaus palvelusta \"%s\"." #: socialaccount/providers/oauth/client.py:117 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Virhe hankittaessa käyttöoikeustunnistetta palvelusta \"%s\"" #: socialaccount/providers/oauth/client.py:138 #, python-format msgid "No request token saved for \"%s\"." msgstr "" #: socialaccount/providers/oauth/client.py:189 #, python-format msgid "No access token saved for \"%s\"." msgstr "" #: socialaccount/providers/oauth/client.py:210 #, python-format msgid "No access to private resources at \"%s\"." msgstr "" #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:8 msgid "Account Inactive" msgstr "Tili poissa käytöstä" #: templates/account/account_inactive.html:10 msgid "This account is inactive." msgstr "Tämä tili ei ole käytössä." #: templates/account/email.html:5 templates/account/email.html:8 msgid "E-mail Addresses" msgstr "Sähköpostiosoitteet" #: templates/account/email.html:10 msgid "The following e-mail addresses are associated with your account:" msgstr "Seuraavat sähköpostiosoitteet on liitetty tiliisi:" #: templates/account/email.html:24 msgid "Verified" msgstr "Vahvistettu" #: templates/account/email.html:26 msgid "Unverified" msgstr "Vahvistamaton" #: templates/account/email.html:28 msgid "Primary" msgstr "Ensisijainen" #: templates/account/email.html:34 msgid "Make Primary" msgstr "Aseta ensisijaiseksi" #: templates/account/email.html:35 msgid "Re-send Verification" msgstr "Lähetä vahvistus uudelleen" #: templates/account/email.html:36 templates/socialaccount/connections.html:35 msgid "Remove" msgstr "Poista" #: templates/account/email.html:43 msgid "Warning:" msgstr "Varoitus:" #: templates/account/email.html:43 msgid "" "You currently do not have any e-mail address set up. You should really add " "an e-mail address so you can receive notifications, reset your password, etc." msgstr "" "Et ole asettanut sähköpostiosoitetta. Tämä tulisi tehdä, jotta voit saada " "ilmoituksia, uusia salasanasi jne." #: templates/account/email.html:48 msgid "Add E-mail Address" msgstr "Lisää sähköpostiosoite" #: templates/account/email.html:53 msgid "Add E-mail" msgstr "Lisää sähköposti" #: templates/account/email.html:63 msgid "Do you really want to remove the selected e-mail address?" msgstr "Haluatko varmasti poistaa valitun sähköpostiosoitteen?" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "Terve palvelusta %(site_name)s!" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "Kiitos, kun käytät %(site_name)s palvelua!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, python-format msgid "" "You're receiving this e-mail because user %(user_display)s has given your e-" "mail address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "Sait tämän viestin, koska käyttäjä %(user_display)s palvelusta " "%(site_domain)s antoi sähköpostiosoitteesi liitettäväksi tiliinsä.\n" "\n" "Vahvistaaksesi tiedot oikeiksi mene osoitteeseen %(activate_url)s" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your E-mail Address" msgstr "Vahvista sähköpostiosoitteesi" #: templates/account/email/password_reset_key_message.txt:4 msgid "" "You're receiving this e-mail because you or someone else has requested a " "password for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Sait tämän sähköpostin, koska sinä tai joku muu on pyytänyt salasasi " "uusimista palvelussa %(site_domain)s.\n" "Tämän viestin voi jättää huomiotta, jos et pyytänyt salasanan uusimista. " "Klikkaa alla olevaa linkkiä uusiaksesi salasanasi." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "Muistathan, että käyttäjätunnuksesi on %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 msgid "Password Reset E-mail" msgstr "Salasanan uusimissähköposti" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm E-mail Address" msgstr "Vahvista sähköpostiosoite" #: templates/account/email_confirm.html:16 #, python-format msgid "" "Please confirm that %(email)s is an e-mail " "address for user %(user_display)s." msgstr "" "Vahvista, että %(email)s on käyttäjän " "%(user_display)s sähköpostiosoite." #: templates/account/email_confirm.html:20 msgid "Confirm" msgstr "Vahvista" #: templates/account/email_confirm.html:27 #, python-format msgid "" "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgstr "" "Tämä sähköpostiosoitteen vahvistuslinkki on vanhentunut tai muuten " "käyttökelvoton. Voit kuitenkin pyytää uuden " "vahvistuslinkin sähköpostiosoitteellesi." #: templates/account/login.html:6 templates/account/login.html:10 #: templates/account/login.html:43 msgid "Sign In" msgstr "Kirjaudu sisään" #: templates/account/login.html:15 #, python-format msgid "" "Please sign in with one\n" "of your existing third party accounts. Or, sign " "up\n" "for a %(site_name)s account and sign in below:" msgstr "" "Kirjaudu sisään käyttäen kirjautumispalvelua tai rekisteröi %(site_name)s-tili ja kirjaudu sisään alla olevalla " "lomakkeella:" #: templates/account/login.html:25 msgid "or" msgstr "tai" #: templates/account/login.html:32 #, python-format msgid "" "If you have not created an account yet, then please\n" "sign up first." msgstr "" "Jos et ole luonut vielä tiliä, niin rekisteröidy ensin." #: templates/account/login.html:42 templates/account/password_change.html:14 msgid "Forgot Password?" msgstr "Salasana unohtunut?" #: templates/account/logout.html:5 templates/account/logout.html:8 #: templates/account/logout.html:17 msgid "Sign Out" msgstr "Kirjaudu ulos" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Haluatko varmasti kirjautua ulos?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary e-mail address (%(email)s)." msgstr "Et voi poistaa ensisijaista sähköpostiosoitettasi (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation e-mail sent to %(email)s." msgstr "Vahvistusviesti on lähetetty osoitteeseen %(email)s." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "Sähköpostiosoite %(email)s on vahvistettu." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed e-mail address %(email)s." msgstr "Poistettiin sähköpostiosoite %(email)s." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Kirjauduttiin sisään käyttäjänä %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Kirjauduit ulos." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Salasana vaihto onnistui." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Salasana asetettiin." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary e-mail address set." msgstr "Ensisijainen sähköpostiosoite asetettiin." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary e-mail address must be verified." msgstr "Ensisijaisen sähköpostiosoiteen tulee olla vahvistettu." #: templates/account/password_change.html:5 #: templates/account/password_change.html:8 #: templates/account/password_change.html:13 #: templates/account/password_reset_from_key.html:4 #: templates/account/password_reset_from_key.html:7 #: templates/account/password_reset_from_key_done.html:4 #: templates/account/password_reset_from_key_done.html:7 msgid "Change Password" msgstr "Vaihda salasana" #: templates/account/password_reset.html:6 #: templates/account/password_reset.html:10 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:9 msgid "Password Reset" msgstr "Salasanan uusiminen" #: templates/account/password_reset.html:15 msgid "" "Forgotten your password? Enter your e-mail address below, and we'll send you " "an e-mail allowing you to reset it." msgstr "" "Unohditko salasanasi? Anna sähköpostiosoitteesi ja lähetämme sinulle " "sähköpostin, jonka avulla voit uusia sen." #: templates/account/password_reset.html:20 msgid "Reset My Password" msgstr "Salasanan uusiminen" #: templates/account/password_reset.html:23 msgid "Please contact us if you have any trouble resetting your password." msgstr "Ota meihin yhteyttä, jos sinulla on ongelmia salasanasi uusimisessa." #: templates/account/password_reset_done.html:15 msgid "" "We have sent you an e-mail. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Olemme lähettäneet sinulle sähköpostia. Ota meihin yhteyttä, jos et saa sitä " "muutaman minuutin sisällä." #: templates/account/password_reset_from_key.html:7 msgid "Bad Token" msgstr "Virheellinen tunniste" #: templates/account/password_reset_from_key.html:11 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Salasanan uusimislinkki ei toiminut. Tämä voi tapahtua, jos linkki on jo " "käytetty. Voit kuitenkin uusia salasanan " "uusimisen." #: templates/account/password_reset_from_key.html:17 msgid "change password" msgstr "vaihda salasanaa" #: templates/account/password_reset_from_key.html:20 #: templates/account/password_reset_from_key_done.html:8 msgid "Your password is now changed." msgstr "Salasanasi on nyt vaihdettu." #: templates/account/password_set.html:5 templates/account/password_set.html:8 #: templates/account/password_set.html:13 msgid "Set Password" msgstr "Aseta salasana" #: templates/account/signup.html:5 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Rekisteröidy" #: templates/account/signup.html:8 templates/account/signup.html:18 #: templates/socialaccount/signup.html:8 templates/socialaccount/signup.html:19 msgid "Sign Up" msgstr "Rekisteröidy" #: templates/account/signup.html:10 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "Onko sinulla jo tili? Kirjaudu sisään." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:8 msgid "Sign Up Closed" msgstr "Rekisteröityminen on poissa käytöstä." #: templates/account/signup_closed.html:10 msgid "We are sorry, but the sign up is currently closed." msgstr "Valitettavasti rekisteröityminen on pois käytöstä." #: templates/account/snippets/already_logged_in.html:5 msgid "Note" msgstr "Huomio" #: templates/account/snippets/already_logged_in.html:5 #, python-format msgid "you are already logged in as %(user_display)s." msgstr "olet jo kirjautunut käyttäjänä %(user_display)s." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:8 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:8 msgid "Verify Your E-mail Address" msgstr "Vahvista sähköpostiosoitteesi" #: templates/account/verification_sent.html:10 msgid "" "We have sent an e-mail to you for verification. Follow the link provided to " "finalize the signup process. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Lähetimme sinulle sähköpostin vahvistusviestin. Klikkaa sähköpostissa olevaa " "linkkiä viimeistelläksesi rekisteröitymisprosessin. Ota meihin yhteyttä, jos " "et saanut vahvistusviestiä muutaman minuutin sisällä." #: templates/account/verified_email_required.html:12 msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your e-mail address. " msgstr "" "Tämä osa palvelua vaatii, että tiedämme kuka olet. Tämän takia sinun pitää " "vahvistaa omistavasi ilmoittamasi sähköpostiosoite." #: templates/account/verified_email_required.html:16 msgid "" "We have sent an e-mail to you for\n" "verification. Please click on the link inside this e-mail. Please\n" "contact us if you do not receive it within a few minutes." msgstr "" "Olemme lähettäneet sinulle sähköpostivahvistuksen. Klikkaa sähköpostissa " "olevaa linkkiä vahvistaaksesi sähköpostiosoitteesi. Ota meihin yhteyttä, jos " "et saanut vahvistusviestiä muutaman minuutin sisällä." #: templates/account/verified_email_required.html:20 #, python-format msgid "" "Note: you can still change your e-" "mail address." msgstr "" "Huomio: voit edelleen vaihtaa " "sähköpostiosoitteesi." #: templates/openid/login.html:9 msgid "OpenID Sign In" msgstr "OpenID kirjautuminen" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:8 msgid "Social Network Login Failure" msgstr "Sosiaalisen median tilillä kirjautuminen epäonnistui" #: templates/socialaccount/authentication_error.html:10 msgid "" "An error occurred while attempting to login via your social network account." msgstr "" "Tapahtui virhe yritettäessä kirjautua käyttäen sosiaalisen median tiliä." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:8 msgid "Account Connections" msgstr "Liitetyt tilit" #: templates/socialaccount/connections.html:11 msgid "" "You can sign in to your account using any of the following third party " "accounts:" msgstr "Voit kirjautua käyttäen seuraavia kirjautumispalveluita:" #: templates/socialaccount/connections.html:43 msgid "" "You currently have no social network accounts connected to this account." msgstr "Tiliisi ei ole liitetty yhtäkään sosiaalisen median tiliä." #: templates/socialaccount/connections.html:46 msgid "Add a 3rd Party Account" msgstr "Lisää kolmannen osapuolen tili" #: templates/socialaccount/login.html:6 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:8 #, python-format msgid "You are about to connect a new third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:10 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:12 #, python-format msgid "You are about to sign in using a third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Sisäänkirjautuminen keskeytettiin" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Keskeytit sisäänkirjautumisen olemassaolevalle tilillesi. Jos tämä oli " "vahinko niin kirjaudu sisään." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "Sosiaalisen median tili liitettiin." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "Sosiaalisen median tili on jo liitetty toiseen tiliin." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Sosiaalisen median tili on poistettu käytöstä." #: templates/socialaccount/signup.html:10 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Olet aikeissa käyttää %(provider_name)s-tiliäsi kirjautuaksesi palveluun\n" "%(site_name)s. Täytä vielä seuraava lomake:" #~ msgid "Account" #~ msgstr "Tili" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "Kirjautumistiedot eivät ole oikein." #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "" #~ "Käyttäjänimi saa sisältää vain kirjaimia, numeroita ja erikoismerkkejä " #~ "@/./+/-/_." #~ msgid "This username is already taken. Please choose another." #~ msgstr "Käyttäjänimi on käytössä. Valitse toinen käyttäjänimi." #, fuzzy #~| msgid "Sign In" #~ msgid "Shopify Sign In" #~ msgstr "Kirjaudu sisään" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "Olet vahvistanut, että %(email)s on " #~ "sähköpostiosoite käyttäjälle %(user_display)s." django-allauth-0.47.0/allauth/locale/fr/000077500000000000000000000000001415442050100177705ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/fr/LC_MESSAGES/000077500000000000000000000000001415442050100215555ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/fr/LC_MESSAGES/django.po000066400000000000000000000640221415442050100233630ustar00rootroot00000000000000# DJANGO-ALLAUTH. # Copyright (C) 2016 # This file is distributed under the same license as the django-allauth package. # # Translators: # Steve Kossouho , 2016. # Gilou , 2019 # msgid "" msgstr "" "Project-Id-Version: django-allauth\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-12-09 08:41-0600\n" "PO-Revision-Date: 2020-10-15 19:47+0200\n" "Last-Translator: Gilou \n" "Language-Team: français <>\n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Poedit 1.8.7.1\n" #: account/adapter.py:45 msgid "Username can not be used. Please use other username." msgstr "Ce pseudonyme ne peut pas être utilisé. Veuillez en choisir un autre." #: account/adapter.py:51 msgid "Too many failed login attempts. Try again later." msgstr "" "Trop de tentatives de connexion échouées. Veuillez réessayer ultérieurement." #: account/adapter.py:53 msgid "A user is already registered with this e-mail address." msgstr "Un autre utilisateur utilise déjà cette adresse e-mail." #: account/adapter.py:300 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Le mot de passe doit contenir au minimum {0} caractères." #: account/apps.py:7 msgid "Accounts" msgstr "Comptes" #: account/forms.py:59 account/forms.py:413 msgid "You must type the same password each time." msgstr "Vous devez saisir deux fois le même mot de passe." #: account/forms.py:92 account/forms.py:381 account/forms.py:498 msgid "Password" msgstr "Mot de passe" #: account/forms.py:93 msgid "Remember Me" msgstr "Se souvenir de moi" #: account/forms.py:97 msgid "This account is currently inactive." msgstr "Ce compte est actuellement désactivé." #: account/forms.py:99 msgid "The e-mail address and/or password you specified are not correct." msgstr "L’adresse e-mail ou le mot de passe sont incorrects." #: account/forms.py:102 msgid "The username and/or password you specified are not correct." msgstr "Le pseudo ou le mot de passe sont incorrects." #: account/forms.py:113 account/forms.py:279 account/forms.py:439 #: account/forms.py:517 msgid "E-mail address" msgstr "Adresse e-mail" #: account/forms.py:117 account/forms.py:316 account/forms.py:436 #: account/forms.py:512 msgid "E-mail" msgstr "E-mail" #: account/forms.py:120 account/forms.py:123 account/forms.py:269 #: account/forms.py:272 msgid "Username" msgstr "Pseudonyme" #: account/forms.py:133 msgid "Username or e-mail" msgstr "Pseudonyme ou e-mail" #: account/forms.py:136 msgctxt "field label" msgid "Login" msgstr "Identifiant" #: account/forms.py:307 msgid "E-mail (again)" msgstr "E-mail (confirmation)" #: account/forms.py:311 msgid "E-mail address confirmation" msgstr "Confirmation d'adresse e-mail" #: account/forms.py:319 msgid "E-mail (optional)" msgstr "E-mail (facultatif)" #: account/forms.py:359 msgid "You must type the same email each time." msgstr "Vous devez saisir deux fois le même email." #: account/forms.py:384 account/forms.py:499 msgid "Password (again)" msgstr "Mot de passe (confirmation)" #: account/forms.py:448 msgid "This e-mail address is already associated with this account." msgstr "L'adresse e-mail est déjà associée à votre compte." #: account/forms.py:451 msgid "This e-mail address is already associated with another account." msgstr "L'adresse e-mail est déjà associée à un autre compte." #: account/forms.py:453 #, fuzzy, python-format #| msgid "Your account has no verified e-mail address." msgid "You cannot add more than %d e-mail addresses." msgstr "Vous devez d'abord associer une adresse e-mail à votre compte." #: account/forms.py:478 msgid "Current Password" msgstr "Mot de passe actuel" #: account/forms.py:480 account/forms.py:570 msgid "New Password" msgstr "Nouveau mot de passe" #: account/forms.py:481 account/forms.py:571 msgid "New Password (again)" msgstr "Nouveau mot de passe (confirmation)" #: account/forms.py:489 msgid "Please type your current password." msgstr "Merci d'indiquer votre mot de passe actuel." #: account/forms.py:529 msgid "The e-mail address is not assigned to any user account" msgstr "Cette adresse e-mail n'est pas associée à un compte utilisateur" #: account/forms.py:592 msgid "The password reset token was invalid." msgstr "Le jeton de réinitialisation de mot de passe est invalide." #: account/models.py:22 msgid "user" msgstr "utilisateur" #: account/models.py:28 account/models.py:83 msgid "e-mail address" msgstr "adresse e-mail" #: account/models.py:30 msgid "verified" msgstr "vérifié" #: account/models.py:31 msgid "primary" msgstr "principale" #: account/models.py:36 msgid "email address" msgstr "adresse e-mail" #: account/models.py:37 msgid "email addresses" msgstr "adresses e-mail" #: account/models.py:86 msgid "created" msgstr "créé" #: account/models.py:87 msgid "sent" msgstr "envoyé" #: account/models.py:88 socialaccount/models.py:58 msgid "key" msgstr "clé" #: account/models.py:93 msgid "email confirmation" msgstr "confirmation par e-mail" #: account/models.py:94 msgid "email confirmations" msgstr "confirmations par e-mail" #: socialaccount/adapter.py:26 #, python-format msgid "" "An account already exists with this e-mail address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Un compte existe déjà avec cette adresse e-mail. Merci de vous connecter au " "préalable avec ce compte, et ensuite connecter votre compte %s." #: socialaccount/adapter.py:131 msgid "Your account has no password set up." msgstr "Vous devez d'abord définir le mot de passe de votre compte." #: socialaccount/adapter.py:138 msgid "Your account has no verified e-mail address." msgstr "Vous devez d'abord associer une adresse e-mail à votre compte." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Comptes Sociaux" #: socialaccount/models.py:41 socialaccount/models.py:84 msgid "provider" msgstr "fournisseur" #: socialaccount/models.py:45 msgid "name" msgstr "nom" #: socialaccount/models.py:47 msgid "client id" msgstr "id client" #: socialaccount/models.py:49 msgid "App ID, or consumer key" msgstr "ID de l'app ou clé de l'utilisateur" #: socialaccount/models.py:52 msgid "secret key" msgstr "clé secrète" #: socialaccount/models.py:55 msgid "API secret, client secret, or consumer secret" msgstr "Secret de l'API, secret du client, ou secret de l'utilisateur" #: socialaccount/models.py:58 msgid "Key" msgstr "Clé" #: socialaccount/models.py:74 msgid "social application" msgstr "application sociale" #: socialaccount/models.py:75 msgid "social applications" msgstr "applications sociales" #: socialaccount/models.py:105 msgid "uid" msgstr "uid" #: socialaccount/models.py:107 msgid "last login" msgstr "dernière identification" #: socialaccount/models.py:108 msgid "date joined" msgstr "date d'inscription" #: socialaccount/models.py:109 msgid "extra data" msgstr "données supplémentaires" #: socialaccount/models.py:113 msgid "social account" msgstr "compte social" #: socialaccount/models.py:114 msgid "social accounts" msgstr "comptes sociaux" #: socialaccount/models.py:139 msgid "token" msgstr "jeton" #: socialaccount/models.py:140 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "\"oauth_token\" (OAuth1) ou jeton d'accès (OAuth2)" #: socialaccount/models.py:144 msgid "token secret" msgstr "jeton secret" #: socialaccount/models.py:145 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "\"oauth_token_secret\" (OAuth1) ou jeton d'actualisation (OAuth2)" #: socialaccount/models.py:148 msgid "expires at" msgstr "expire le" #: socialaccount/models.py:153 msgid "social application token" msgstr "jeton de l'application sociale" #: socialaccount/models.py:154 msgid "social application tokens" msgstr "jetons de l'application sociale" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "Données de profil incorrectes" #: socialaccount/providers/oauth/client.py:85 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Réponse invalide lors de l'obtention du jeton de requête de \"%s\"." #: socialaccount/providers/oauth/client.py:117 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Réponse invalide lors de l'obtention du jeton d'accès depuis \"%s\"." #: socialaccount/providers/oauth/client.py:138 #, python-format msgid "No request token saved for \"%s\"." msgstr "Aucun jeton de requête sauvegardé pour \"%s\"." #: socialaccount/providers/oauth/client.py:189 #, python-format msgid "No access token saved for \"%s\"." msgstr "Aucun jeton d'accès sauvegardé pour \"%s\"." #: socialaccount/providers/oauth/client.py:210 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Impossible d'accéder aux ressources privées de \"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:8 msgid "Account Inactive" msgstr "Compte inactif" #: templates/account/account_inactive.html:10 msgid "This account is inactive." msgstr "Ce compte est inactif." #: templates/account/email.html:5 templates/account/email.html:8 msgid "E-mail Addresses" msgstr "Adresses e-mail" #: templates/account/email.html:10 msgid "The following e-mail addresses are associated with your account:" msgstr "Les adresses e-mail suivantes sont associées à votre compte :" #: templates/account/email.html:24 msgid "Verified" msgstr "Vérifiée" #: templates/account/email.html:26 msgid "Unverified" msgstr "Non vérifiée" #: templates/account/email.html:28 msgid "Primary" msgstr "Principale" #: templates/account/email.html:34 msgid "Make Primary" msgstr "Rendre Principale" #: templates/account/email.html:35 msgid "Re-send Verification" msgstr "Renvoyer le message de vérification" #: templates/account/email.html:36 templates/socialaccount/connections.html:35 msgid "Remove" msgstr "Retirer" #: templates/account/email.html:43 msgid "Warning:" msgstr "Attention :" #: templates/account/email.html:43 msgid "" "You currently do not have any e-mail address set up. You should really add " "an e-mail address so you can receive notifications, reset your password, etc." msgstr "" "Vous n'avez aucune adresse e-mail associée à votre compte. Vous devriez " "ajouter une adresse e-mail pour pouvoir recevoir des notifications, " "réinitialiser votre mot de passe, etc." #: templates/account/email.html:48 msgid "Add E-mail Address" msgstr "Ajouter une adresse e-mail" #: templates/account/email.html:53 msgid "Add E-mail" msgstr "Ajouter un e-mail" #: templates/account/email.html:63 msgid "Do you really want to remove the selected e-mail address?" msgstr "Voulez-vous vraiment retirer cette adresse e-mail ?" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "Bonjour, c'est %(site_name)s !" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "Merci d'utiliser %(site_name)s !\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, python-format msgid "" "You're receiving this e-mail because user %(user_display)s has given your e-" "mail address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "Vous recevez cet e-mail car l'utilisateur %(user_display)s a indiqué votre " "adresse pour se connecter à son compte sur %(site_domain)s.\n" "\n" "Pour confirmer que vous en êtes bien le propriétaire, allez à " "%(activate_url)s" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your E-mail Address" msgstr "Confirmez votre adresse e-mail" #: templates/account/email/password_reset_key_message.txt:4 msgid "" "You're receiving this e-mail because you or someone else has requested a " "password for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Vous recevez cet e-mail car vous ou quelqu'un d'autre a demandé le mot de " "passe pour votre compte utilisateur.\n" "Vous pouvez simplement ignorer ce message si vous n'êtes pas à l'origine de " "cette demande. Sinon, cliquez sur le lien ci-dessous pour réinitialiser " "votre mot de passe." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "" "Au cas où vous l'auriez oublié, votre nom d'utilisateur est %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 msgid "Password Reset E-mail" msgstr "E-mail de réinitialisation de mot de passe" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm E-mail Address" msgstr "Confirmer l'adresse e-mail" #: templates/account/email_confirm.html:16 #, python-format msgid "" "Please confirm that %(email)s is an e-mail " "address for user %(user_display)s." msgstr "" "Merci de confirmer que %(email)s est " "l'adresse e-mail de %(user_display)s." #: templates/account/email_confirm.html:20 msgid "Confirm" msgstr "Confirmer" #: templates/account/email_confirm.html:27 #, python-format msgid "" "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgstr "" "Ce lien de confirmation d'adresse e-mail a expiré ou n'est pas valide. " "Veuillez lancer une nouvelle demande de " "confirmation." #: templates/account/login.html:6 templates/account/login.html:10 #: templates/account/login.html:43 msgid "Sign In" msgstr "Connexion" #: templates/account/login.html:15 #, python-format msgid "" "Please sign in with one\n" "of your existing third party accounts. Or, sign " "up\n" "for a %(site_name)s account and sign in below:" msgstr "" "Merci d'ouvrir une session avec l'un de vos comptes sociaux. Vous pouvez " "aussi ouvrir un compte %(site_name)s puis " "vous connecter ci-dessous :" #: templates/account/login.html:25 msgid "or" msgstr "ou" #: templates/account/login.html:32 #, python-format msgid "" "If you have not created an account yet, then please\n" "sign up first." msgstr "" "Si vous n'avez pas encore créé de compte, merci de vous enregistrer au préalable." #: templates/account/login.html:42 templates/account/password_change.html:14 msgid "Forgot Password?" msgstr "Mot de passe oublié ?" #: templates/account/logout.html:5 templates/account/logout.html:8 #: templates/account/logout.html:17 msgid "Sign Out" msgstr "Se Déconnecter" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Etes-vous sûr(e) de vouloir vous déconnecter ?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary e-mail address (%(email)s)." msgstr "" "Vous ne pouvez pas supprimer votre adresse e-mail principale (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation e-mail sent to %(email)s." msgstr "E-mail de confirmation envoyé à %(email)s." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "Vous avez confirmé %(email)s." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed e-mail address %(email)s." msgstr "Adresse e-mail %(email)s supprimée." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Connexion avec %(name)s réussie." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Vous êtes déconnecté." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Mot de passe modifié." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Mot de passe défini." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary e-mail address set." msgstr "Adresse e-mail principale enregistrée." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary e-mail address must be verified." msgstr "Votre adresse e-mail principale doit être vérifiée." #: templates/account/password_change.html:5 #: templates/account/password_change.html:8 #: templates/account/password_change.html:13 #: templates/account/password_reset_from_key.html:4 #: templates/account/password_reset_from_key.html:7 #: templates/account/password_reset_from_key_done.html:4 #: templates/account/password_reset_from_key_done.html:7 msgid "Change Password" msgstr "Modifier le mot de passe" #: templates/account/password_reset.html:6 #: templates/account/password_reset.html:10 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:9 msgid "Password Reset" msgstr "Réinitialisation du mot de passe" #: templates/account/password_reset.html:15 msgid "" "Forgotten your password? Enter your e-mail address below, and we'll send you " "an e-mail allowing you to reset it." msgstr "" "Mot de passe oublié ? Indiquez votre adresse e-mail ci-dessous et nous vous " "enverrons un e-mail pour le réinitialiser." #: templates/account/password_reset.html:20 msgid "Reset My Password" msgstr "Réinitialiser mon mot de passe" #: templates/account/password_reset.html:23 msgid "Please contact us if you have any trouble resetting your password." msgstr "" "Merci de nous contacter si vous ne parvenez pas à réinitialiser votre mot de " "passe." #: templates/account/password_reset_done.html:15 msgid "" "We have sent you an e-mail. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Nous vous avons envoyé un e-mail. Merci de nous contacter si vous ne le " "recevez pas d'ici quelques minutes." #: templates/account/password_reset_from_key.html:7 msgid "Bad Token" msgstr "Mauvais jeton d'identification" #: templates/account/password_reset_from_key.html:11 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Le lien de réinitialisation du mot de passe est invalide. Il a peut être " "déjà été utilisé. Veuillez faire une nouvelle demande de réinitialisation de mot de passe." #: templates/account/password_reset_from_key.html:17 msgid "change password" msgstr "modifier le mot de passe" #: templates/account/password_reset_from_key.html:20 #: templates/account/password_reset_from_key_done.html:8 msgid "Your password is now changed." msgstr "Votre mot de passe a été modifié." #: templates/account/password_set.html:5 templates/account/password_set.html:8 #: templates/account/password_set.html:13 msgid "Set Password" msgstr "Définir un mot de passe" #: templates/account/signup.html:5 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Inscription" #: templates/account/signup.html:8 templates/account/signup.html:18 #: templates/socialaccount/signup.html:8 templates/socialaccount/signup.html:19 msgid "Sign Up" msgstr "Création de compte" #: templates/account/signup.html:10 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "" "Vous avez déjà un compte ? Vous pouvez donc vous " "connecter." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:8 msgid "Sign Up Closed" msgstr "Inscriptions Fermées" #: templates/account/signup_closed.html:10 msgid "We are sorry, but the sign up is currently closed." msgstr "Nous sommes désolés, mais les inscriptions sont actuellement fermées." #: templates/account/snippets/already_logged_in.html:5 msgid "Note" msgstr "Remarque" #: templates/account/snippets/already_logged_in.html:5 #, python-format msgid "you are already logged in as %(user_display)s." msgstr "vous êtes déjà connecté en tant que %(user_display)s." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:8 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:8 msgid "Verify Your E-mail Address" msgstr "Vérifiez votre adresse e-mail" #: templates/account/verification_sent.html:10 msgid "" "We have sent an e-mail to you for verification. Follow the link provided to " "finalize the signup process. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Nous vous avons envoyé un e-mail pour validation. Cliquez sur le lien fourni " "dans l'e-mail pour terminer l'inscription. Merci de nous contacter si vous " "ne le recevez pas d'ici quelques minutes." #: templates/account/verified_email_required.html:12 msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your e-mail address. " msgstr "" "Pour accéder à cette partie du site, il faut d'abord que nous ayons vérifié " "que vous êtes bien le propriétaire de l'adresse e-mail que vous nous avez " "indiquée." #: templates/account/verified_email_required.html:16 msgid "" "We have sent an e-mail to you for\n" "verification. Please click on the link inside this e-mail. Please\n" "contact us if you do not receive it within a few minutes." msgstr "" "Nous vous avons envoyé un e-mail de vérification. Merci de cliquer sur le " "lien inclus dans ce courriel. Contactez-nous si vous ne l'avez pas reçu " "d'ici quelques minutes." #: templates/account/verified_email_required.html:20 #, python-format msgid "" "Note: you can still change your e-" "mail address." msgstr "" "Remarque : vous pouvez toujours changer votre adresse e-mail." #: templates/openid/login.html:9 msgid "OpenID Sign In" msgstr "Connexion OpenID" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:8 msgid "Social Network Login Failure" msgstr "Echec de la connexion au réseau social" #: templates/socialaccount/authentication_error.html:10 msgid "" "An error occurred while attempting to login via your social network account." msgstr "" "Une erreur est survenue lors de la tentative de connexion à votre compte de " "réseau social." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:8 msgid "Account Connections" msgstr "Comptes associés" #: templates/socialaccount/connections.html:11 msgid "" "You can sign in to your account using any of the following third party " "accounts:" msgstr "" "Vous pouvez ouvrir une session en utilisant l'un de ces réseaux sociaux :" #: templates/socialaccount/connections.html:43 msgid "" "You currently have no social network accounts connected to this account." msgstr "Aucun compte de réseau social n'est actuellement associé à ce compte." #: templates/socialaccount/connections.html:46 msgid "Add a 3rd Party Account" msgstr "Ajouter un compte de réseau social" #: templates/socialaccount/login.html:6 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:8 #, python-format msgid "You are about to connect a new third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:10 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:12 #, python-format msgid "You are about to sign in using a third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Ouverture de session annulée" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Vous avez annulé la connexion à notre site depuis l'un de vos comptes de " "réseau social. S'il s'agit d'une erreur, merci de connecter." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "Le compte social a bien été connecté." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "Ce compte social est déjà connecté à un autre compte." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Le compte social a été déconnecté." #: templates/socialaccount/signup.html:10 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Vous êtes sur le point de vous connecter via votre compte %(provider_name)s " "au site %(site_name)s. Merci de compléter le formulaire suivant pour " "confirmer la connexion." #~ msgid "Account" #~ msgstr "Compte" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "L'identifiant ou le mot de passe sont incorrects." #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "" #~ "Un pseudonyme ne peut contenir que des lettres, des chiffres, ainsi que " #~ "@/./+/-/_." #~ msgid "This username is already taken. Please choose another." #~ msgstr "Ce pseudonyme est déjà utilisé, merci d'en choisir un autre." #~ msgid "Shopify Sign In" #~ msgstr "Connexion Shopify" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "Vous avez confirmé que l'adresse e-mail de l'utilsateur %(user_display)s " #~ "est %(email)s." #~ msgid "Thanks for using our site!" #~ msgstr "Merci d'utiliser notre site !" django-allauth-0.47.0/allauth/locale/he/000077500000000000000000000000001415442050100177555ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/he/LC_MESSAGES/000077500000000000000000000000001415442050100215425ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/he/LC_MESSAGES/django.po000066400000000000000000000660261415442050100233560ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: 0.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-12-09 08:41-0600\n" "PO-Revision-Date: 2017-08-26 16:11+0300\n" "Last-Translator: Udi Oron \n" "Language-Team: Hebrew\n" "Language: he\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.0.3\n" #: account/adapter.py:45 msgid "Username can not be used. Please use other username." msgstr "לא ניתן להשתמש בשם משתמש זה. אנא בחר שם משתמש אחר." #: account/adapter.py:51 msgid "Too many failed login attempts. Try again later." msgstr "יותר מדי ניסיונות התחברות כושלים. אנא נסה שוב מאוחר יותר." #: account/adapter.py:53 msgid "A user is already registered with this e-mail address." msgstr "משתמש אחר כבר רשום עם כתובת אימייל זו." #: account/adapter.py:300 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "הסיסמה חייבת להיות באורך של לפחות {0} תווים." #: account/apps.py:7 msgid "Accounts" msgstr "חשבונות" #: account/forms.py:59 account/forms.py:413 msgid "You must type the same password each time." msgstr "יש להזין את אותה הסיסמה פעמיים." #: account/forms.py:92 account/forms.py:381 account/forms.py:498 msgid "Password" msgstr "סיסמה" #: account/forms.py:93 msgid "Remember Me" msgstr "זכור אותי" #: account/forms.py:97 msgid "This account is currently inactive." msgstr "חשבון זה אינו פעיל כעת." #: account/forms.py:99 msgid "The e-mail address and/or password you specified are not correct." msgstr "כתובת האימייל ו/או הסיסמה אינם נכונים." #: account/forms.py:102 msgid "The username and/or password you specified are not correct." msgstr "שם המשתמש ו/או הסיסמה אינם נכונים." #: account/forms.py:113 account/forms.py:279 account/forms.py:439 #: account/forms.py:517 msgid "E-mail address" msgstr "כתובת אימייל" #: account/forms.py:117 account/forms.py:316 account/forms.py:436 #: account/forms.py:512 msgid "E-mail" msgstr "אימייל" #: account/forms.py:120 account/forms.py:123 account/forms.py:269 #: account/forms.py:272 msgid "Username" msgstr "שם משתמש" #: account/forms.py:133 msgid "Username or e-mail" msgstr "שם משתמש או אימייל" #: account/forms.py:136 msgctxt "field label" msgid "Login" msgstr "כניסה" #: account/forms.py:307 msgid "E-mail (again)" msgstr "אימייל (שוב)" #: account/forms.py:311 msgid "E-mail address confirmation" msgstr "אישור כתובת אימייל" #: account/forms.py:319 msgid "E-mail (optional)" msgstr "אימייל (לא חובה)" #: account/forms.py:359 msgid "You must type the same email each time." msgstr "יש להזין את אותו האימייל פעמיים." #: account/forms.py:384 account/forms.py:499 msgid "Password (again)" msgstr "סיסמה (שוב)" #: account/forms.py:448 msgid "This e-mail address is already associated with this account." msgstr "כתובת אימייל זו כבר משויכת לחשבון זה." #: account/forms.py:451 msgid "This e-mail address is already associated with another account." msgstr "כתובת אימייל זו כבר משויכת לחשבון אחר." #: account/forms.py:453 #, fuzzy, python-format #| msgid "Your account has no verified e-mail address." msgid "You cannot add more than %d e-mail addresses." msgstr "לא נמצאו כתובות אימייל מאומתות לחשבונך." #: account/forms.py:478 msgid "Current Password" msgstr "סיסמה נוכחית" #: account/forms.py:480 account/forms.py:570 msgid "New Password" msgstr "סיסמה חדשה" #: account/forms.py:481 account/forms.py:571 msgid "New Password (again)" msgstr "סיסמה חדשה (שוב)" #: account/forms.py:489 msgid "Please type your current password." msgstr "אנא הזן את הסיסמה הנוכחית." #: account/forms.py:529 msgid "The e-mail address is not assigned to any user account" msgstr "כתובת אימייל זו אינה משויכת לאף חשבון" #: account/forms.py:592 msgid "The password reset token was invalid." msgstr "אסימון איפוס הסיסמה אינו תקין." #: account/models.py:22 msgid "user" msgstr "משתמש" #: account/models.py:28 account/models.py:83 msgid "e-mail address" msgstr "כתובת אימייל" #: account/models.py:30 msgid "verified" msgstr "מאומת" #: account/models.py:31 msgid "primary" msgstr "ראשי" #: account/models.py:36 msgid "email address" msgstr "כתובת אימייל" #: account/models.py:37 msgid "email addresses" msgstr "כתובות אימייל" #: account/models.py:86 msgid "created" msgstr "נוצר" #: account/models.py:87 msgid "sent" msgstr "נשלח" #: account/models.py:88 socialaccount/models.py:58 msgid "key" msgstr "מפתח" #: account/models.py:93 msgid "email confirmation" msgstr "אישור באימייל" #: account/models.py:94 msgid "email confirmations" msgstr "אישורים בדואל" #: socialaccount/adapter.py:26 #, python-format msgid "" "An account already exists with this e-mail address. Please sign in to that " "account first, then connect your %s account." msgstr "" "קיים כבר חשבון עם כתובת אימייל זו. אנא התחבר לחשבון זה, ואז קשר את חשבון %s " "שלך." #: socialaccount/adapter.py:131 msgid "Your account has no password set up." msgstr "לא נבחרה סיסמה לחשבונך." #: socialaccount/adapter.py:138 msgid "Your account has no verified e-mail address." msgstr "לא נמצאו כתובות אימייל מאומתות לחשבונך." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "חשבונות חברתיים" #: socialaccount/models.py:41 socialaccount/models.py:84 msgid "provider" msgstr "" #: socialaccount/models.py:45 msgid "name" msgstr "שם" #: socialaccount/models.py:47 msgid "client id" msgstr "" #: socialaccount/models.py:49 msgid "App ID, or consumer key" msgstr "" #: socialaccount/models.py:52 msgid "secret key" msgstr "" #: socialaccount/models.py:55 msgid "API secret, client secret, or consumer secret" msgstr "" #: socialaccount/models.py:58 msgid "Key" msgstr "" #: socialaccount/models.py:74 msgid "social application" msgstr "" #: socialaccount/models.py:75 msgid "social applications" msgstr "" #: socialaccount/models.py:105 msgid "uid" msgstr "" #: socialaccount/models.py:107 msgid "last login" msgstr "התחברות אחרונה" #: socialaccount/models.py:108 msgid "date joined" msgstr "תאריך הצטרפות" #: socialaccount/models.py:109 msgid "extra data" msgstr "" #: socialaccount/models.py:113 msgid "social account" msgstr "חשבון חברתי" #: socialaccount/models.py:114 msgid "social accounts" msgstr "חשבונות חברתיים" #: socialaccount/models.py:139 msgid "token" msgstr "" #: socialaccount/models.py:140 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "" #: socialaccount/models.py:144 msgid "token secret" msgstr "" #: socialaccount/models.py:145 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "" #: socialaccount/models.py:148 msgid "expires at" msgstr "פג תוקף בתאריך" #: socialaccount/models.py:153 msgid "social application token" msgstr "" #: socialaccount/models.py:154 msgid "social application tokens" msgstr "" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "" #: socialaccount/providers/oauth/client.py:85 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "" #: socialaccount/providers/oauth/client.py:117 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "" #: socialaccount/providers/oauth/client.py:138 #, python-format msgid "No request token saved for \"%s\"." msgstr "" #: socialaccount/providers/oauth/client.py:189 #, python-format msgid "No access token saved for \"%s\"." msgstr "" #: socialaccount/providers/oauth/client.py:210 #, python-format msgid "No access to private resources at \"%s\"." msgstr "" #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:8 msgid "Account Inactive" msgstr "חשבון לא פעיל" #: templates/account/account_inactive.html:10 msgid "This account is inactive." msgstr "חשבון זה אינו פעיל." #: templates/account/email.html:5 templates/account/email.html:8 msgid "E-mail Addresses" msgstr "כתובות אימייל" #: templates/account/email.html:10 msgid "The following e-mail addresses are associated with your account:" msgstr "כתובות האימייל הבאות משויכות לחשבונך:" #: templates/account/email.html:24 msgid "Verified" msgstr "מאומת" #: templates/account/email.html:26 msgid "Unverified" msgstr "לא מאומת" #: templates/account/email.html:28 msgid "Primary" msgstr "ראשי" #: templates/account/email.html:34 msgid "Make Primary" msgstr "הפוך לראשי" #: templates/account/email.html:35 msgid "Re-send Verification" msgstr "שלח אימייל אימות מחדש" #: templates/account/email.html:36 templates/socialaccount/connections.html:35 msgid "Remove" msgstr "הסר" #: templates/account/email.html:43 msgid "Warning:" msgstr "אזהרה:" #: templates/account/email.html:43 msgid "" "You currently do not have any e-mail address set up. You should really add " "an e-mail address so you can receive notifications, reset your password, etc." msgstr "" "טרם שייכת כתובת אימייל לחשבונך. מומלץ לשייך כתובת אימייל על מנת לקבל התראות, " "לאפס סיסמה וכו'." #: templates/account/email.html:48 msgid "Add E-mail Address" msgstr "הוסף כתובת אימייל" #: templates/account/email.html:53 msgid "Add E-mail" msgstr "הוסף אימייל" #: templates/account/email.html:63 msgid "Do you really want to remove the selected e-mail address?" msgstr "האם ברצונך להסיר את כתובות האימייל המסומנות?" #: templates/account/email/base_message.txt:1 #, fuzzy, python-format #| msgid "" #| "Thank you from %(site_name)s!\n" #| "%(site_domain)s" msgid "Hello from %(site_name)s!" msgstr "" "תודה מ%(site_name)s!\n" "%(site_domain)s" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "תודה שהשתמשת באתר %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because user %(user_display)s has given " #| "yours as an e-mail address to connect their account.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s\n" msgid "" "You're receiving this e-mail because user %(user_display)s has given your e-" "mail address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "שלום מ%(site_name)s.\n" "\n" "אתה מקבל מייל זה מכיוון שהמשתמש %(user_display)s סיפק את האימייל שלך לקישור " "של חשבונם.\n" "\n" "כדי לאמת זאת, לחץ על הקישור %(activate_url)s.\n" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your E-mail Address" msgstr "אנא אמת את כתובת האימייל שלך" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this e-mail because you or someone else has requested a " "password for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "שלום מ%(site_name)s!\n" "\n" "מייל זה נשלח אליך כיוון שאתה או מישהו אחר ביקש סיסמה עבור חשבונך ב " "%(site_name)s.\n" "במידה ולא ביקשת איפוס סיסמה ניתן להתעלם ממייל זה ללא חשש. לחץ על הקישור מטה " "לאיפוס סיסמתך." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "במידת ושכחת, שם המשתמש שלך הוא %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 msgid "Password Reset E-mail" msgstr "מייל איפוס סיסמה" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm E-mail Address" msgstr "אימות כתובת אימייל" #: templates/account/email_confirm.html:16 #, python-format msgid "" "Please confirm that %(email)s is an e-mail " "address for user %(user_display)s." msgstr "" "אנא אמת ש%(email)s היא כתובת האימייל של " "המשתמש %(user_display)s." #: templates/account/email_confirm.html:20 msgid "Confirm" msgstr "אמת" #: templates/account/email_confirm.html:27 #, python-format msgid "" "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgstr "" "קישור זה לאימות כתובת אימייל פג תוקף או שאינו תקין. יש להנפיק בקשה חדשה לאימות כתובת אימייל." #: templates/account/login.html:6 templates/account/login.html:10 #: templates/account/login.html:43 msgid "Sign In" msgstr "כניסה" #: templates/account/login.html:15 #, python-format msgid "" "Please sign in with one\n" "of your existing third party accounts. Or, sign " "up\n" "for a %(site_name)s account and sign in below:" msgstr "" "אנא הכנס עם אחד מהחשבונות הקיימים שלך.\n" "או, הרשם לחשבון %(site_name)s והתחבר:" #: templates/account/login.html:25 msgid "or" msgstr "או" #: templates/account/login.html:32 #, python-format msgid "" "If you have not created an account yet, then please\n" "sign up first." msgstr "" "אם לא נרשמת לחשבון בעבר, אנא הרשם תחילה." #: templates/account/login.html:42 templates/account/password_change.html:14 msgid "Forgot Password?" msgstr "שכחת סיסמה?" #: templates/account/logout.html:5 templates/account/logout.html:8 #: templates/account/logout.html:17 msgid "Sign Out" msgstr "יציאה" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "האם אתה בטוח שברצונך לצאת?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary e-mail address (%(email)s)." msgstr "לא ניתן להסיר את כתובת האימייל הראשית שלך (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation e-mail sent to %(email)s." msgstr "מייל אימות נשלח ל %(email)s." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "כתובת האימייל %(email)s אומתה בהצלחה." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed e-mail address %(email)s." msgstr "כתובת האימייל %(email)s הוסרה." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "מחובר בהצלחה כ %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "התנתקת מהחשבון." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "הסיסמה שונתה בהצלחה." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "הסיסמה נקבעה בהצלחה." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary e-mail address set." msgstr "כתובת אימייל ראשית הוגדרה." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary e-mail address must be verified." msgstr "עליך לאמת את כתובת האימייל הראשית שלך." #: templates/account/password_change.html:5 #: templates/account/password_change.html:8 #: templates/account/password_change.html:13 #: templates/account/password_reset_from_key.html:4 #: templates/account/password_reset_from_key.html:7 #: templates/account/password_reset_from_key_done.html:4 #: templates/account/password_reset_from_key_done.html:7 msgid "Change Password" msgstr "החלפת סיסמה" #: templates/account/password_reset.html:6 #: templates/account/password_reset.html:10 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:9 msgid "Password Reset" msgstr "איפוס סיסמה" #: templates/account/password_reset.html:15 msgid "" "Forgotten your password? Enter your e-mail address below, and we'll send you " "an e-mail allowing you to reset it." msgstr "" "שכחת את סיסמתך? הזן את כתובת האימייל שלך כאן, ונשלח לך מייל לאיפוס הסיסמה." #: templates/account/password_reset.html:20 msgid "Reset My Password" msgstr "אפס את הסיסמה" #: templates/account/password_reset.html:23 msgid "Please contact us if you have any trouble resetting your password." msgstr "אנא צור איתנו קשר אם אתה מתקשה לאפס את הסיסמה." #: templates/account/password_reset_done.html:15 msgid "" "We have sent you an e-mail. Please contact us if you do not receive it " "within a few minutes." msgstr "המייל נשלח. אנא צור איתנו קשר אם הוא אינו מתקבל תוך מספר דקות." #: templates/account/password_reset_from_key.html:7 msgid "Bad Token" msgstr "אסימון פגום" #: templates/account/password_reset_from_key.html:11 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "הקישור לאיפוס הסיסמה אינו תקין, כנראה מכיוון שכבר נעשה בו שימוש. לחץ כאן " "לבקשת איפוס סיסמה מחדש." #: templates/account/password_reset_from_key.html:17 msgid "change password" msgstr "החלפת סיסמה" #: templates/account/password_reset_from_key.html:20 #: templates/account/password_reset_from_key_done.html:8 msgid "Your password is now changed." msgstr "סיסמתך שונתה." #: templates/account/password_set.html:5 templates/account/password_set.html:8 #: templates/account/password_set.html:13 msgid "Set Password" msgstr "קביעת סיסמה" #: templates/account/signup.html:5 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "הרשמה" #: templates/account/signup.html:8 templates/account/signup.html:18 #: templates/socialaccount/signup.html:8 templates/socialaccount/signup.html:19 msgid "Sign Up" msgstr "הרשמה" #: templates/account/signup.html:10 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "נרשמת בעבר? כניסה למערכת." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:8 msgid "Sign Up Closed" msgstr "ההרשמה סגורה" #: templates/account/signup_closed.html:10 msgid "We are sorry, but the sign up is currently closed." msgstr "אנו מצטערים, אך ההרשמה סגורה כעת." #: templates/account/snippets/already_logged_in.html:5 msgid "Note" msgstr "הערה" #: templates/account/snippets/already_logged_in.html:5 #, python-format msgid "you are already logged in as %(user_display)s." msgstr "הנך מחובר כבר כ%(user_display)s." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:8 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:8 msgid "Verify Your E-mail Address" msgstr "אשר את כתובת הדואל שלך" #: templates/account/verification_sent.html:10 msgid "" "We have sent an e-mail to you for verification. Follow the link provided to " "finalize the signup process. Please contact us if you do not receive it " "within a few minutes." msgstr "" "שלחנו אליך מייל למטרת אימות. לחץ על הקישור במייל לסיום תהליך ההרשמה. אנא צור " "עמנו קשר במידה והמייל לא התקבל תוך מספר דקות." #: templates/account/verified_email_required.html:12 msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your e-mail address. " msgstr "" "חלק זה באתר דורש מאיתנו לוודא כי הנך אכן מי שאתה טוען שאתה.\n" "למטרה זו, אנו מבקשים כי תאמת בעלות על כתובת האימייל שלך." #: templates/account/verified_email_required.html:16 msgid "" "We have sent an e-mail to you for\n" "verification. Please click on the link inside this e-mail. Please\n" "contact us if you do not receive it within a few minutes." msgstr "" "שלחנו אליך מייל למטרת אימות.\n" "אנא ללץ על הקישור בתוך אימייל זה.\n" "אנא צור עמנו קשר במידה והמייל לא התקבל תוך מספר דקות." #: templates/account/verified_email_required.html:20 #, python-format msgid "" "Note: you can still change your e-" "mail address." msgstr "" "הערה: אתה עדיין יכול לשנות את " "כתובת האימייל שלך ." #: templates/openid/login.html:9 msgid "OpenID Sign In" msgstr "כניסה באמצעות OpenID" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:8 msgid "Social Network Login Failure" msgstr "שגיאת התחברות לרשת חברתית" #: templates/socialaccount/authentication_error.html:10 msgid "" "An error occurred while attempting to login via your social network account." msgstr "אירעה שגיאה במהלך ניסיון התחברות באמצעות חשבון הרשת החברתית שלך." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:8 msgid "Account Connections" msgstr "קישורים לחשבון" #: templates/socialaccount/connections.html:11 msgid "" "You can sign in to your account using any of the following third party " "accounts:" msgstr "ניתן להתחבר לחשבונך באמצעות כל אחד מחשבונות צד שלישי הבאים:" #: templates/socialaccount/connections.html:43 msgid "" "You currently have no social network accounts connected to this account." msgstr "לא קיימים חשבונות רשת חברתית המקושרים לחשבון זה כרגע." #: templates/socialaccount/connections.html:46 msgid "Add a 3rd Party Account" msgstr "הוסף חשבון צד שלישי" #: templates/socialaccount/login.html:6 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:8 #, python-format msgid "You are about to connect a new third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:10 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:12 #, python-format msgid "You are about to sign in using a third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "התחברות בוטלה" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "ביקשת לבטל את ההתחברות לאתר זה באמצעות אחד מחשבונותיך הקיימים. במידה וטעית, " "אנא המשך להתחברות." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "החשבון החברתי קושר בהצלחה." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "חשבון חברתי זה כבר מקושר למשתמש אחר." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "חשבון חברתי זה נותק." #: templates/socialaccount/signup.html:10 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "אתה עומד להשתמש בחשבון %(provider_name)s שלך כדי\n" "להתחבר ל%(site_name)s. לסיום, אנא מלא את הטופס הבא:" #~ msgid "Account" #~ msgstr "חשבון" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "שם המשתמש ו/או הסיסמא אינם נכונים" #~ msgid "This username is already taken. Please choose another." #~ msgstr "שם משתמש זה כבר תפוס, אנא ציין שם אחר" #, fuzzy #~| msgid "Sign In" #~ msgid "Shopify Sign In" #~ msgstr "כניסה" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "אישרת בהצלחה כי %(email)s הנה כתובת דואר " #~ "אלקטרוני עבור המשתמש %(user_display)s." #~ msgid "Confirmation e-mail sent to %(email)s" #~ msgstr "דואל אישור נשלח אל %(email)s" #~ msgid "Delete Password" #~ msgstr "מחיקת סיסמא" #~ msgid "" #~ "You may delete your password since you are currently logged in using " #~ "OpenID." #~ msgstr "אתה רשאי למחוק את סיסמאתך כיוון שהנך מחובר באמצעות OpenID" #~ msgid "delete my password" #~ msgstr "מחק סיסמא" #~ msgid "Password Deleted" #~ msgstr "הסיסמא נמחקה" #~ msgid "Your password has been deleted." #~ msgstr "סיסמתך נמחקה מהמערכת." django-allauth-0.47.0/allauth/locale/hr/000077500000000000000000000000001415442050100177725ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/hr/LC_MESSAGES/000077500000000000000000000000001415442050100215575ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/hr/LC_MESSAGES/django.po000066400000000000000000000634021415442050100233660ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Bojan Mihelac , 2013-05-22 # Mislav Cimperšak . 2013-07-09 # Goran Cetušić . 2015-11-27 # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-12-09 08:41-0600\n" "PO-Revision-Date: 2014-08-12 00:31+0200\n" "Last-Translator: \n" "Language-Team: Bojan Mihelac \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Poedit 1.5.4\n" "X-Translated-Using: django-rosetta 0.7.2\n" #: account/adapter.py:45 msgid "Username can not be used. Please use other username." msgstr "Nije moguće koristiti upisano korisničko ime. Molimo odaberite drugo." #: account/adapter.py:51 msgid "Too many failed login attempts. Try again later." msgstr "" #: account/adapter.py:53 msgid "A user is already registered with this e-mail address." msgstr "Već postoji korisnik registriran s ovom e-mail adresom." #: account/adapter.py:300 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Lozinka treba imati najmanje {0} znakova." #: account/apps.py:7 msgid "Accounts" msgstr "Korisnički računi" #: account/forms.py:59 account/forms.py:413 msgid "You must type the same password each time." msgstr "Potrebno je upisati istu lozinku svaki put." #: account/forms.py:92 account/forms.py:381 account/forms.py:498 msgid "Password" msgstr "Lozinka" #: account/forms.py:93 msgid "Remember Me" msgstr "Zapamti me" #: account/forms.py:97 msgid "This account is currently inactive." msgstr "Ovaj korisnički račun je privremeno neaktivan." #: account/forms.py:99 msgid "The e-mail address and/or password you specified are not correct." msgstr "E-mail adresa i/ili lozinka nisu ispravni." #: account/forms.py:102 msgid "The username and/or password you specified are not correct." msgstr "Korisničko ime i/ili lozinka nisu ispravni." #: account/forms.py:113 account/forms.py:279 account/forms.py:439 #: account/forms.py:517 msgid "E-mail address" msgstr "E-mail adresa" #: account/forms.py:117 account/forms.py:316 account/forms.py:436 #: account/forms.py:512 msgid "E-mail" msgstr "E-mail" #: account/forms.py:120 account/forms.py:123 account/forms.py:269 #: account/forms.py:272 msgid "Username" msgstr "Korisničko ime" #: account/forms.py:133 msgid "Username or e-mail" msgstr "Korisničko ime ili e-mail" #: account/forms.py:136 msgctxt "field label" msgid "Login" msgstr "Prijava" #: account/forms.py:307 #, fuzzy #| msgid "E-mail (optional)" msgid "E-mail (again)" msgstr "E-mail (neobavezno)" #: account/forms.py:311 #, fuzzy #| msgid "email confirmation" msgid "E-mail address confirmation" msgstr "E-mail potvrda" #: account/forms.py:319 msgid "E-mail (optional)" msgstr "E-mail (neobavezno)" #: account/forms.py:359 #, fuzzy #| msgid "You must type the same password each time." msgid "You must type the same email each time." msgstr "Potrebno je upisati istu lozinku svaki put." #: account/forms.py:384 account/forms.py:499 msgid "Password (again)" msgstr "Lozinka (ponovno)" #: account/forms.py:448 msgid "This e-mail address is already associated with this account." msgstr "E-mail adresa je već registrirana s ovim korisničkim računom." #: account/forms.py:451 msgid "This e-mail address is already associated with another account." msgstr "E-mail adresa je već registrirana s drugim korisničkim računom." #: account/forms.py:453 #, fuzzy, python-format #| msgid "Your account has no verified e-mail address." msgid "You cannot add more than %d e-mail addresses." msgstr "Vaš korisnički račun nema potvrđenu e-mail adresu." #: account/forms.py:478 msgid "Current Password" msgstr "Trenutna lozinka" #: account/forms.py:480 account/forms.py:570 msgid "New Password" msgstr "Nova lozinka" #: account/forms.py:481 account/forms.py:571 msgid "New Password (again)" msgstr "Nova lozinka (ponovno)" #: account/forms.py:489 msgid "Please type your current password." msgstr "Molimo unesite trenutnu lozinku." #: account/forms.py:529 msgid "The e-mail address is not assigned to any user account" msgstr "Upisana e-mail adresa nije dodijeljena niti jednom korisničkom računu" #: account/forms.py:592 msgid "The password reset token was invalid." msgstr "" #: account/models.py:22 msgid "user" msgstr "korisnik" #: account/models.py:28 account/models.py:83 msgid "e-mail address" msgstr "e-mail adresa" #: account/models.py:30 msgid "verified" msgstr "potvrđena" #: account/models.py:31 msgid "primary" msgstr "primarna" #: account/models.py:36 msgid "email address" msgstr "E-mail adresa" #: account/models.py:37 msgid "email addresses" msgstr "E-mail adrese" #: account/models.py:86 msgid "created" msgstr "" #: account/models.py:87 msgid "sent" msgstr "" #: account/models.py:88 socialaccount/models.py:58 msgid "key" msgstr "" #: account/models.py:93 msgid "email confirmation" msgstr "E-mail potvrda" #: account/models.py:94 msgid "email confirmations" msgstr "E-mail potvrde" #: socialaccount/adapter.py:26 #, python-format msgid "" "An account already exists with this e-mail address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Korisnički račun s ovom e-mail adresom već postoji. Molimo da se prvo " "ulogirate pod tim korisničkim računom i spojite svoj %s račun" #: socialaccount/adapter.py:131 msgid "Your account has no password set up." msgstr "Vaš korisnički račun nema postavljenu lozinku." #: socialaccount/adapter.py:138 msgid "Your account has no verified e-mail address." msgstr "Vaš korisnički račun nema potvrđenu e-mail adresu." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Korisnički računi" #: socialaccount/models.py:41 socialaccount/models.py:84 msgid "provider" msgstr "" #: socialaccount/models.py:45 msgid "name" msgstr "naziv" #: socialaccount/models.py:47 msgid "client id" msgstr "" #: socialaccount/models.py:49 msgid "App ID, or consumer key" msgstr "" #: socialaccount/models.py:52 msgid "secret key" msgstr "" #: socialaccount/models.py:55 msgid "API secret, client secret, or consumer secret" msgstr "" #: socialaccount/models.py:58 msgid "Key" msgstr "" #: socialaccount/models.py:74 msgid "social application" msgstr "" #: socialaccount/models.py:75 msgid "social applications" msgstr "" #: socialaccount/models.py:105 msgid "uid" msgstr "" #: socialaccount/models.py:107 msgid "last login" msgstr "" #: socialaccount/models.py:108 msgid "date joined" msgstr "" #: socialaccount/models.py:109 msgid "extra data" msgstr "" #: socialaccount/models.py:113 msgid "social account" msgstr "" #: socialaccount/models.py:114 msgid "social accounts" msgstr "" #: socialaccount/models.py:139 msgid "token" msgstr "" #: socialaccount/models.py:140 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "" #: socialaccount/models.py:144 msgid "token secret" msgstr "" #: socialaccount/models.py:145 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "" #: socialaccount/models.py:148 msgid "expires at" msgstr "" #: socialaccount/models.py:153 msgid "social application token" msgstr "" #: socialaccount/models.py:154 msgid "social application tokens" msgstr "" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "" #: socialaccount/providers/oauth/client.py:85 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Neispravan odaziv pri dohvatu tokena zahtjeva od \\\"%s\\\"." #: socialaccount/providers/oauth/client.py:117 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Neispravan odaziv pri dohvatu pristupnog tokena od \\\"%s\\\"." #: socialaccount/providers/oauth/client.py:138 #, python-format msgid "No request token saved for \"%s\"." msgstr "Ne postoji pohranjeni token za \\\"%s\\\"." #: socialaccount/providers/oauth/client.py:189 #, python-format msgid "No access token saved for \"%s\"." msgstr "Token za pristup za \\\"%s\\\" nije pohranjen." #: socialaccount/providers/oauth/client.py:210 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Nemate pristup zaštičenim sadržajima na \\\"%s\\\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:8 msgid "Account Inactive" msgstr "Račun je neaktivan" #: templates/account/account_inactive.html:10 msgid "This account is inactive." msgstr "Ovaj korisnički račun je neaktivan." #: templates/account/email.html:5 templates/account/email.html:8 msgid "E-mail Addresses" msgstr "E-mail adrese" #: templates/account/email.html:10 msgid "The following e-mail addresses are associated with your account:" msgstr "Slijedeće e-mail adrese su povezane sa vašim korisničkim računom" #: templates/account/email.html:24 msgid "Verified" msgstr "Potvrđena" #: templates/account/email.html:26 msgid "Unverified" msgstr "Nepotvrđena" #: templates/account/email.html:28 msgid "Primary" msgstr "Primarna" #: templates/account/email.html:34 msgid "Make Primary" msgstr "Označi kao primarnu" #: templates/account/email.html:35 msgid "Re-send Verification" msgstr "Ponovno pošalji e-mail za potvrdu" #: templates/account/email.html:36 templates/socialaccount/connections.html:35 msgid "Remove" msgstr "Ukloni" #: templates/account/email.html:43 msgid "Warning:" msgstr "Pažnja:" #: templates/account/email.html:43 msgid "" "You currently do not have any e-mail address set up. You should really add " "an e-mail address so you can receive notifications, reset your password, etc." msgstr "" "Trenutno nemate postavljenu niti jednu e-mail adresu. Postavite e-mail " "adresu kako biste mogli primati obavijesti, promijeniti lozinku i slično." #: templates/account/email.html:48 msgid "Add E-mail Address" msgstr "Dodaj e-mail adresu" #: templates/account/email.html:53 msgid "Add E-mail" msgstr "Dodaj e-mail" #: templates/account/email.html:63 msgid "Do you really want to remove the selected e-mail address?" msgstr "Da li zaista želite ukloniti e-mail adresu?" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because user %(user_display)s at " #| "%(site_domain)s has given yours as an e-mail address to connect their " #| "account.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s\n" msgid "" "You're receiving this e-mail because user %(user_display)s has given your e-" "mail address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "Pozdravi od %(site_name)s!\n" "\n" "Primili ste ovaj e-mail jer je korisnik %(user_display)s na stranici " "%(site_domain)s upisao ovu e-mail adresu kao svoju.\n" "\n" "Za potvrdu, kliknite %(activate_url)s\n" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your E-mail Address" msgstr "Potvrdite vašu e-mail adresu" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account at %(site_domain)s.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this e-mail because you or someone else has requested a " "password for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Pozdravi od %(site_name)s!\n" "\n" "Primili ste ovaj e-mail jer ste vi ili netko drugi zatražili lozinku za vaš " "korisnički račun na %(site_domain)s.\n" "Ako niste zatražili resetiranje lozinke, slobodno zanemarite ovaj e-mail. " "Kliknite na sljedeći link za resetiranje lozinke." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "Za slučaj da ste zaboravili, vaše korisničko ime je %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 msgid "Password Reset E-mail" msgstr "E-mail za resetiranje lozinke" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm E-mail Address" msgstr "Potvrdite vašu e-mail adresu" #: templates/account/email_confirm.html:16 #, python-format msgid "" "Please confirm that %(email)s is an e-mail " "address for user %(user_display)s." msgstr "" "Molimo potvrdite da %(email)s je e-mail " "adresa za korisnika %(user_display)s." #: templates/account/email_confirm.html:20 msgid "Confirm" msgstr "Potvrda" #: templates/account/email_confirm.html:27 #, python-format msgid "" "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgstr "" "Ovaj link za potvrdu je istekao ili je neispravan. Zatražite novi e-mail za potvrdu." #: templates/account/login.html:6 templates/account/login.html:10 #: templates/account/login.html:43 msgid "Sign In" msgstr "Prijava" #: templates/account/login.html:15 #, python-format msgid "" "Please sign in with one\n" "of your existing third party accounts. Or, sign " "up\n" "for a %(site_name)s account and sign in below:" msgstr "" "Molimo prijavite se s jednim od vaših postojećih računa društvenih mreža ili " "se registrirajte za korisnički račun na " "%(site_name)s i prijavite se." #: templates/account/login.html:25 msgid "or" msgstr "ili" #: templates/account/login.html:32 #, python-format msgid "" "If you have not created an account yet, then please\n" "sign up first." msgstr "" "Ukoliko još niste napravili korisnički račun, prvo se registrirajte." #: templates/account/login.html:42 templates/account/password_change.html:14 msgid "Forgot Password?" msgstr "Zaboravili ste lozinku?" #: templates/account/logout.html:5 templates/account/logout.html:8 #: templates/account/logout.html:17 msgid "Sign Out" msgstr "Odjava" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Jeste li sigurni da se želite odjaviti?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary e-mail address (%(email)s)." msgstr "Nije moguće ukloniti vašu primarnu e-mail adresu %(email)s " #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation e-mail sent to %(email)s." msgstr "E-mail s linkom za potvrdu registracije je poslan na %(email)s" #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "Potvrdili ste e-mail adresu %(email)s." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed e-mail address %(email)s." msgstr "Uklonjena e-mail adresa %(email)s." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Uspješno ste prijavljeni kao %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Uspješno ste se odjavili." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Lozinka je uspješno promijenjena." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Lozinka je uspješno postavljena." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary e-mail address set." msgstr "Primarna e-mail adresa je postavljena" #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary e-mail address must be verified." msgstr "Vaša primarna adresa more biti potvrđena." #: templates/account/password_change.html:5 #: templates/account/password_change.html:8 #: templates/account/password_change.html:13 #: templates/account/password_reset_from_key.html:4 #: templates/account/password_reset_from_key.html:7 #: templates/account/password_reset_from_key_done.html:4 #: templates/account/password_reset_from_key_done.html:7 msgid "Change Password" msgstr "Promjena lozinke" #: templates/account/password_reset.html:6 #: templates/account/password_reset.html:10 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:9 msgid "Password Reset" msgstr "Resetiranje lozinke" #: templates/account/password_reset.html:15 msgid "" "Forgotten your password? Enter your e-mail address below, and we'll send you " "an e-mail allowing you to reset it." msgstr "" "Zaboravili ste lozinku? Unesite vašu e-mail adresu i poslati ćemo vam e-mail " "uz pomoć kojeg ćete promijeniti lozinku." #: templates/account/password_reset.html:20 msgid "Reset My Password" msgstr "Resetiraj moju lozinku" #: templates/account/password_reset.html:23 msgid "Please contact us if you have any trouble resetting your password." msgstr "Molimo konktaktirajte nas ukoliko imate problema pri promjeni lozinke." #: templates/account/password_reset_done.html:15 msgid "" "We have sent you an e-mail. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Poslali smo vam e-mail. Molimo kontaktirajte nas ako ga ne primite unutar " "nekoliko sljedećih minuta." #: templates/account/password_reset_from_key.html:7 msgid "Bad Token" msgstr "Neispravan token" #: templates/account/password_reset_from_key.html:11 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Link za poništavanje lozinke je nevažeći, vjerojatno jer je već bio " "korišten. Molimo vas ponovite zahtjev za " "resetiranje lozinke." #: templates/account/password_reset_from_key.html:17 msgid "change password" msgstr "promjena lozinke" #: templates/account/password_reset_from_key.html:20 #: templates/account/password_reset_from_key_done.html:8 msgid "Your password is now changed." msgstr "Lozinka je uspješno promjenjena." #: templates/account/password_set.html:5 templates/account/password_set.html:8 #: templates/account/password_set.html:13 msgid "Set Password" msgstr "Postavljanje lozinke" #: templates/account/signup.html:5 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Registracija" #: templates/account/signup.html:8 templates/account/signup.html:18 #: templates/socialaccount/signup.html:8 templates/socialaccount/signup.html:19 msgid "Sign Up" msgstr "Registracija" #: templates/account/signup.html:10 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "" "Već imate korisnički račun? Prijavite se!" #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:8 msgid "Sign Up Closed" msgstr "Prijave zatvorene" #: templates/account/signup_closed.html:10 msgid "We are sorry, but the sign up is currently closed." msgstr "Na žalost, registracija je privremeno nedostupna." #: templates/account/snippets/already_logged_in.html:5 msgid "Note" msgstr "Napomena" #: templates/account/snippets/already_logged_in.html:5 #, python-format msgid "you are already logged in as %(user_display)s." msgstr "već ste prijavljeni kao %(user_display)s." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:8 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:8 msgid "Verify Your E-mail Address" msgstr "Potvrdite vašu e-mail adresu" #: templates/account/verification_sent.html:10 msgid "" "We have sent an e-mail to you for verification. Follow the link provided to " "finalize the signup process. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Poslali smo e-mail u svrhu potvrde. Sljedite dani link za završetak postupka " "registracije. Molimo kontaktirajte nas ukoliko ga ne primite unutar " "sljedećih nekoliko minuta." #: templates/account/verified_email_required.html:12 msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your e-mail address. " msgstr "" "Ovaj dio web stranice zahtjeva da potvrdite da jeste tko tvrdite da jeste. " "Zbog toga je nužno da potvrdite da ste vi vlasnik dane e-mail adrese." #: templates/account/verified_email_required.html:16 msgid "" "We have sent an e-mail to you for\n" "verification. Please click on the link inside this e-mail. Please\n" "contact us if you do not receive it within a few minutes." msgstr "" "Poslali smo e-mail na vašu adresu u svrhu potvrde. Molimo kliknite na link " "unutar e-maila.\n" "Molimo kontaktirajte nas ako ga ne primite unutar nekoliko sljedećih minuta." #: templates/account/verified_email_required.html:20 #, python-format msgid "" "Note: you can still change your e-" "mail address." msgstr "" "Napomena: još uvijek možete izmijeniti vašu e-mail adresu." #: templates/openid/login.html:9 msgid "OpenID Sign In" msgstr "Prijava s OpenID" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:8 msgid "Social Network Login Failure" msgstr "Greška pri prijavi s računom društvene mreže" #: templates/socialaccount/authentication_error.html:10 msgid "" "An error occurred while attempting to login via your social network account." msgstr "Došlo je do greške pri prijavi s vašim računom društvene mreže." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:8 msgid "Account Connections" msgstr "Povezani računi" #: templates/socialaccount/connections.html:11 msgid "" "You can sign in to your account using any of the following third party " "accounts:" msgstr "" "Možete se prijaviti u vaš korisnički račun koristeći jedan od sljedećih " "povezanih računa:" #: templates/socialaccount/connections.html:43 msgid "" "You currently have no social network accounts connected to this account." msgstr "" "Trenutno nemate niti jedan račun s društvenih mreža povezan s trenutnim " "korisničkim računom." #: templates/socialaccount/connections.html:46 msgid "Add a 3rd Party Account" msgstr "Dodaj račun društvenih mreža." #: templates/socialaccount/login.html:6 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:8 #, python-format msgid "You are about to connect a new third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:10 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:12 #, python-format msgid "You are about to sign in using a third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Prijava otkazana" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Odlučili ste da se ne želite prijaviti na našu stranicu koristeći jedan od " "vaših postojećih računa s društvenih mreža. Ako je to bila greška, molimo " "kliknite i prijavite se." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "Račun društvene mreže je povezan" #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "Korisnički račun društvene mreže je već povezan s drugim računom." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Račun društvene mreže je isključen" #: templates/socialaccount/signup.html:10 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Odabrali ste da ćete koristiti vaš %(provider_name)s račun za prijavu u " "stranicu %(site_name)s. Kao posljednji korak, molimo vas ispunite sljedeći " "obrazac:" #~ msgid "Account" #~ msgstr "Korisnički račun" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "Korisničko ime i/ili zaporka nisu ispravni." #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "Korisničko ime može sadržavati samo slova, brojeve i @/./+/-/_." #~ msgid "This username is already taken. Please choose another." #~ msgstr "" #~ "Korisničko ime je već zauzeto. Molimo izaberite drugo korisničko ime." #, fuzzy #~| msgid "Sign In" #~ msgid "Shopify Sign In" #~ msgstr "Prijava" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "Potvrdili ste da je %(email)s e-mail " #~ "adresa za korisnika %(user_display)s." django-allauth-0.47.0/allauth/locale/hu/000077500000000000000000000000001415442050100177755ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/hu/LC_MESSAGES/000077500000000000000000000000001415442050100215625ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/hu/LC_MESSAGES/django.po000066400000000000000000000617201415442050100233720ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-12-09 08:41-0600\n" "PO-Revision-Date: 2015-05-08 22:42+0100\n" "Last-Translator: Tamás Makó \n" "Language-Team: \n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.7.6\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: account/adapter.py:45 msgid "Username can not be used. Please use other username." msgstr "Ez a felhasználói azonosító nem használható. Kérlek válassz másikat!" #: account/adapter.py:51 msgid "Too many failed login attempts. Try again later." msgstr "" #: account/adapter.py:53 msgid "A user is already registered with this e-mail address." msgstr "Egy felhasználó már regisztrált ezzel az email címmel." #: account/adapter.py:300 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "A jelszónak minimum {0} hosszúnak kell lennnie." #: account/apps.py:7 msgid "Accounts" msgstr "Felhasználók" #: account/forms.py:59 account/forms.py:413 msgid "You must type the same password each time." msgstr "Ugyanazt a jelszót kell megadni mindannyiszor." #: account/forms.py:92 account/forms.py:381 account/forms.py:498 msgid "Password" msgstr "Jelszó" #: account/forms.py:93 msgid "Remember Me" msgstr "Emlékezz rám" #: account/forms.py:97 msgid "This account is currently inactive." msgstr "A felhasználó jelenleg nem aktív." #: account/forms.py:99 msgid "The e-mail address and/or password you specified are not correct." msgstr "A megadott email vagy a jelszó hibás." #: account/forms.py:102 msgid "The username and/or password you specified are not correct." msgstr "A megadott felhasználó vagy a jelszó hibás." #: account/forms.py:113 account/forms.py:279 account/forms.py:439 #: account/forms.py:517 msgid "E-mail address" msgstr "Email" #: account/forms.py:117 account/forms.py:316 account/forms.py:436 #: account/forms.py:512 msgid "E-mail" msgstr "Email" #: account/forms.py:120 account/forms.py:123 account/forms.py:269 #: account/forms.py:272 msgid "Username" msgstr "Felhasználó azonosító" #: account/forms.py:133 msgid "Username or e-mail" msgstr "Felhasználó azonosító vagy email" #: account/forms.py:136 msgctxt "field label" msgid "Login" msgstr "Bejelentkezés" #: account/forms.py:307 #, fuzzy #| msgid "E-mail (optional)" msgid "E-mail (again)" msgstr "Email (nem kötelező)" #: account/forms.py:311 #, fuzzy #| msgid "E-mail address" msgid "E-mail address confirmation" msgstr "Email" #: account/forms.py:319 msgid "E-mail (optional)" msgstr "Email (nem kötelező)" #: account/forms.py:359 #, fuzzy #| msgid "You must type the same password each time." msgid "You must type the same email each time." msgstr "Ugyanazt a jelszót kell megadni mindannyiszor." #: account/forms.py:384 account/forms.py:499 msgid "Password (again)" msgstr "Jelszó (ismét)" #: account/forms.py:448 msgid "This e-mail address is already associated with this account." msgstr "Ez az email cím már hozzá van rendelve ehhez a felhasználóhoz." #: account/forms.py:451 msgid "This e-mail address is already associated with another account." msgstr "Ez az email cím már hozzá van rendelve egy másik felhasználóhoz." #: account/forms.py:453 #, fuzzy, python-format #| msgid "Your account has no verified e-mail address." msgid "You cannot add more than %d e-mail addresses." msgstr "A felhasználódnak nincs ellenőrzött email címe." #: account/forms.py:478 msgid "Current Password" msgstr "Jelenlegi jelszó" #: account/forms.py:480 account/forms.py:570 msgid "New Password" msgstr "Új jelszó" #: account/forms.py:481 account/forms.py:571 msgid "New Password (again)" msgstr "Új jelszó (ismét)" #: account/forms.py:489 msgid "Please type your current password." msgstr "Kérlek add meg az aktuális jelszavadat!" #: account/forms.py:529 msgid "The e-mail address is not assigned to any user account" msgstr "Az email cím nincs hozzárendelve egyetlen felhasználóhoz sem" #: account/forms.py:592 msgid "The password reset token was invalid." msgstr "" #: account/models.py:22 msgid "user" msgstr "" #: account/models.py:28 account/models.py:83 msgid "e-mail address" msgstr "" #: account/models.py:30 msgid "verified" msgstr "" #: account/models.py:31 msgid "primary" msgstr "" #: account/models.py:36 msgid "email address" msgstr "" #: account/models.py:37 msgid "email addresses" msgstr "" #: account/models.py:86 msgid "created" msgstr "" #: account/models.py:87 msgid "sent" msgstr "" #: account/models.py:88 socialaccount/models.py:58 msgid "key" msgstr "" #: account/models.py:93 msgid "email confirmation" msgstr "" #: account/models.py:94 msgid "email confirmations" msgstr "" #: socialaccount/adapter.py:26 #, python-format msgid "" "An account already exists with this e-mail address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Ezzel az email címmel már létezik egy felhasználó . Először jelentkezz be, " "majd kapcsold össze a(z) %s felhasználóval." #: socialaccount/adapter.py:131 msgid "Your account has no password set up." msgstr "A felhasználódnak nincs beállított jelszava." #: socialaccount/adapter.py:138 msgid "Your account has no verified e-mail address." msgstr "A felhasználódnak nincs ellenőrzött email címe." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Közösségi Felhasználók" #: socialaccount/models.py:41 socialaccount/models.py:84 msgid "provider" msgstr "" #: socialaccount/models.py:45 msgid "name" msgstr "" #: socialaccount/models.py:47 msgid "client id" msgstr "" #: socialaccount/models.py:49 msgid "App ID, or consumer key" msgstr "" #: socialaccount/models.py:52 msgid "secret key" msgstr "" #: socialaccount/models.py:55 msgid "API secret, client secret, or consumer secret" msgstr "" #: socialaccount/models.py:58 msgid "Key" msgstr "" #: socialaccount/models.py:74 msgid "social application" msgstr "" #: socialaccount/models.py:75 msgid "social applications" msgstr "" #: socialaccount/models.py:105 msgid "uid" msgstr "" #: socialaccount/models.py:107 msgid "last login" msgstr "" #: socialaccount/models.py:108 msgid "date joined" msgstr "" #: socialaccount/models.py:109 msgid "extra data" msgstr "" #: socialaccount/models.py:113 msgid "social account" msgstr "" #: socialaccount/models.py:114 msgid "social accounts" msgstr "" #: socialaccount/models.py:139 msgid "token" msgstr "" #: socialaccount/models.py:140 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "" #: socialaccount/models.py:144 msgid "token secret" msgstr "" #: socialaccount/models.py:145 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "" #: socialaccount/models.py:148 msgid "expires at" msgstr "" #: socialaccount/models.py:153 msgid "social application token" msgstr "" #: socialaccount/models.py:154 msgid "social application tokens" msgstr "" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "" #: socialaccount/providers/oauth/client.py:85 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "" #: socialaccount/providers/oauth/client.py:117 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "" #: socialaccount/providers/oauth/client.py:138 #, python-format msgid "No request token saved for \"%s\"." msgstr "" #: socialaccount/providers/oauth/client.py:189 #, python-format msgid "No access token saved for \"%s\"." msgstr "" #: socialaccount/providers/oauth/client.py:210 #, python-format msgid "No access to private resources at \"%s\"." msgstr "" #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:8 msgid "Account Inactive" msgstr "Felhasználó nem aktív" #: templates/account/account_inactive.html:10 msgid "This account is inactive." msgstr "A felhasználó nem aktív." #: templates/account/email.html:5 templates/account/email.html:8 msgid "E-mail Addresses" msgstr "Email címek" #: templates/account/email.html:10 msgid "The following e-mail addresses are associated with your account:" msgstr "A következő email címek tartoznak a felhasználódhoz:" #: templates/account/email.html:24 msgid "Verified" msgstr "Ellenőrzött" #: templates/account/email.html:26 msgid "Unverified" msgstr "Nem ellenőrzött" #: templates/account/email.html:28 msgid "Primary" msgstr "Elsődleges" #: templates/account/email.html:34 msgid "Make Primary" msgstr "Legyen elsődleges" #: templates/account/email.html:35 msgid "Re-send Verification" msgstr "Ellenőrzés újraküldése" #: templates/account/email.html:36 templates/socialaccount/connections.html:35 msgid "Remove" msgstr "Töröl" #: templates/account/email.html:43 msgid "Warning:" msgstr "Figyelem:" #: templates/account/email.html:43 msgid "" "You currently do not have any e-mail address set up. You should really add " "an e-mail address so you can receive notifications, reset your password, etc." msgstr "" "Jelenleg nincs egyetlen email címed sem beállítva. Nagyon fontos lenne, " "hiszen csak így kaphatsz értesítéseket és így tudod a jelszavadat " "megváltoztatni." #: templates/account/email.html:48 msgid "Add E-mail Address" msgstr "Új email cím" #: templates/account/email.html:53 msgid "Add E-mail" msgstr "Új email" #: templates/account/email.html:63 msgid "Do you really want to remove the selected e-mail address?" msgstr "Tényleg törölni akarod a kijelölt email címet?" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "User %(user_display)s at %(site_name)s has given this as an email " #| "address.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s\n" msgid "" "You're receiving this e-mail because user %(user_display)s has given your e-" "mail address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "A(z) %(user_display)s felhasználó a(z) %(site_name)s oldalon ezt az email " "címet adta meg.\n" "\n" "Megerősítéshez látogasd meg ezt az oldalt %(activate_url)s\n" #: templates/account/email/email_confirmation_subject.txt:3 #, fuzzy #| msgid "Confirm E-mail Address" msgid "Please Confirm Your E-mail Address" msgstr "Email cím megerősítése" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account at %(site_domain)s.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this e-mail because you or someone else has requested a " "password for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Azért kaptad ezt a levelet, mert te vagy valaki más jelszócserét kért a(z) " "%(site_domain)s oldalon.\n" "Nyugodtan hagyd levelünket figyelmen kívül, ha nem te kérted. A jelszó " "cseréjéhez kövesd az alábbi linket." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "Ha esetleg nem emlékeznél pontosan, a felhasználód %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 msgid "Password Reset E-mail" msgstr "Jelszó csere email" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm E-mail Address" msgstr "Email cím megerősítése" #: templates/account/email_confirm.html:16 #, python-format msgid "" "Please confirm that %(email)s is an e-mail " "address for user %(user_display)s." msgstr "" "Kérlek erősítsd meg, hogy a(z) %(email)s " "email a(z) %(user_display)s felhasználóhoz tartozik." #: templates/account/email_confirm.html:20 msgid "Confirm" msgstr "Megerősítés" #: templates/account/email_confirm.html:27 #, python-format msgid "" "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgstr "" "Az email visszaigazolás címe már lejárt vagy érvénytelen. Itt kérhetsz újat.\"" #: templates/account/login.html:6 templates/account/login.html:10 #: templates/account/login.html:43 msgid "Sign In" msgstr "Belépés" #: templates/account/login.html:15 #, python-format msgid "" "Please sign in with one\n" "of your existing third party accounts. Or, sign " "up\n" "for a %(site_name)s account and sign in below:" msgstr "" "Kérlek jelentkezz be\n" "az egyik felhasználóddal vagy regisztrálj\n" "új %(site_name)s felhasználót és használd azt:" #: templates/account/login.html:25 msgid "or" msgstr "vagy" #: templates/account/login.html:32 #, python-format msgid "" "If you have not created an account yet, then please\n" "sign up first." msgstr "" "Ha még nem rendelkezel felhasználóval, akkor\n" "először regisztrálnod kell." #: templates/account/login.html:42 templates/account/password_change.html:14 msgid "Forgot Password?" msgstr "Elfelejtett jelszó?" #: templates/account/logout.html:5 templates/account/logout.html:8 #: templates/account/logout.html:17 msgid "Sign Out" msgstr "Kilépés" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Biztosan kijelentkezel?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary e-mail address (%(email)s)." msgstr "Az elsődleges email cím (%(email)s) nem törölhető." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation e-mail sent to %(email)s." msgstr "Megerősítő levelet küldtünk a(z) %(email)s címre." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "A(z) %(email)s cím visszaigazolása megtörtént." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed e-mail address %(email)s." msgstr "%(email)s email cím törölve." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Sikeres bejelentkezés, mint %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Sikeresen kijelentkezés." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Jelszó sikeresen megváltoztatva." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Jelszó sikeresen beállítva." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary e-mail address set." msgstr "Elsődleges email cím beállítva." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary e-mail address must be verified." msgstr "Az elsődleges email címet ellenőriznunk kell." #: templates/account/password_change.html:5 #: templates/account/password_change.html:8 #: templates/account/password_change.html:13 #: templates/account/password_reset_from_key.html:4 #: templates/account/password_reset_from_key.html:7 #: templates/account/password_reset_from_key_done.html:4 #: templates/account/password_reset_from_key_done.html:7 msgid "Change Password" msgstr "Jelszócsere" #: templates/account/password_reset.html:6 #: templates/account/password_reset.html:10 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:9 msgid "Password Reset" msgstr "Új jelszó kérése" #: templates/account/password_reset.html:15 msgid "" "Forgotten your password? Enter your e-mail address below, and we'll send you " "an e-mail allowing you to reset it." msgstr "" "Elfelejtetted a jelszavadat? Add meg az email címedet és küldünk egy linket, " "ahol újat kérhetsz." #: templates/account/password_reset.html:20 msgid "Reset My Password" msgstr "Új jelszó kérése" #: templates/account/password_reset.html:23 msgid "Please contact us if you have any trouble resetting your password." msgstr "" "Kérlek vedd fel velünk a kapcsolatot, ha problémád adódik a jelszó " "beállításával." #: templates/account/password_reset_done.html:15 msgid "" "We have sent you an e-mail. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Elküldtük az emailt. Kérlek vedd fel velünk a kapcsolatot, ha nem kapod meg " "perceken belül." #: templates/account/password_reset_from_key.html:7 msgid "Bad Token" msgstr "Hibás token" #: templates/account/password_reset_from_key.html:11 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Az új jelszó kérő cím érvénytelen vagy már felhasználták. Itt tudsz újat kérni." #: templates/account/password_reset_from_key.html:17 msgid "change password" msgstr "" #: templates/account/password_reset_from_key.html:20 #: templates/account/password_reset_from_key_done.html:8 msgid "Your password is now changed." msgstr "A jelszavad megváltozott." #: templates/account/password_set.html:5 templates/account/password_set.html:8 #: templates/account/password_set.html:13 msgid "Set Password" msgstr "Jelszó beállítása" #: templates/account/signup.html:5 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Regisztráció" #: templates/account/signup.html:8 templates/account/signup.html:18 #: templates/socialaccount/signup.html:8 templates/socialaccount/signup.html:19 msgid "Sign Up" msgstr "Regisztráció" #: templates/account/signup.html:10 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "" "Van már felhasználód? Akkor itt jelentkezz be!" #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:8 msgid "Sign Up Closed" msgstr "Regisztráció lezárva" #: templates/account/signup_closed.html:10 msgid "We are sorry, but the sign up is currently closed." msgstr "Sajnáljuk, de jelenleg nem lehet regisztrálni." #: templates/account/snippets/already_logged_in.html:5 msgid "Note" msgstr "Megjegyzés" #: templates/account/snippets/already_logged_in.html:5 #, python-format msgid "you are already logged in as %(user_display)s." msgstr "Már bejelentkeztél, mint %(user_display)s." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:8 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:8 msgid "Verify Your E-mail Address" msgstr "Ellenőrizd az emailedet" #: templates/account/verification_sent.html:10 msgid "" "We have sent an e-mail to you for verification. Follow the link provided to " "finalize the signup process. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Elküldtük az ellenőrző emailt. A regisztráció befejezéséhez kövesd a benne " "található linket! Kérlek vedd fel velünk a kapcsolatot, ha az email nem " "érkezik meg perceken belül!" #: templates/account/verified_email_required.html:12 msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your e-mail address. " msgstr "" "Az oldal ezen része megköveteli, hogy ellenőrizzük\n" "a felhasználó azonosságát. Ezért most arra kérünk, \n" "hogy ellenőrizd a hozzáférésedet az email címedhez. " #: templates/account/verified_email_required.html:16 msgid "" "We have sent an e-mail to you for\n" "verification. Please click on the link inside this e-mail. Please\n" "contact us if you do not receive it within a few minutes." msgstr "" "Elküldtük az ellenőrző emailt.\n" "Az ellenőrzéshez kövesd a benne található címet! Kérlek vedd fel \n" "velünk a kapcsolatot, ha az email nem érkezik meg perceken belül!" #: templates/account/verified_email_required.html:20 #, python-format msgid "" "Note: you can still change your e-" "mail address." msgstr "" "Megjegyzés: az email címet még mindig meg tudod változtatni." #: templates/openid/login.html:9 msgid "OpenID Sign In" msgstr "OpenID bejelentkezés" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:8 msgid "Social Network Login Failure" msgstr "Közösségi hálózat bejelentkezési hiba" #: templates/socialaccount/authentication_error.html:10 msgid "" "An error occurred while attempting to login via your social network account." msgstr "" "Hiba történt, miközben megpróbáltunk bejelentkezni a közösségi " "felhasználóddal." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:8 msgid "Account Connections" msgstr "Egyéb felhasználói fiókok" #: templates/socialaccount/connections.html:11 msgid "" "You can sign in to your account using any of the following third party " "accounts:" msgstr "Az alábbi felhasználói fiókok bármelyikét használhatod belépéshez:" #: templates/socialaccount/connections.html:43 msgid "" "You currently have no social network accounts connected to this account." msgstr "Jelenleg nincs közösségi felhasználó a fiókodhoz rendelve." #: templates/socialaccount/connections.html:46 msgid "Add a 3rd Party Account" msgstr "Új közösségi felhasználó hozzáadása" #: templates/socialaccount/login.html:6 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:8 #, python-format msgid "You are about to connect a new third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:10 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:12 #, python-format msgid "You are about to sign in using a third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Bejelentkezés leállítva" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Ha a bejelntkezési folyamatot véletlenül állítottad le, itt újra megpróbálhatod." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "A közösségi felhasználó hozzárendelve." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "A közösségi felhasználó már egy másik felhasználóhoz tartozik." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "A közösségi felhasználó kapcsolat törölve." #: templates/socialaccount/signup.html:10 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "A(z) %(provider_name)s felhasználódat használod a (z) %(site_name)s " "bejelentkezés\n" "Utolsó lépésként kérlek töltsd ki az alábbi adatlapot:" #~ msgid "Account" #~ msgstr "Felhasználó" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "A megadott bejelentkezési azonosító vagy a jelszó hibás." #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "" #~ "A felhasználói azonosítók csak betűket, számokat és a @/./+/-/_ " #~ "karaktereket tartalmazhatnak." #~ msgid "This username is already taken. Please choose another." #~ msgstr "Ez a felhasználói azonosító már foglalt. Kérlek válassz másikat!" #, fuzzy #~| msgid "Sign In" #~ msgid "Shopify Sign In" #~ msgstr "Belépés" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "Sikeresen visszaigazolás. A(z) %(email)s " #~ "email a(z) %(user_display)s felhasználóhoz tartozik." #~ msgid "Thanks for using our site!" #~ msgstr "Köszönjük, hogy az oldalunkat használja!" django-allauth-0.47.0/allauth/locale/id/000077500000000000000000000000001415442050100177555ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/id/LC_MESSAGES/000077500000000000000000000000001415442050100215425ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/id/LC_MESSAGES/django.po000066400000000000000000000602361415442050100233530ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-12-09 08:41-0600\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: account/adapter.py:45 msgid "Username can not be used. Please use other username." msgstr "" "Name pengguna tidak dapat digunakan. Silahkan gunakan nama pengguna lain." #: account/adapter.py:51 msgid "Too many failed login attempts. Try again later." msgstr "Terlalu banyak percobaan masuk yang gagal. Coba lagi nanti." #: account/adapter.py:53 msgid "A user is already registered with this e-mail address." msgstr "Seorang pengguna sudah terdaftar dengan alamat e-mail ini." #: account/adapter.py:300 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Kata sandi harus memiliki panjang minimal {0} karakter." #: account/apps.py:7 msgid "Accounts" msgstr "Akun" #: account/forms.py:59 account/forms.py:413 msgid "You must type the same password each time." msgstr "Anda harus mengetikkan kata sandi yang sama setiap kali." #: account/forms.py:92 account/forms.py:381 account/forms.py:498 msgid "Password" msgstr "Kata sandi" #: account/forms.py:93 msgid "Remember Me" msgstr "Ingat Saya" #: account/forms.py:97 msgid "This account is currently inactive." msgstr "Akun ini sedang tidak aktif." #: account/forms.py:99 msgid "The e-mail address and/or password you specified are not correct." msgstr "Alamat e-mail dan/atau kata sandi yang anda masukkan tidak benar." #: account/forms.py:102 msgid "The username and/or password you specified are not correct." msgstr "Nama pengguna dan/atau kata sandi yang anda masukkan tidak benar." #: account/forms.py:113 account/forms.py:279 account/forms.py:439 #: account/forms.py:517 msgid "E-mail address" msgstr "Alamat e-mail" #: account/forms.py:117 account/forms.py:316 account/forms.py:436 #: account/forms.py:512 msgid "E-mail" msgstr "E-mail" #: account/forms.py:120 account/forms.py:123 account/forms.py:269 #: account/forms.py:272 msgid "Username" msgstr "Nama pengguna" #: account/forms.py:133 msgid "Username or e-mail" msgstr "Nama pengguna atau e-mail" #: account/forms.py:136 msgctxt "field label" msgid "Login" msgstr "Masuk" #: account/forms.py:307 msgid "E-mail (again)" msgstr "E-mail (lagi)" #: account/forms.py:311 msgid "E-mail address confirmation" msgstr "Konfirmasi alamat e-mail" #: account/forms.py:319 msgid "E-mail (optional)" msgstr "E-mail (opsional)" #: account/forms.py:359 msgid "You must type the same email each time." msgstr "Anda harus mengetikkan e-mail yang sama setiap kali." #: account/forms.py:384 account/forms.py:499 msgid "Password (again)" msgstr "Kata sandi (lagi)" #: account/forms.py:448 msgid "This e-mail address is already associated with this account." msgstr "Alamat e-mail ini sudah terhubung dengan akun ini." #: account/forms.py:451 msgid "This e-mail address is already associated with another account." msgstr "Alamat e-mail ini sudah terhubung dengan akun lain." #: account/forms.py:453 #, python-format msgid "You cannot add more than %d e-mail addresses." msgstr "Anda tidak dapat menambahkan lebih dari %d alamat e-mail." #: account/forms.py:478 msgid "Current Password" msgstr "Kata sandi saat ini" #: account/forms.py:480 account/forms.py:570 msgid "New Password" msgstr "Kata sandi baru" #: account/forms.py:481 account/forms.py:571 msgid "New Password (again)" msgstr "Kata sandi baru (lagi)" #: account/forms.py:489 msgid "Please type your current password." msgstr "Silahkan ketik kata sandi Anda saat ini." #: account/forms.py:529 msgid "The e-mail address is not assigned to any user account" msgstr "Alamat e-mail ini tidak terhubung dengan akun pengguna mana pun" #: account/forms.py:592 msgid "The password reset token was invalid." msgstr "Token untuk mengatur ulang kata sandi tidak valid." #: account/models.py:22 msgid "user" msgstr "pengguna" #: account/models.py:28 account/models.py:83 msgid "e-mail address" msgstr "alamat e-mail" #: account/models.py:30 msgid "verified" msgstr "terverifikasi" #: account/models.py:31 msgid "primary" msgstr "utama" #: account/models.py:36 msgid "email address" msgstr "alamat e-mail" #: account/models.py:37 msgid "email addresses" msgstr "alamat e-mail" #: account/models.py:86 msgid "created" msgstr "dibuat" #: account/models.py:87 msgid "sent" msgstr "dikirim" #: account/models.py:88 socialaccount/models.py:58 msgid "key" msgstr "kunci" #: account/models.py:93 msgid "email confirmation" msgstr "konfirmasi e-mail" #: account/models.py:94 msgid "email confirmations" msgstr "konfirmasi e-mail" #: socialaccount/adapter.py:26 #, python-format msgid "" "An account already exists with this e-mail address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Sudah ada akun yang menggunakan alamat e-mail ini. Silahkan masuk ke akun " "itu terlebih dahulu, lalu sambungkan akun %s Anda." #: socialaccount/adapter.py:131 msgid "Your account has no password set up." msgstr "Akun Anda tidak memiliki kata sandi." #: socialaccount/adapter.py:138 msgid "Your account has no verified e-mail address." msgstr "Akun Anda tidak memiliki alamat e-mail yang terverifikasi." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Akun Sosial" #: socialaccount/models.py:41 socialaccount/models.py:84 msgid "provider" msgstr "pemberi" #: socialaccount/models.py:45 msgid "name" msgstr "nama" #: socialaccount/models.py:47 msgid "client id" msgstr "id klien" #: socialaccount/models.py:49 msgid "App ID, or consumer key" msgstr "ID Aplikasi, atau kunci konsumen" #: socialaccount/models.py:52 msgid "secret key" msgstr "kunci rahasia" #: socialaccount/models.py:55 msgid "API secret, client secret, or consumer secret" msgstr "Kunci API, kunci klien, atau kunci konsumen" #: socialaccount/models.py:58 msgid "Key" msgstr "Kunci" #: socialaccount/models.py:74 msgid "social application" msgstr "aplikasi sosial" #: socialaccount/models.py:75 msgid "social applications" msgstr "aplikasi sosial" #: socialaccount/models.py:105 msgid "uid" msgstr "uid" #: socialaccount/models.py:107 msgid "last login" msgstr "masuk terakhir" #: socialaccount/models.py:108 msgid "date joined" msgstr "tanggal bergabung" #: socialaccount/models.py:109 msgid "extra data" msgstr "data tambahan" #: socialaccount/models.py:113 msgid "social account" msgstr "akun sosial" #: socialaccount/models.py:114 msgid "social accounts" msgstr "akun sosial" #: socialaccount/models.py:139 msgid "token" msgstr "token" #: socialaccount/models.py:140 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "\"oauth_token\" (OAuth1) atau token akses (OAuth2)" #: socialaccount/models.py:144 msgid "token secret" msgstr "rahasia token" #: socialaccount/models.py:145 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "\"oauth_token_secret\" (OAuth1) atau token refresh (OAuth2)" #: socialaccount/models.py:148 msgid "expires at" msgstr "kadaluarsa pada" #: socialaccount/models.py:153 msgid "social application token" msgstr "token aplikasi sosial" #: socialaccount/models.py:154 msgid "social application tokens" msgstr "token-token aplikasi sosial" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "Data profil tidak valid" #: socialaccount/providers/oauth/client.py:85 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Respon tidak valid saat meminta token request dari \"%s\"." #: socialaccount/providers/oauth/client.py:117 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Respon tidak valid saat meminta token akses dari \"%s\"." #: socialaccount/providers/oauth/client.py:138 #, python-format msgid "No request token saved for \"%s\"." msgstr "Tidak ada token request yang disimpan untuk \"%s\"." #: socialaccount/providers/oauth/client.py:189 #, python-format msgid "No access token saved for \"%s\"." msgstr "Tidak ada token akses yang disimpan untuk \"%s\"." #: socialaccount/providers/oauth/client.py:210 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Tidak ada akses ke sumber daya pribadi pada \"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:8 msgid "Account Inactive" msgstr "Akun Tidak Aktif" #: templates/account/account_inactive.html:10 msgid "This account is inactive." msgstr "Akun ini tidak aktif." #: templates/account/email.html:5 templates/account/email.html:8 msgid "E-mail Addresses" msgstr "Alamat E-mail" #: templates/account/email.html:10 msgid "The following e-mail addresses are associated with your account:" msgstr "Alamat-alamat e-mail berikut ini terkait dengan akun Anda:" #: templates/account/email.html:24 msgid "Verified" msgstr "Terverifikasi" #: templates/account/email.html:26 msgid "Unverified" msgstr "Tidak Terverifikasi" #: templates/account/email.html:28 msgid "Primary" msgstr "Utama" #: templates/account/email.html:34 msgid "Make Primary" msgstr "Jadikan Utama" #: templates/account/email.html:35 msgid "Re-send Verification" msgstr "Kirim Ulang Verifikasi" #: templates/account/email.html:36 templates/socialaccount/connections.html:35 msgid "Remove" msgstr "Hapus" #: templates/account/email.html:43 msgid "Warning:" msgstr "Peringatan:" #: templates/account/email.html:43 msgid "" "You currently do not have any e-mail address set up. You should really add " "an e-mail address so you can receive notifications, reset your password, etc." msgstr "" "Anda saat ini tidak memiliki alamat e-mail yang disetel. Anda seharusnya " "menambahkan alamat e-mail untuk menerima notifikasi, mereset kata sandi, dll." #: templates/account/email.html:48 msgid "Add E-mail Address" msgstr "Tambahkan Alamat E-mail" #: templates/account/email.html:53 msgid "Add E-mail" msgstr "Tambahkan E-mail" #: templates/account/email.html:63 msgid "Do you really want to remove the selected e-mail address?" msgstr "Apakah Anda benar-benar ingin menghapus alamat e-mail yang dipilih?" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "Halo dari %(site_name)s!" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "Terima kasih telah menggunakan %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, python-format msgid "" "You're receiving this e-mail because user %(user_display)s has given your e-" "mail address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "Anda menerima e-mail ini karena pengguna %(user_display)s telah memberikan " "alamat e-mail Anda untuk mendaftarkan akun di %(site_domain)s.\n" "\n" "Untuk mengkonfirmasi bahwa ini benar, kunjungi %(activate_url)s" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your E-mail Address" msgstr "Mohon Konfirmasi Alamat E-mail Anda" #: templates/account/email/password_reset_key_message.txt:4 msgid "" "You're receiving this e-mail because you or someone else has requested a " "password for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Anda menerima e-mail ini karena Anda atau orang lain telah meminta kata " "sandi untuk akun Anda.\n" "Abaikan jika Anda tidak meminta reset kata sandi. Klik link di bawah untuk " "mereset kata sandi Anda." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "Jikalau Anda lupa, nama pengguna Anda adalah %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 msgid "Password Reset E-mail" msgstr "E-mail Reset Kata Sandi" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm E-mail Address" msgstr "Konfirmasi Alamat E-mail" #: templates/account/email_confirm.html:16 #, python-format msgid "" "Please confirm that %(email)s is an e-mail " "address for user %(user_display)s." msgstr "" "Mohon konfirmasi bahwa %(email)s adalah " "alamat e-mail untuk pengguna %(user_display)s." #: templates/account/email_confirm.html:20 msgid "Confirm" msgstr "Konfirmasi" #: templates/account/email_confirm.html:27 #, python-format msgid "" "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgstr "" "Link konfirmasi e-mail ini sudah kadaluwarsa atau tidak valid. Mohon mengirimkan permintaan konfirmasi e-mail baru." #: templates/account/login.html:6 templates/account/login.html:10 #: templates/account/login.html:43 msgid "Sign In" msgstr "Masuk" #: templates/account/login.html:15 #, python-format msgid "" "Please sign in with one\n" "of your existing third party accounts. Or, sign " "up\n" "for a %(site_name)s account and sign in below:" msgstr "" "Mohon masuk dengan salah satu\n" "dari akun pihak ketiga Anda. Atau, daftar\n" "untuk akun %(site_name)s dan masuk di bawah:" #: templates/account/login.html:25 msgid "or" msgstr "atau" #: templates/account/login.html:32 #, python-format msgid "" "If you have not created an account yet, then please\n" "sign up first." msgstr "" "Jika Anda belum membuat akun, mohon\n" "daftar terlebih dahulu." #: templates/account/login.html:42 templates/account/password_change.html:14 msgid "Forgot Password?" msgstr "Lupa Kata Sandi?" #: templates/account/logout.html:5 templates/account/logout.html:8 #: templates/account/logout.html:17 msgid "Sign Out" msgstr "Keluar" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Anda yakin ingin keluar?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary e-mail address (%(email)s)." msgstr "Anda tidak dapat menghapus alamat e-mail utama Anda (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation e-mail sent to %(email)s." msgstr "E-mail konfirmasi dikirim ke %(email)s." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "Anda telah mengkonfirmasi %(email)s." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed e-mail address %(email)s." msgstr "Alamat e-mail %(email)s telah dihapus." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Berhasil masuk sebagai %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Anda telah keluar." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Kata sandi berhasil diubah." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Kata sandi berhasil setel." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary e-mail address set." msgstr "Alamat e-mail utama telah disetel." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary e-mail address must be verified." msgstr "Alamat e-mail utama Anda harus diverifikasi." #: templates/account/password_change.html:5 #: templates/account/password_change.html:8 #: templates/account/password_change.html:13 #: templates/account/password_reset_from_key.html:4 #: templates/account/password_reset_from_key.html:7 #: templates/account/password_reset_from_key_done.html:4 #: templates/account/password_reset_from_key_done.html:7 msgid "Change Password" msgstr "Ubah Kata Sandi" #: templates/account/password_reset.html:6 #: templates/account/password_reset.html:10 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:9 msgid "Password Reset" msgstr "Reset Kata Sandi" #: templates/account/password_reset.html:15 msgid "" "Forgotten your password? Enter your e-mail address below, and we'll send you " "an e-mail allowing you to reset it." msgstr "" "Lupa kata sandi Anda? Masukkan alamat e-mail Anda di bawah, dan kami akan " "mengirimkan e-mail yang membolehkan Anda untuk mengubahnya." #: templates/account/password_reset.html:20 msgid "Reset My Password" msgstr "Reset Kata Sandi Saya" #: templates/account/password_reset.html:23 msgid "Please contact us if you have any trouble resetting your password." msgstr "" "Mohon hubungi kami jika Anda mengalami masalah saat mengubah kata sandi Anda." #: templates/account/password_reset_done.html:15 msgid "" "We have sent you an e-mail. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Kami telah mengirimkan e-mail. Mohon hubungi kami jika Anda tidak " "menerimanya dalam beberapa menit." #: templates/account/password_reset_from_key.html:7 msgid "Bad Token" msgstr "Token Salah" #: templates/account/password_reset_from_key.html:11 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Link reset kata sandi tidak valid, mungkin karena telah digunakan. Silakan " "minta reset kata sandi baru." #: templates/account/password_reset_from_key.html:17 msgid "change password" msgstr "ubah kata sandi" #: templates/account/password_reset_from_key.html:20 #: templates/account/password_reset_from_key_done.html:8 msgid "Your password is now changed." msgstr "Kata sandi Anda telah diubah." #: templates/account/password_set.html:5 templates/account/password_set.html:8 #: templates/account/password_set.html:13 msgid "Set Password" msgstr "Setel Kata Sandi" #: templates/account/signup.html:5 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Daftar" #: templates/account/signup.html:8 templates/account/signup.html:18 #: templates/socialaccount/signup.html:8 templates/socialaccount/signup.html:19 msgid "Sign Up" msgstr "Daftar" #: templates/account/signup.html:10 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "Sudah memiliki akun? Silakan masuk." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:8 msgid "Sign Up Closed" msgstr "Daftar Ditutup" #: templates/account/signup_closed.html:10 msgid "We are sorry, but the sign up is currently closed." msgstr "Mohon maaf, tapi pendaftaran saat ini ditutup." #: templates/account/snippets/already_logged_in.html:5 msgid "Note" msgstr "Catatan" #: templates/account/snippets/already_logged_in.html:5 #, python-format msgid "you are already logged in as %(user_display)s." msgstr "Anda sudah masuk sebagai %(user_display)s." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:8 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:8 msgid "Verify Your E-mail Address" msgstr "Verifikasi Alamat E-mail Anda" #: templates/account/verification_sent.html:10 msgid "" "We have sent an e-mail to you for verification. Follow the link provided to " "finalize the signup process. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Kami telah mengirimkan e-mail kepada Anda untuk verifikasi. Ikuti tautan " "yang disediakan untuk menyelesaikan proses pendaftaran. Silahkan hubungi " "kami jika Anda tidak menerimanya dalam beberapa menit." #: templates/account/verified_email_required.html:12 msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your e-mail address. " msgstr "" "Bagian dari situs ini mengharuskan kami untuk memverifikasi bahwa\n" "Anda adalah apa yang Anda klaim. Untuk tujuan ini, kami mengharuskan Anda\n" "memverifikasi kepemilikan alamat e-mail Anda. " #: templates/account/verified_email_required.html:16 msgid "" "We have sent an e-mail to you for\n" "verification. Please click on the link inside this e-mail. Please\n" "contact us if you do not receive it within a few minutes." msgstr "" "Kami telah mengirimkan e-mail kepada Anda untuk\n" "verifikasi. Silakan klik tautan didalam e-mail ini. Silakan\n" "hubungi kami jika Anda tidak menerimanya dalam beberapa menit." #: templates/account/verified_email_required.html:20 #, python-format msgid "" "Note: you can still change your e-" "mail address." msgstr "" "Catatan: Anda masih bisa mengganti alamat e-mail Anda." #: templates/openid/login.html:9 msgid "OpenID Sign In" msgstr "Masuk Dengan OpenID" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:8 msgid "Social Network Login Failure" msgstr "Kegagalan Login Jejaring Sosial" #: templates/socialaccount/authentication_error.html:10 msgid "" "An error occurred while attempting to login via your social network account." msgstr "" "Terjadi kesalahan saat mencoba untuk masuk menggunakan akun jejaring sosial " "Anda." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:8 msgid "Account Connections" msgstr "Koneksi Akun" #: templates/socialaccount/connections.html:11 msgid "" "You can sign in to your account using any of the following third party " "accounts:" msgstr "" "Anda dapat masuk ke akun Anda menggunakan salah satu dari akun jejaring " "sosial berikut:" #: templates/socialaccount/connections.html:43 msgid "" "You currently have no social network accounts connected to this account." msgstr "" "Anda saat ini tidak memiliki akun jejaring sosial terhubung ke akun ini." #: templates/socialaccount/connections.html:46 msgid "Add a 3rd Party Account" msgstr "Tambahkan Akun Pihak Ketiga" #: templates/socialaccount/login.html:6 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:8 #, python-format msgid "You are about to connect a new third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:10 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:12 #, python-format msgid "You are about to sign in using a third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Login Dibatalkan" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Anda memutuskan untuk membatalkan masuk ke situs kami menggunakan salah satu " "dari akun Anda. Jika ini adalah kesalahan, silakan lanjutkan ke masuk." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "Akun sosial telah terhubung." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "Akun sosial sudah terhubung ke akun lain." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Akun sosial telah terputus." #: templates/socialaccount/signup.html:10 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Anda akan menggunakan akun %(provider_name)s untuk masuk ke\n" "%(site_name)s. Sebagai langkah akhir, silakan lengkapi formulir berikut:" django-allauth-0.47.0/allauth/locale/it/000077500000000000000000000000001415442050100177755ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/it/LC_MESSAGES/000077500000000000000000000000001415442050100215625ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/it/LC_MESSAGES/django.po000066400000000000000000000621111415442050100233650ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Translators: # guglielmo , 2014 # joke2k , 2014 # puntosit , 2014 # Sandro , 2019. msgid "" msgstr "" "Project-Id-Version: django-allauth\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-12-09 08:41-0600\n" "PO-Revision-Date: 2020-10-15 19:55+0200\n" "Last-Translator: Sandro \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 1.8.7.1\n" #: account/adapter.py:45 msgid "Username can not be used. Please use other username." msgstr "Questo username non può essere usato. Per favore scegline un altro." #: account/adapter.py:51 msgid "Too many failed login attempts. Try again later." msgstr "Troppo tentativi di accesso. Riprova più tardi." #: account/adapter.py:53 msgid "A user is already registered with this e-mail address." msgstr "Un altro utente si è già registrato con questo indirizzo e-mail." #: account/adapter.py:300 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "La password deve essere lunga almeno {0} caratteri." #: account/apps.py:7 msgid "Accounts" msgstr "Account" #: account/forms.py:59 account/forms.py:413 msgid "You must type the same password each time." msgstr "Devi digitare la stessa password." #: account/forms.py:92 account/forms.py:381 account/forms.py:498 msgid "Password" msgstr "Password" #: account/forms.py:93 msgid "Remember Me" msgstr "Ricordami" #: account/forms.py:97 msgid "This account is currently inactive." msgstr "Questo account non è attualmente attivo." #: account/forms.py:99 msgid "The e-mail address and/or password you specified are not correct." msgstr "L'indirizzo e-mail e/o la password che hai usato non sono corretti." #: account/forms.py:102 msgid "The username and/or password you specified are not correct." msgstr "Lo username e/o la password che hai usato non sono corretti." #: account/forms.py:113 account/forms.py:279 account/forms.py:439 #: account/forms.py:517 msgid "E-mail address" msgstr "Indirizzo e-mail" #: account/forms.py:117 account/forms.py:316 account/forms.py:436 #: account/forms.py:512 msgid "E-mail" msgstr "E-mail" #: account/forms.py:120 account/forms.py:123 account/forms.py:269 #: account/forms.py:272 msgid "Username" msgstr "Username" #: account/forms.py:133 msgid "Username or e-mail" msgstr "Username o e-mail" #: account/forms.py:136 msgctxt "field label" msgid "Login" msgstr "Login" #: account/forms.py:307 msgid "E-mail (again)" msgstr "E-mail (di nuovo)" #: account/forms.py:311 msgid "E-mail address confirmation" msgstr "Conferma dell'indirizzo emai" #: account/forms.py:319 msgid "E-mail (optional)" msgstr "E-mail (opzionale)" #: account/forms.py:359 msgid "You must type the same email each time." msgstr "Devi digitare la stessa password ogni volta." #: account/forms.py:384 account/forms.py:499 msgid "Password (again)" msgstr "Password (nuovamente)" #: account/forms.py:448 msgid "This e-mail address is already associated with this account." msgstr "Questo indirizzo e-mail è già associato a questo account." #: account/forms.py:451 msgid "This e-mail address is already associated with another account." msgstr "Questo indirizzo e-mail è gia associato a un altro account." #: account/forms.py:453 #, fuzzy, python-format #| msgid "Your account has no verified e-mail address." msgid "You cannot add more than %d e-mail addresses." msgstr "Non hai ancora verificato il tuo indirizzo e-mail." #: account/forms.py:478 msgid "Current Password" msgstr "Password attuale" #: account/forms.py:480 account/forms.py:570 msgid "New Password" msgstr "Nuova password" #: account/forms.py:481 account/forms.py:571 msgid "New Password (again)" msgstr "Nuova password (nuovamente)" #: account/forms.py:489 msgid "Please type your current password." msgstr "Per favore digita la tua password attuale." #: account/forms.py:529 msgid "The e-mail address is not assigned to any user account" msgstr "L'indirizzo e-mail non è assegnato a nessun account utente" #: account/forms.py:592 msgid "The password reset token was invalid." msgstr "Il codice per il reset della password non è valido." #: account/models.py:22 msgid "user" msgstr "utente" #: account/models.py:28 account/models.py:83 msgid "e-mail address" msgstr "indirizzo e-mail" #: account/models.py:30 msgid "verified" msgstr "verificato" #: account/models.py:31 msgid "primary" msgstr "primario" #: account/models.py:36 msgid "email address" msgstr "indirizzo email" #: account/models.py:37 msgid "email addresses" msgstr "indirizzi email" #: account/models.py:86 msgid "created" msgstr "creato" #: account/models.py:87 msgid "sent" msgstr "inviato" #: account/models.py:88 socialaccount/models.py:58 msgid "key" msgstr "chiave" #: account/models.py:93 msgid "email confirmation" msgstr "email di conferma" #: account/models.py:94 msgid "email confirmations" msgstr "email di conferma" #: socialaccount/adapter.py:26 #, python-format msgid "" "An account already exists with this e-mail address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Esiste già un account con questo indirizzo e-mail. Per favore entra con " "quell'account, e successivamente connetti il tuo account %s." #: socialaccount/adapter.py:131 msgid "Your account has no password set up." msgstr "Il tuo account non ha ancora nessuna password." #: socialaccount/adapter.py:138 msgid "Your account has no verified e-mail address." msgstr "Non hai ancora verificato il tuo indirizzo e-mail." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Account" #: socialaccount/models.py:41 socialaccount/models.py:84 msgid "provider" msgstr "provider" #: socialaccount/models.py:45 msgid "name" msgstr "nome" #: socialaccount/models.py:47 msgid "client id" msgstr "Id cliente" #: socialaccount/models.py:49 msgid "App ID, or consumer key" msgstr "App ID, o consumer key" #: socialaccount/models.py:52 msgid "secret key" msgstr "secret key" #: socialaccount/models.py:55 msgid "API secret, client secret, or consumer secret" msgstr "" #: socialaccount/models.py:58 msgid "Key" msgstr "Chiave" #: socialaccount/models.py:74 msgid "social application" msgstr "" #: socialaccount/models.py:75 msgid "social applications" msgstr "" #: socialaccount/models.py:105 msgid "uid" msgstr "" #: socialaccount/models.py:107 msgid "last login" msgstr "Ultimo accesso" #: socialaccount/models.py:108 msgid "date joined" msgstr "data iscrizione" #: socialaccount/models.py:109 msgid "extra data" msgstr "dati aggiuntivi" #: socialaccount/models.py:113 msgid "social account" msgstr "" #: socialaccount/models.py:114 msgid "social accounts" msgstr "" #: socialaccount/models.py:139 msgid "token" msgstr "" #: socialaccount/models.py:140 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "" #: socialaccount/models.py:144 msgid "token secret" msgstr "" #: socialaccount/models.py:145 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "" #: socialaccount/models.py:148 msgid "expires at" msgstr "scade il" #: socialaccount/models.py:153 msgid "social application token" msgstr "" #: socialaccount/models.py:154 msgid "social application tokens" msgstr "" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "Dati profilo non validi" #: socialaccount/providers/oauth/client.py:85 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Risposta non valida alla richiesta di un token da \"%s\"." #: socialaccount/providers/oauth/client.py:117 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Risposta non valida alla richiesta di un token da \"%s\"." #: socialaccount/providers/oauth/client.py:138 #, python-format msgid "No request token saved for \"%s\"." msgstr "Nessuna richiesta di token salvata per \"%s\"." #: socialaccount/providers/oauth/client.py:189 #, python-format msgid "No access token saved for \"%s\"." msgstr "Nessun token di accesso salvato per \"%s\"." #: socialaccount/providers/oauth/client.py:210 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Nessuna accesso alle risorse private a \"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:8 msgid "Account Inactive" msgstr "Account non attivo" #: templates/account/account_inactive.html:10 msgid "This account is inactive." msgstr "Questo account non è attivo." #: templates/account/email.html:5 templates/account/email.html:8 msgid "E-mail Addresses" msgstr "Indirizzi e-mail" #: templates/account/email.html:10 msgid "The following e-mail addresses are associated with your account:" msgstr "I seguenti indirizzi e-mail sono associati al tuo account:" #: templates/account/email.html:24 msgid "Verified" msgstr "Verificato" #: templates/account/email.html:26 msgid "Unverified" msgstr "Non verificato" #: templates/account/email.html:28 msgid "Primary" msgstr "Principale" #: templates/account/email.html:34 msgid "Make Primary" msgstr "Rendi Principale" #: templates/account/email.html:35 msgid "Re-send Verification" msgstr "Re-invia la Verifica" #: templates/account/email.html:36 templates/socialaccount/connections.html:35 msgid "Remove" msgstr "Rimuovi" #: templates/account/email.html:43 msgid "Warning:" msgstr "Attenzione:" #: templates/account/email.html:43 msgid "" "You currently do not have any e-mail address set up. You should really add " "an e-mail address so you can receive notifications, reset your password, etc." msgstr "" "Non hai ancora indicato nessun indirizzo e-mail. Devi inserirne uno se vuoi " "ricevere notifiche, recuperare la password, ecc." #: templates/account/email.html:48 msgid "Add E-mail Address" msgstr "Aggiungi un Indirizzo e-mail" #: templates/account/email.html:53 msgid "Add E-mail" msgstr "Aggiungi e-mail" #: templates/account/email.html:63 msgid "Do you really want to remove the selected e-mail address?" msgstr "Sei sicuro di voler rimuovere l'indirizzo e-mail selezionato?" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "Ciao da %(site_name)s!" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "Grazie per usare %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, python-format msgid "" "You're receiving this e-mail because user %(user_display)s has given your e-" "mail address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "L'Utente %(user_display)s di %(site_domain)s ha registrato questo indirizzo " "e-mail.\n" "Per confermare, clicca qui %(activate_url)s" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your E-mail Address" msgstr "Conferma l'Indirizzo E-Mail" #: templates/account/email/password_reset_key_message.txt:4 msgid "" "You're receiving this e-mail because you or someone else has requested a " "password for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Hai ricevuto questa mail perché hai richiesto la password per il tuo account " "utente.\n" "Se non hai richiesto tu il reset della password, ignora questa mail, " "altrimenti clicca sul link qui sotto per fare il reset della password." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "Nel caso tu lo abbia dimenticato, il tuo nome utente è %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 msgid "Password Reset E-mail" msgstr "E-Mail per re-impostare la password " #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm E-mail Address" msgstr "Conferma l'Indirizzo E-Mail" #: templates/account/email_confirm.html:16 #, python-format msgid "" "Please confirm that %(email)s is an e-mail " "address for user %(user_display)s." msgstr "" "Conferma che %(email)s è un indirizzo e-" "mail per l'utente %(user_display)s." #: templates/account/email_confirm.html:20 msgid "Confirm" msgstr "Conferma" #: templates/account/email_confirm.html:27 #, python-format msgid "" "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgstr "" "Questo link di conferma e-mail è scaduto o non è valido. Ti chiediamo di ripetere la richiesta di conferma via e-mail." #: templates/account/login.html:6 templates/account/login.html:10 #: templates/account/login.html:43 msgid "Sign In" msgstr "Accedi" #: templates/account/login.html:15 #, python-format msgid "" "Please sign in with one\n" "of your existing third party accounts. Or, sign " "up\n" "for a %(site_name)s account and sign in below:" msgstr "" "Per favore, accedi con uno\n" "dei tuoi account social, o registra\n" "il tuo account per %(site_name)s e accedi:" #: templates/account/login.html:25 msgid "or" msgstr "o" #: templates/account/login.html:32 #, python-format msgid "" "If you have not created an account yet, then please\n" "sign up first." msgstr "" "Se non hai ancora creato un account, \n" "Registrati." #: templates/account/login.html:42 templates/account/password_change.html:14 msgid "Forgot Password?" msgstr "Password dimenticata?" #: templates/account/logout.html:5 templates/account/logout.html:8 #: templates/account/logout.html:17 msgid "Sign Out" msgstr "Disconnetti" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Sei sicuro di volerti disconnettere?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary e-mail address (%(email)s)." msgstr "Non puoi eliminare il tuo indirizzo e-mail principale (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation e-mail sent to %(email)s." msgstr "Abbiamo inviato una conferma all’indirizzo %(email)s." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "Hai appena confermato l’indirizzo e-mail %(email)s." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed e-mail address %(email)s." msgstr "Indirizzo E-Mail rimosso %(email)s." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Ti sei collegato con successo come %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Ti sei scollegato." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Password cambiata con successo." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Password impostata correttamente." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary e-mail address set." msgstr "Indirizzo e-mail principale definito." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary e-mail address must be verified." msgstr "Dobbiamo verificare il tuo indirizzo e-mail principale." #: templates/account/password_change.html:5 #: templates/account/password_change.html:8 #: templates/account/password_change.html:13 #: templates/account/password_reset_from_key.html:4 #: templates/account/password_reset_from_key.html:7 #: templates/account/password_reset_from_key_done.html:4 #: templates/account/password_reset_from_key_done.html:7 msgid "Change Password" msgstr "Cambia la tua Password" #: templates/account/password_reset.html:6 #: templates/account/password_reset.html:10 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:9 msgid "Password Reset" msgstr "Re-imposta la Password" #: templates/account/password_reset.html:15 msgid "" "Forgotten your password? Enter your e-mail address below, and we'll send you " "an e-mail allowing you to reset it." msgstr "" "Hai dimenticato la tua password? Inserisci qui sotto l'indirizzo e-mail con " "cui ti sei registrato, ti invieremo una mail con un link per re-impostarla." #: templates/account/password_reset.html:20 msgid "Reset My Password" msgstr "Re-imposta la mia Password" #: templates/account/password_reset.html:23 msgid "Please contact us if you have any trouble resetting your password." msgstr "Se hai qualche problema a re-impostare la password, contattaci." #: templates/account/password_reset_done.html:15 msgid "" "We have sent you an e-mail. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Ti abbiamo spedito una mail. Contattaci se non la ricevi entro qualche " "minuto." #: templates/account/password_reset_from_key.html:7 msgid "Bad Token" msgstr "Token non valido" #: templates/account/password_reset_from_key.html:11 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Il link di re-impostazione della password non è valido, probabilmente è già " "stato usato. Inoltra una nuova richiesta di " "re-impostazione della password." #: templates/account/password_reset_from_key.html:17 msgid "change password" msgstr "cambia password" #: templates/account/password_reset_from_key.html:20 #: templates/account/password_reset_from_key_done.html:8 msgid "Your password is now changed." msgstr "Password cambiata." #: templates/account/password_set.html:5 templates/account/password_set.html:8 #: templates/account/password_set.html:13 msgid "Set Password" msgstr "Imposta una password" #: templates/account/signup.html:5 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Registrati" #: templates/account/signup.html:8 templates/account/signup.html:18 #: templates/socialaccount/signup.html:8 templates/socialaccount/signup.html:19 msgid "Sign Up" msgstr "Registrazione" #: templates/account/signup.html:10 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "Hai già un account valido? Accedi." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:8 msgid "Sign Up Closed" msgstr "Registrazioni Chiuse" #: templates/account/signup_closed.html:10 msgid "We are sorry, but the sign up is currently closed." msgstr "Spiacenti, le registrazioni sono per il momento sospese." #: templates/account/snippets/already_logged_in.html:5 msgid "Note" msgstr "Nota" #: templates/account/snippets/already_logged_in.html:5 #, python-format msgid "you are already logged in as %(user_display)s." msgstr "sei già collegato come %(user_display)s." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:8 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:8 msgid "Verify Your E-mail Address" msgstr "Verifica il tuo indirizzo E-Mail" #: templates/account/verification_sent.html:10 msgid "" "We have sent an e-mail to you for verification. Follow the link provided to " "finalize the signup process. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Ti abbiamo inviato una e-mail con un Link inserito all'interno. Per " "completare il procedimento di verifica clicca sul Link. Contattaci se non " "ricevi la mail entro qualche minuto." #: templates/account/verified_email_required.html:12 msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your e-mail address. " msgstr "" "Per utilizzare questa parte del sito dobbiamo verificare\n" "che sei veramente chi dici di essere. Sarà sufficiente\n" "dimostrare che hai effettivamente accesso al tuo indirizzo e-mail. " #: templates/account/verified_email_required.html:16 msgid "" "We have sent an e-mail to you for\n" "verification. Please click on the link inside this e-mail. Please\n" "contact us if you do not receive it within a few minutes." msgstr "" "Ti abbiamo inviato un messaggio e-mail di verifica.\n" "Clicca sul link contenuto nella mail.\n" "Se non dovessi ricevere il messaggio entro qualche minuto, contattaci.\n" "Grazie." #: templates/account/verified_email_required.html:20 #, python-format msgid "" "Note: you can still change your e-" "mail address." msgstr "" "Nota: Puoi cambiare in ogni " "momento l'indirizzo e-mail usato per la registrazione." #: templates/openid/login.html:9 msgid "OpenID Sign In" msgstr "Accesso con OpenID" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:8 msgid "Social Network Login Failure" msgstr "Accesso Social fallito" #: templates/socialaccount/authentication_error.html:10 msgid "" "An error occurred while attempting to login via your social network account." msgstr "" "C'è stato un errore mentre hai provato a collegarti con il tuo account " "Social Network." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:8 msgid "Account Connections" msgstr "Connessioni all'account" #: templates/socialaccount/connections.html:11 msgid "" "You can sign in to your account using any of the following third party " "accounts:" msgstr "" "Puoi collegarti al tuo account utilizzando uno dei seguenti servizi di " "autenticazione Social Network:" #: templates/socialaccount/connections.html:43 msgid "" "You currently have no social network accounts connected to this account." msgstr "Non hai account di nessun Social Network collegato a questo account." #: templates/socialaccount/connections.html:46 msgid "Add a 3rd Party Account" msgstr "Aggiungi un account di un Social Network" #: templates/socialaccount/login.html:6 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:8 #, python-format msgid "You are about to connect a new third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:10 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:12 #, python-format msgid "You are about to sign in using a third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Accesso annullato" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Hai deciso di cancellare l'accesso a questo sito usando uno dei tuoi account " "attivi. Se è stato un errore, ripeti l'Accesso." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "L'account Social Network è stato collegato." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "Questo Social Account è già collegato ad un altro account." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Social Account scollegato." #: templates/socialaccount/signup.html:10 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Stai per usare il tuo account su %(provider_name)s per effettuare il login " "su\n" "%(site_name)s. Come ultima operazione ti chiediamo di riempire il form qui " "sotto:" #~ msgid "Account" #~ msgstr "Account" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "Il login e/o la password che hai usato non sono corretti." #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "Gli username possono contenere solo lettere, cifre e @/./+/-/_." #~ msgid "This username is already taken. Please choose another." #~ msgstr "Questo username è già in uso. Per favore scegline un altro." #, fuzzy #~| msgid "Sign In" #~ msgid "Shopify Sign In" #~ msgstr "Accedi" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "Hai appena confermato che %(email)s è un " #~ "indirizzo e-mail valido per l'utente %(user_display)s." #~ msgid "Thanks for using our site!" #~ msgstr "Grazie per aver utilizzato questo Sito!" django-allauth-0.47.0/allauth/locale/ja/000077500000000000000000000000001415442050100177535ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/ja/LC_MESSAGES/000077500000000000000000000000001415442050100215405ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/ja/LC_MESSAGES/django.po000066400000000000000000000672131415442050100233530ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-12-09 08:41-0600\n" "PO-Revision-Date: 2014-08-12 00:32+0200\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" #: account/adapter.py:45 msgid "Username can not be used. Please use other username." msgstr "このユーザー名は使用できません。他のユーザー名を選んでください。" #: account/adapter.py:51 msgid "Too many failed login attempts. Try again later." msgstr "ログイン失敗が連続しています。時間が経ってからやり直してください。" #: account/adapter.py:53 msgid "A user is already registered with this e-mail address." msgstr "他のユーザーがこのメールアドレスを使用しています。" #: account/adapter.py:300 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "パスワードは {0} 文字以上の長さが必要です。" #: account/apps.py:7 msgid "Accounts" msgstr "アカウント" #: account/forms.py:59 account/forms.py:413 msgid "You must type the same password each time." msgstr "同じパスワードを入力してください。" #: account/forms.py:92 account/forms.py:381 account/forms.py:498 msgid "Password" msgstr "パスワード" #: account/forms.py:93 msgid "Remember Me" msgstr "ログインしたままにする" #: account/forms.py:97 msgid "This account is currently inactive." msgstr "このアカウントは現在無効です。" #: account/forms.py:99 msgid "The e-mail address and/or password you specified are not correct." msgstr "入力されたメールアドレスもしくはパスワードが正しくありません。" #: account/forms.py:102 msgid "The username and/or password you specified are not correct." msgstr "入力されたユーザー名もしくはパスワードが正しくありません。" #: account/forms.py:113 account/forms.py:279 account/forms.py:439 #: account/forms.py:517 msgid "E-mail address" msgstr "メールアドレス" #: account/forms.py:117 account/forms.py:316 account/forms.py:436 #: account/forms.py:512 msgid "E-mail" msgstr "メールアドレス" #: account/forms.py:120 account/forms.py:123 account/forms.py:269 #: account/forms.py:272 msgid "Username" msgstr "ユーザー名" #: account/forms.py:133 msgid "Username or e-mail" msgstr "ユーザー名またはメールアドレス" #: account/forms.py:136 msgctxt "field label" msgid "Login" msgstr "ログイン" #: account/forms.py:307 msgid "E-mail (again)" msgstr "メールアドレス(確認用)" #: account/forms.py:311 #, fuzzy #| msgid "email confirmation" msgid "E-mail address confirmation" msgstr "メールアドレスの確認" #: account/forms.py:319 msgid "E-mail (optional)" msgstr "メールアドレス(オプション)" #: account/forms.py:359 #, fuzzy #| msgid "You must type the same password each time." msgid "You must type the same email each time." msgstr "同じパスワードを入力してください。" #: account/forms.py:384 account/forms.py:499 msgid "Password (again)" msgstr "パスワード(再入力)" #: account/forms.py:448 msgid "This e-mail address is already associated with this account." msgstr "このメールアドレスはすでに登録されています。" #: account/forms.py:451 msgid "This e-mail address is already associated with another account." msgstr "このメールアドレスは別のアカウントで使用されています。" #: account/forms.py:453 #, fuzzy, python-format #| msgid "Your account has no verified e-mail address." msgid "You cannot add more than %d e-mail addresses." msgstr "確認済みのメールアドレスの登録が必要です。" #: account/forms.py:478 msgid "Current Password" msgstr "現在のパスワード" #: account/forms.py:480 account/forms.py:570 msgid "New Password" msgstr "新しいパスワード" #: account/forms.py:481 account/forms.py:571 msgid "New Password (again)" msgstr "新しいパスワード(再入力)" #: account/forms.py:489 msgid "Please type your current password." msgstr "現在のパスワードを入力してください。" #: account/forms.py:529 msgid "The e-mail address is not assigned to any user account" msgstr "このメールアドレスで登録されたユーザーアカウントがありません。" #: account/forms.py:592 msgid "The password reset token was invalid." msgstr "" #: account/models.py:22 msgid "user" msgstr "ユーザー" #: account/models.py:28 account/models.py:83 msgid "e-mail address" msgstr "メールアドレス" #: account/models.py:30 msgid "verified" msgstr "確認済み" #: account/models.py:31 msgid "primary" msgstr "メイン" #: account/models.py:36 msgid "email address" msgstr "メールアドレス" #: account/models.py:37 msgid "email addresses" msgstr "メールアドレス" #: account/models.py:86 msgid "created" msgstr "作成日時" #: account/models.py:87 msgid "sent" msgstr "送信日時" #: account/models.py:88 socialaccount/models.py:58 msgid "key" msgstr "" #: account/models.py:93 msgid "email confirmation" msgstr "メールアドレスの確認" #: account/models.py:94 msgid "email confirmations" msgstr "メールアドレスの確認" #: socialaccount/adapter.py:26 #, python-format msgid "" "An account already exists with this e-mail address. Please sign in to that " "account first, then connect your %s account." msgstr "" #: socialaccount/adapter.py:131 msgid "Your account has no password set up." msgstr "アカウントにパスワードを設定する必要があります。" #: socialaccount/adapter.py:138 msgid "Your account has no verified e-mail address." msgstr "確認済みのメールアドレスの登録が必要です。" #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "外部アカウント" #: socialaccount/models.py:41 socialaccount/models.py:84 msgid "provider" msgstr "プロバイダー" #: socialaccount/models.py:45 msgid "name" msgstr "ユーザー名" #: socialaccount/models.py:47 msgid "client id" msgstr "" #: socialaccount/models.py:49 msgid "App ID, or consumer key" msgstr "" #: socialaccount/models.py:52 msgid "secret key" msgstr "" #: socialaccount/models.py:55 msgid "API secret, client secret, or consumer secret" msgstr "" #: socialaccount/models.py:58 msgid "Key" msgstr "" #: socialaccount/models.py:74 msgid "social application" msgstr "" #: socialaccount/models.py:75 msgid "social applications" msgstr "" #: socialaccount/models.py:105 msgid "uid" msgstr "" #: socialaccount/models.py:107 msgid "last login" msgstr "" #: socialaccount/models.py:108 msgid "date joined" msgstr "" #: socialaccount/models.py:109 msgid "extra data" msgstr "" #: socialaccount/models.py:113 msgid "social account" msgstr "" #: socialaccount/models.py:114 msgid "social accounts" msgstr "" #: socialaccount/models.py:139 msgid "token" msgstr "" #: socialaccount/models.py:140 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "" #: socialaccount/models.py:144 msgid "token secret" msgstr "" #: socialaccount/models.py:145 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "" #: socialaccount/models.py:148 msgid "expires at" msgstr "" #: socialaccount/models.py:153 msgid "social application token" msgstr "" #: socialaccount/models.py:154 msgid "social application tokens" msgstr "" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "" #: socialaccount/providers/oauth/client.py:85 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "" "不正なレスポンスが返されたため、 \"%s\" からリクエストトークンを取得できませ" "んでした。" #: socialaccount/providers/oauth/client.py:117 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "" "不正なレスポンスが返されたため、 \"%s\" からアクセストークンを取得できません" "でした。" #: socialaccount/providers/oauth/client.py:138 #, python-format msgid "No request token saved for \"%s\"." msgstr "\"%s\" のリクエストトークンを保存できませんでした。" #: socialaccount/providers/oauth/client.py:189 #, python-format msgid "No access token saved for \"%s\"." msgstr "\"%s\" のアクセストークンを保存できませんでした。" #: socialaccount/providers/oauth/client.py:210 #, python-format msgid "No access to private resources at \"%s\"." msgstr "\"%s\" の情報にアクセスできませんでした。" #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:8 msgid "Account Inactive" msgstr "無効なアカウント" #: templates/account/account_inactive.html:10 msgid "This account is inactive." msgstr "このアカウントは無効です。" #: templates/account/email.html:5 templates/account/email.html:8 msgid "E-mail Addresses" msgstr "メールアドレス" #: templates/account/email.html:10 msgid "The following e-mail addresses are associated with your account:" msgstr "以下のメールアドレスがアカウントに登録されています:" #: templates/account/email.html:24 msgid "Verified" msgstr "確認済み" #: templates/account/email.html:26 msgid "Unverified" msgstr "未確認" #: templates/account/email.html:28 msgid "Primary" msgstr "メイン" #: templates/account/email.html:34 msgid "Make Primary" msgstr "メインにする" #: templates/account/email.html:35 msgid "Re-send Verification" msgstr "確認メールを再送する" #: templates/account/email.html:36 templates/socialaccount/connections.html:35 msgid "Remove" msgstr "削除" #: templates/account/email.html:43 msgid "Warning:" msgstr "注意:" #: templates/account/email.html:43 msgid "" "You currently do not have any e-mail address set up. You should really add " "an e-mail address so you can receive notifications, reset your password, etc." msgstr "" "メールアドレスが設定されていません。通知を受け取ったり、パスワードをリセット" "したりするためにはメールアドレスを登録する必要があります。" #: templates/account/email.html:48 msgid "Add E-mail Address" msgstr "メールアドレスの登録" #: templates/account/email.html:53 msgid "Add E-mail" msgstr "メールアドレスの登録" #: templates/account/email.html:63 msgid "Do you really want to remove the selected e-mail address?" msgstr "選択されたメールアドレスを削除してもよろしいですか?" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "こんにちは、%(site_name)sです。" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "%(site_name)sを利用いただきありがとうございます!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, python-format msgid "" "You're receiving this e-mail because user %(user_display)s has given your e-" "mail address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "%(user_display)s さんが %(site_domain)s にこのメールアドレスを登録しようとし" "ています。問題がなければ、確認のために以下のURLをクリックしてください。\n" "%(activate_url)s" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your E-mail Address" msgstr "メールアドレスを確認してください" #: templates/account/email/password_reset_key_message.txt:4 msgid "" "You're receiving this e-mail because you or someone else has requested a " "password for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "このメールは、あなた(もしくは別の誰か)がパスワードの再設定を行おうとしたた" "めに送られました。\n" "パスワードの再設定を要求したのがあなたではない場合、このメールは無視してくだ" "さい。パスワードを再設定するためには、以下のリンクをクリックしてください。" #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "あなたのアカウント(ユーザー名)は %(username)s です。" #: templates/account/email/password_reset_key_subject.txt:3 msgid "Password Reset E-mail" msgstr "パスワード再設定メール" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm E-mail Address" msgstr "メールアドレスの確認" #: templates/account/email_confirm.html:16 #, python-format msgid "" "Please confirm that %(email)s is an e-mail " "address for user %(user_display)s." msgstr "" "メールアドレス %(email)s がユーザー " "%(user_display)s さんのものであることを確認してください。" #: templates/account/email_confirm.html:20 msgid "Confirm" msgstr "確認する" #: templates/account/email_confirm.html:27 #, python-format msgid "" "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgstr "" "メールアドレス確認用のリンクが不正か、期限が切れています。確認用のメールを再送してください。" #: templates/account/login.html:6 templates/account/login.html:10 #: templates/account/login.html:43 msgid "Sign In" msgstr "ログイン" #: templates/account/login.html:15 #, python-format msgid "" "Please sign in with one\n" "of your existing third party accounts. Or, sign " "up\n" "for a %(site_name)s account and sign in below:" msgstr "" "お持ちの外部アカウントでログインするか、%(site_name)sに ユーザー登録 してログインしてください。" #: templates/account/login.html:25 msgid "or" msgstr "または" #: templates/account/login.html:32 #, python-format msgid "" "If you have not created an account yet, then please\n" "sign up first." msgstr "" "アカウントをまだお持ちでなければ、こちらから ユー" "ザー登録 してください。" #: templates/account/login.html:42 templates/account/password_change.html:14 msgid "Forgot Password?" msgstr "パスワードをお忘れですか?" #: templates/account/logout.html:5 templates/account/logout.html:8 #: templates/account/logout.html:17 msgid "Sign Out" msgstr "ログアウト" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "ログアウトしますか?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary e-mail address (%(email)s)." msgstr "メインのメールアドレス(%(email)s)を削除することはできません。" #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation e-mail sent to %(email)s." msgstr "%(email)s に確認メールを送信しました。" #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "%(email)s は確認されました。" #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed e-mail address %(email)s." msgstr "メールアドレス %(email)s を削除しました。" #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "ユーザー %(name)s としてログインしました。" #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "ログアウトしました。" #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "パスワードが変更されました。" #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "メインのメールアドレスが設定されました。" #: templates/account/messages/primary_email_set.txt:2 msgid "Primary e-mail address set." msgstr "メインのメールアドレスが設定されました。" #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary e-mail address must be verified." msgstr "メインのメールアドレスは確認済みでなければいけません。" #: templates/account/password_change.html:5 #: templates/account/password_change.html:8 #: templates/account/password_change.html:13 #: templates/account/password_reset_from_key.html:4 #: templates/account/password_reset_from_key.html:7 #: templates/account/password_reset_from_key_done.html:4 #: templates/account/password_reset_from_key_done.html:7 msgid "Change Password" msgstr "パスワード変更" #: templates/account/password_reset.html:6 #: templates/account/password_reset.html:10 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:9 msgid "Password Reset" msgstr "パスワード再設定" #: templates/account/password_reset.html:15 msgid "" "Forgotten your password? Enter your e-mail address below, and we'll send you " "an e-mail allowing you to reset it." msgstr "" "パスワードをお忘れですか?パスワードをリセットするために、メールアドレスを入" "力してください。" #: templates/account/password_reset.html:20 msgid "Reset My Password" msgstr "パスワードをリセット" #: templates/account/password_reset.html:23 msgid "Please contact us if you have any trouble resetting your password." msgstr "パスワードの再設定に問題がある場合はご連絡ください。" #: templates/account/password_reset_done.html:15 msgid "" "We have sent you an e-mail. Please contact us if you do not receive it " "within a few minutes." msgstr "" "パスワード再設定用のメールを送信しました。数分たっても届かない場合はご連絡く" "ださい。" #: templates/account/password_reset_from_key.html:7 msgid "Bad Token" msgstr "不正なトークン" #: templates/account/password_reset_from_key.html:11 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "パスワード再設定用のリンクが不正です。すでに使用された可能性があります。もう" "一度 パスワードの再設定をお試しくださ" "い。" #: templates/account/password_reset_from_key.html:17 msgid "change password" msgstr "パスワード変更" #: templates/account/password_reset_from_key.html:20 #: templates/account/password_reset_from_key_done.html:8 msgid "Your password is now changed." msgstr "パスワードが変更されました。" #: templates/account/password_set.html:5 templates/account/password_set.html:8 #: templates/account/password_set.html:13 msgid "Set Password" msgstr "パスワード設定" #: templates/account/signup.html:5 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "ユーザー登録" #: templates/account/signup.html:8 templates/account/signup.html:18 #: templates/socialaccount/signup.html:8 templates/socialaccount/signup.html:19 msgid "Sign Up" msgstr "ユーザー登録" #: templates/account/signup.html:10 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "" "すでにアカウントをお持ちであれば、こちらから ログイ" "ン してください。" #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:8 msgid "Sign Up Closed" msgstr "ユーザー登録停止中" #: templates/account/signup_closed.html:10 msgid "We are sorry, but the sign up is currently closed." msgstr "申し訳ありません、現在ユーザー登録を停止しています。" #: templates/account/snippets/already_logged_in.html:5 msgid "Note" msgstr "注意" #: templates/account/snippets/already_logged_in.html:5 #, python-format msgid "you are already logged in as %(user_display)s." msgstr "%(user_display)s さんとしてログイン中です。" #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:8 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:8 msgid "Verify Your E-mail Address" msgstr "メールアドレスを確認してください" #: templates/account/verification_sent.html:10 msgid "" "We have sent an e-mail to you for verification. Follow the link provided to " "finalize the signup process. Please contact us if you do not receive it " "within a few minutes." msgstr "" "確認のメールを送信しました。メールに記載されたリンクをクリックして、ユーザー" "登録を完了させてください。数分待っても確認のメールが届かない場合はご連絡くだ" "さい。" #: templates/account/verified_email_required.html:12 msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your e-mail address. " msgstr "" "このページにアクセスするためには、本人確認が必要です。\n" "そのために、登録されているメールアドレスがご自身のものであることを確認してい" "ただきます。" #: templates/account/verified_email_required.html:16 msgid "" "We have sent an e-mail to you for\n" "verification. Please click on the link inside this e-mail. Please\n" "contact us if you do not receive it within a few minutes." msgstr "" "確認のためのメールを送信しましたので、記載されたリンクをクリックしてくださ" "い。\n" "数分以内にメールが届かない場合はご連絡ください。" #: templates/account/verified_email_required.html:20 #, python-format msgid "" "Note: you can still change your e-" "mail address." msgstr "" "注意: メールアドレスの変更をし" "ていただくことも可能です。" #: templates/openid/login.html:9 msgid "OpenID Sign In" msgstr "OpenID ログイン" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:8 msgid "Social Network Login Failure" msgstr "ソーシャルネットワークログインに失敗しました" #: templates/socialaccount/authentication_error.html:10 msgid "" "An error occurred while attempting to login via your social network account." msgstr "" "ソーシャルネットワークアカウントにログインする際にエラーが発生しました。" #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:8 msgid "Account Connections" msgstr "アカウントリンク" #: templates/socialaccount/connections.html:11 msgid "" "You can sign in to your account using any of the following third party " "accounts:" msgstr "以下の外部アカウントを使ってログインすることができます:" #: templates/socialaccount/connections.html:43 msgid "" "You currently have no social network accounts connected to this account." msgstr "あなたのカウントに結びつけられた外部アカウントはありません。" #: templates/socialaccount/connections.html:46 msgid "Add a 3rd Party Account" msgstr "外部アカウントを追加する" #: templates/socialaccount/login.html:6 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:8 #, python-format msgid "You are about to connect a new third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:10 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:12 #, python-format msgid "You are about to sign in using a third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "ログインはキャンセルされました" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "既存の外部アカウントを使ったログインはキャンセルされました。\n" "やり直される場合はログインページにお進みくださ" "い。" #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "外部アカウントがリンクされました" #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "この外部アカウントは他のアカウントにリンクされています。" #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "外部アカウントのリンクが解除されました。" #: templates/socialaccount/signup.html:10 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "%(provider_name)s アカウントを使って %(site_name)s にログインしようとしていま" "す。\n" "ユーザー登録のために、以下のフォームに記入してください。" #~ msgid "Account" #~ msgstr "アカウント" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "入力されたログインIDもしくはパスワードが正しくありません。" #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "ユーザー名には 英数字と 記号[@ . + - _ ] のみが使えます" #~ msgid "This username is already taken. Please choose another." #~ msgstr "" #~ "このユーザー名はすでに使用されています。他のユーザー名を指定してください。" #, fuzzy #~| msgid "Sign In" #~ msgid "Shopify Sign In" #~ msgstr "ログイン" #~ msgid "Thanks for using our site!" #~ msgstr "よろしくお願いいたします。" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "%(email)sがユーザー%(user_display)sさんの" #~ "メールアドレスであることを確認しました。" #~ msgid "Confirmation e-mail sent to %(email)s" #~ msgstr "確認のメールを %(email)s に送信しました" #~ msgid "Delete Password" #~ msgstr "パスワードの削除" #~ msgid "" #~ "You may delete your password since you are currently logged in using " #~ "OpenID." #~ msgstr "" #~ "現在 OpenID を使ってログインしているので、パスワードを削除することができま" #~ "す。" #~ msgid "delete my password" #~ msgstr "パスワードを削除する" #~ msgid "Password Deleted" #~ msgstr "パスワードの削除" #~ msgid "Your password has been deleted." #~ msgstr "パスワードが削除されました。" django-allauth-0.47.0/allauth/locale/ka/000077500000000000000000000000001415442050100177545ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/ka/LC_MESSAGES/000077500000000000000000000000001415442050100215415ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/ka/LC_MESSAGES/django.po000066400000000000000000001034761415442050100233560ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Nikoloz Naskidashvili , 2021. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-12-09 08:41-0600\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Nikoloz Naskidashvili \n" "Language-Team: LANGUAGE \n" "Language: ka\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n!=1);\n" #: account/adapter.py:45 msgid "Username can not be used. Please use other username." msgstr "" "ამ მომხმარებლის სახელის გამოყენება შეუძლებელია. გთხოვთ გამოიყენოთ სხვა." #: account/adapter.py:51 msgid "Too many failed login attempts. Try again later." msgstr "შესვლის ძალიან ბევრი წარუმატებელი მცდელობა. მოგვიანებით სცადეთ." #: account/adapter.py:53 msgid "A user is already registered with this e-mail address." msgstr "მომხმარებელი ამ ელ. ფოსტით უკვე დარეგისტრირებულია." #: account/adapter.py:300 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "პაროლი უნდა შეიცავდეს მინიმუმ {0} სიმბოლოს." #: account/apps.py:7 msgid "Accounts" msgstr "მომხმარებლის ანგარიშები" #: account/forms.py:59 account/forms.py:413 msgid "You must type the same password each time." msgstr "თქვენ უნდა აკრიფოთ ერთი და იგივე პაროლი ყოველ ჯერზე." #: account/forms.py:92 account/forms.py:381 account/forms.py:498 msgid "Password" msgstr "პაროლი" #: account/forms.py:93 msgid "Remember Me" msgstr "დამიმახსოვრე" #: account/forms.py:97 msgid "This account is currently inactive." msgstr "ეს ანგარიში ამჟამად გაუქმებულია." #: account/forms.py:99 msgid "The e-mail address and/or password you specified are not correct." msgstr "თქვენს მიერ მითითებული ელ. ფოსტა ან პაროლი არასწორია." #: account/forms.py:102 msgid "The username and/or password you specified are not correct." msgstr "თქვენს მიერ მითითებული მომხმარებლის სახელი ან პაროლი არასწორია." #: account/forms.py:113 account/forms.py:279 account/forms.py:439 #: account/forms.py:517 msgid "E-mail address" msgstr "ელ. ფოსტა" #: account/forms.py:117 account/forms.py:316 account/forms.py:436 #: account/forms.py:512 msgid "E-mail" msgstr "ელ. ფოსტა" #: account/forms.py:120 account/forms.py:123 account/forms.py:269 #: account/forms.py:272 msgid "Username" msgstr "მომხმარებლის სახელი" #: account/forms.py:133 msgid "Username or e-mail" msgstr "მომხმარებლის სახელი ან ელ. ფოსტა" #: account/forms.py:136 msgctxt "field label" msgid "Login" msgstr "შესვლა" #: account/forms.py:307 msgid "E-mail (again)" msgstr "ელ. ფოსტა (გაამეორეთ)" #: account/forms.py:311 msgid "E-mail address confirmation" msgstr "ელ. ფოსტის დადასტურება" #: account/forms.py:319 msgid "E-mail (optional)" msgstr "ელ. ფოსტა (არ არის აუცილებელი)" #: account/forms.py:359 msgid "You must type the same email each time." msgstr "თქვენ უნდა ჩაწეროთ ერთი და იგივე ელ. ფოსტა ყოველ ჯერზე." #: account/forms.py:384 account/forms.py:499 msgid "Password (again)" msgstr "პაროლი (გაამეორეთ)" #: account/forms.py:448 msgid "This e-mail address is already associated with this account." msgstr "ეს ელ.ფოსტის მისამართი უკვე დაკავშირებულია ამ ანგარიშთან." #: account/forms.py:451 msgid "This e-mail address is already associated with another account." msgstr "ეს ელ.ფოსტის მისამართი უკვე დაკავშირებულია სხვა ანგარიშთან." #: account/forms.py:453 #, python-format msgid "You cannot add more than %d e-mail addresses." msgstr "თქვენ არ შეგიძლიათ დაამატოთ %d- ზე მეტი ელექტრონული ფოსტის მისამართი." #: account/forms.py:478 msgid "Current Password" msgstr "მიმდინარე პაროლი" #: account/forms.py:480 account/forms.py:570 msgid "New Password" msgstr "ახალი პაროლი" #: account/forms.py:481 account/forms.py:571 msgid "New Password (again)" msgstr "ახალი პაროლი (გაამეორეთ)" #: account/forms.py:489 msgid "Please type your current password." msgstr "გთხოვთ აკრიფეთ მიმდინარე პაროლი." #: account/forms.py:529 msgid "The e-mail address is not assigned to any user account" msgstr "" "ეს ელექტრონული ფოსტის მისამართი არ არის მიბმული რომელიმე მომხმარებლის " "ანგარიშზე" #: account/forms.py:592 msgid "The password reset token was invalid." msgstr "პაროლის აღდგენის კოდი არასწორია." #: account/models.py:22 msgid "user" msgstr "მომხმარებელი" #: account/models.py:28 account/models.py:83 msgid "e-mail address" msgstr "ელ. ფოსტა" #: account/models.py:30 msgid "verified" msgstr "დადასტურებული" #: account/models.py:31 msgid "primary" msgstr "პირველადი" #: account/models.py:36 msgid "email address" msgstr "ელ. ფოსტა" #: account/models.py:37 msgid "email addresses" msgstr "ელ. ფოსტის ანგარიშები" #: account/models.py:86 msgid "created" msgstr "შექმნილი" #: account/models.py:87 msgid "sent" msgstr "გაგზავნილი" #: account/models.py:88 socialaccount/models.py:58 msgid "key" msgstr "კოდი" #: account/models.py:93 msgid "email confirmation" msgstr "ელ. ფოსტის დადასტურება" #: account/models.py:94 msgid "email confirmations" msgstr "ელ. ფოსტის დადასტურებები" #: socialaccount/adapter.py:26 #, python-format msgid "" "An account already exists with this e-mail address. Please sign in to that " "account first, then connect your %s account." msgstr "" "მომხმარებელი უკვე არსებობს ამ ელ.ფოსტის მისამართით.%s-ით შესვლა ვერ " "მოხერხდება." #: socialaccount/adapter.py:131 msgid "Your account has no password set up." msgstr "თქვენს ანგარიშს არ აქვს პაროლი დაყენებული." #: socialaccount/adapter.py:138 msgid "Your account has no verified e-mail address." msgstr "თქვენს ანგარიშს არ აქვს დადასტურებული ელ. ფოსტა." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "სოციალური ანგარიშები" #: socialaccount/models.py:41 socialaccount/models.py:84 msgid "provider" msgstr "პროვაიდერი" #: socialaccount/models.py:45 msgid "name" msgstr "სახელი" #: socialaccount/models.py:47 msgid "client id" msgstr "კლიენტის id" #: socialaccount/models.py:49 msgid "App ID, or consumer key" msgstr "აპლიკაციის ID ან მომხმარებლის კოდი" #: socialaccount/models.py:52 msgid "secret key" msgstr "საიდუმლო კოდი" #: socialaccount/models.py:55 msgid "API secret, client secret, or consumer secret" msgstr "" "API-ს საიდუმლო კოდი, კლიენტის საიდუმლო კოდი ან მომხმარებლის საიდუმლო კოდი" #: socialaccount/models.py:58 msgid "Key" msgstr "კოდი" #: socialaccount/models.py:74 msgid "social application" msgstr "სოციალური აპლიკაცია" #: socialaccount/models.py:75 msgid "social applications" msgstr "სოციალური აპლიკაციები" #: socialaccount/models.py:105 msgid "uid" msgstr "uid" #: socialaccount/models.py:107 msgid "last login" msgstr "ბოლო შესვლის თარიღი" #: socialaccount/models.py:108 msgid "date joined" msgstr "ანგარიშის შექმნის თარიღი" #: socialaccount/models.py:109 msgid "extra data" msgstr "სხვა მონაცემები" #: socialaccount/models.py:113 msgid "social account" msgstr "სოციალური ანგარიში" #: socialaccount/models.py:114 msgid "social accounts" msgstr "სოციალური ანგარიშები" #: socialaccount/models.py:139 msgid "token" msgstr "კოდი" #: socialaccount/models.py:140 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "\"oauth_token\" (OAuth1) ან access token (OAuth2)" #: socialaccount/models.py:144 msgid "token secret" msgstr "საიდუმლო კოდი" #: socialaccount/models.py:145 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "\"oauth_token_secret\" (OAuth1) ან refresh token (OAuth2)" #: socialaccount/models.py:148 msgid "expires at" msgstr "ვადა გაუსვლის თარიღი" #: socialaccount/models.py:153 msgid "social application token" msgstr "სოციალური ანგარიშის კოდი" #: socialaccount/models.py:154 msgid "social application tokens" msgstr "სოციალური ანგარიშების კოდი" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "პროფილის მონაცემები არასწორია" #: socialaccount/providers/oauth/client.py:85 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "არასწორი პასუხი მოთხოვნის მიღებისას \"%s\"-დან." #: socialaccount/providers/oauth/client.py:117 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "არასწორი პასუხი მოთხოვნის მიღებისას \"%s\"-დან." #: socialaccount/providers/oauth/client.py:138 #, python-format msgid "No request token saved for \"%s\"." msgstr "მოთხოვნის კოდი არ არის შენახული \"%s\" -სთვის." #: socialaccount/providers/oauth/client.py:189 #, python-format msgid "No access token saved for \"%s\"." msgstr "მოთხოვნის წვდომის კოდი არ არის შენახული \"%s\" -სთვის." #: socialaccount/providers/oauth/client.py:210 #, python-format msgid "No access to private resources at \"%s\"." msgstr "\"%s\" - ზე კერძო რესურსებზე წვდომა არ არის." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:8 msgid "Account Inactive" msgstr "ანგარიში გაუქმებულია" #: templates/account/account_inactive.html:10 msgid "This account is inactive." msgstr "ეს ანგარიში გაუქმებულია" #: templates/account/email.html:5 templates/account/email.html:8 msgid "E-mail Addresses" msgstr "ელ. ფოსტის მისამართები" #: templates/account/email.html:10 msgid "The following e-mail addresses are associated with your account:" msgstr "შემდეგი ელ.ფოსტის მისამართები ასოცირდება თქვენს ანგარიშთან:" #: templates/account/email.html:24 msgid "Verified" msgstr "დადასტურებული" #: templates/account/email.html:26 msgid "Unverified" msgstr "არ არის დადასტურებელი" #: templates/account/email.html:28 msgid "Primary" msgstr "პირველადი" #: templates/account/email.html:34 msgid "Make Primary" msgstr "გახადე პირველადი" #: templates/account/email.html:35 msgid "Re-send Verification" msgstr "ვერიფიკაციის თავიდან გაგზავნა" #: templates/account/email.html:36 templates/socialaccount/connections.html:35 msgid "Remove" msgstr "წაშლა" #: templates/account/email.html:43 msgid "Warning:" msgstr "გაფრთხილება:" #: templates/account/email.html:43 msgid "" "You currently do not have any e-mail address set up. You should really add " "an e-mail address so you can receive notifications, reset your password, etc." msgstr "" "თქვენ ამჟამად არ გაქვთ რაიმე ელ.ფოსტის მისამართი დაყენებული. უნდა დაამატოთ " "ელექტრონული ფოსტის მისამართი, რათა მიიღოთ შეტყობინებები, აღადგინოთ პაროლი და " "ა.შ." #: templates/account/email.html:48 msgid "Add E-mail Address" msgstr "ელ. ფოსტის მისამართის დამატება" #: templates/account/email.html:53 msgid "Add E-mail" msgstr "ელ. ფოსტის დამატება" #: templates/account/email.html:63 msgid "Do you really want to remove the selected e-mail address?" msgstr "ნამდვილად გსურთ წაშალოთ არჩეული ელ.ფოსტის მისამართი?" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "მოგესალმებით %(site_name)s!-დან" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "მადლობა რომ იყენებ %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, python-format msgid "" "You're receiving this e-mail because user %(user_display)s has given your e-" "mail address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "თქვენ იღებთ ამ ელ. წერილს რადგან მომხმარებემა - %(user_display)s მიუთითა " "თქვენი ელ.ფოსტის ანგარიში რომ დარეგისტრირდეს შემდეგ საიტზე - " "%(site_domain)s.\n" "\n" "იმისთვის, რომ დაადასტუროთ ეს, გადადით შემდეგ ლინკზე %(activate_url)s" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your E-mail Address" msgstr "გთხოვთ დაადასტუროთ თქვენი ელ. ფოსტა" #: templates/account/email/password_reset_key_message.txt:4 msgid "" "You're receiving this e-mail because you or someone else has requested a " "password for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "თქვენ იღებთ ამ ელ. წერილს რადგან თქვენ ან სხვა ვიღაცამ მოითხოვა პაროლის " "შეცვლა თქვენს ანგარიშზე.\n" "თქვენ შეგიძლიათ უბრალოდ დააიგნოროთ ეს ელ. წერილი თუ ეს თქვენი მოთხოვნა არ " "იყო. დააჭირეთ ქვემოთ მოცემულ ლინკს პაროლის აღსადგენად." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "თუ თქვენ დაგავიწყდათ, თქვენი მომხმარებლის სახელია: %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 msgid "Password Reset E-mail" msgstr "პაროლის აღდგენის ელ. წერილი" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm E-mail Address" msgstr "დაადასტურეთ ელ. ფოსტა" #: templates/account/email_confirm.html:16 #, python-format msgid "" "Please confirm that %(email)s is an e-mail " "address for user %(user_display)s." msgstr "" "გთხოვთ დაადასტურეთ, რომ %(email)s არის ელ. " "ფოსტის მისამართი მომხმარებლისთვის: %(user_display)s." #: templates/account/email_confirm.html:20 msgid "Confirm" msgstr "დადასტურება" #: templates/account/email_confirm.html:27 #, python-format msgid "" "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgstr "" "ეს ელ. ფოსტის დადასტურების ლინკი არასწორია ან ვადაგასულია. გთხოვთ გააკეთოთ ახალი მოთხოვნა." #: templates/account/login.html:6 templates/account/login.html:10 #: templates/account/login.html:43 msgid "Sign In" msgstr "შესვლა" #: templates/account/login.html:15 #, python-format msgid "" "Please sign in with one\n" "of your existing third party accounts. Or, sign " "up\n" "for a %(site_name)s account and sign in below:" msgstr "" "გთხოვთ შედით რომელიმე\n" "სოციალური ანგარიშით. ან, დარეგისტრირდით \n" "ან შედით %(site_name)s საიტზე" #: templates/account/login.html:25 msgid "or" msgstr "ან" #: templates/account/login.html:32 #, python-format msgid "" "If you have not created an account yet, then please\n" "sign up first." msgstr "" "თუ არ გაქვთ შექმნილი ანგარიში, მაშინ გთხოვთ\n" "დარეგისტრირდით." #: templates/account/login.html:42 templates/account/password_change.html:14 msgid "Forgot Password?" msgstr "დაგავიწყდა პაროლი?" #: templates/account/logout.html:5 templates/account/logout.html:8 #: templates/account/logout.html:17 msgid "Sign Out" msgstr "გასვლა" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "დარწმუნებული ხარ, რომ გინდა გასვლა?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary e-mail address (%(email)s)." msgstr "შენ არ შეგიძლია წაშალო შენი პირველადი ელ. ფოსტა (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation e-mail sent to %(email)s." msgstr "ელ. ფოსტის დადასტურების წერილი გაგზავნილია %(email)s მისამართით." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "თქვენ დაადასტურეთ %(email)s." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed e-mail address %(email)s." msgstr "ელ. ფოსტა %(email)s წაშლილია." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "თქვენ წარმატებით შეხვედით %(name)s-ად." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "თქვენ წარმატებით გახვედით თქვენი ანგარიშიდან." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "პაროლი წარმატებით შეცვლილია." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "პაროლი წარმატებით დაყენებულია." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary e-mail address set." msgstr "პირველადი ელ. ფოსტა წარმატებით დაყენებულია" #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary e-mail address must be verified." msgstr "" #: templates/account/password_change.html:5 #: templates/account/password_change.html:8 #: templates/account/password_change.html:13 #: templates/account/password_reset_from_key.html:4 #: templates/account/password_reset_from_key.html:7 #: templates/account/password_reset_from_key_done.html:4 #: templates/account/password_reset_from_key_done.html:7 msgid "Change Password" msgstr "პაროლის შეცვლა" #: templates/account/password_reset.html:6 #: templates/account/password_reset.html:10 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:9 msgid "Password Reset" msgstr "პაროლის შეცვლა" #: templates/account/password_reset.html:15 msgid "" "Forgotten your password? Enter your e-mail address below, and we'll send you " "an e-mail allowing you to reset it." msgstr "" "დაგავიწყდათ თქვენი პაროლი? ჩაწერეთ თქვენი ელ. ფოსტა ქვემოთ და ჩვენ " "გამოგიგზავნით ელ. წერილს აღსადგენად." #: templates/account/password_reset.html:20 msgid "Reset My Password" msgstr "ჩემი პაროლის შეცვლა" #: templates/account/password_reset.html:23 msgid "Please contact us if you have any trouble resetting your password." msgstr "გთხოვთ დაგვიკავშირდით თუ გაქვთ პრობლემა პაროლის შეცვლასთან." #: templates/account/password_reset_done.html:15 msgid "" "We have sent you an e-mail. Please contact us if you do not receive it " "within a few minutes." msgstr "" "ჩვენ გამოგიგზავნეთ ელ. წერილი. გთხოვთ დაგვიკავშირდით თი არ მიიღებთ რამდენიმე " "წუთში." #: templates/account/password_reset_from_key.html:7 msgid "Bad Token" msgstr "შეცდომა, ცუდი კოდი" #: templates/account/password_reset_from_key.html:11 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "პაროლის აღდგენის ლინკი არასწორია, ალბათ იმის გამო რომ უკვე გამოყენებული " "იქნა. გთხოვთ მოითხოვეთ პაროლის შეცვლა " "თავიდან." #: templates/account/password_reset_from_key.html:17 msgid "change password" msgstr "პაროლის შეცვლა" #: templates/account/password_reset_from_key.html:20 #: templates/account/password_reset_from_key_done.html:8 msgid "Your password is now changed." msgstr "თქვენი პაროლი შეცვლილია" #: templates/account/password_set.html:5 templates/account/password_set.html:8 #: templates/account/password_set.html:13 msgid "Set Password" msgstr "პაროლის დაყენება" #: templates/account/signup.html:5 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "რეგისტრაცია" #: templates/account/signup.html:8 templates/account/signup.html:18 #: templates/socialaccount/signup.html:8 templates/socialaccount/signup.html:19 msgid "Sign Up" msgstr "რეგისტრაცია" #: templates/account/signup.html:10 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "უკვე გაქვს ანგარიში? შესვლა." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:8 msgid "Sign Up Closed" msgstr "რეგისტრაცია დროებით გაუქმებულია" #: templates/account/signup_closed.html:10 msgid "We are sorry, but the sign up is currently closed." msgstr "დიდ ბოდიშს გიხდით, მაგრამ რეგისტრაცია დროებით გაუქმებულია" #: templates/account/snippets/already_logged_in.html:5 msgid "Note" msgstr "შენიშვნა" #: templates/account/snippets/already_logged_in.html:5 #, python-format msgid "you are already logged in as %(user_display)s." msgstr "თქვენ უკვე ხართ შესული როგორც %(user_display)s." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:8 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:8 msgid "Verify Your E-mail Address" msgstr "დაადასტურეთ თქვენი ელ. ფოსტა" #: templates/account/verification_sent.html:10 msgid "" "We have sent an e-mail to you for verification. Follow the link provided to " "finalize the signup process. Please contact us if you do not receive it " "within a few minutes." msgstr "" "ჩვენ გამოგიგზავნეთ ელ. წერილი ვერიფიკაციისთვის. მიჰყევით მასში მოცემულ " "ლინკს, რომ დაასრულოთ რეგისტრაცია. გთხოვთ დაგვიკავშირდით თუ არ მიიღებთ მას " "რამდენიმე წუთში." #: templates/account/verified_email_required.html:12 msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your e-mail address. " msgstr "" "საიტის ეს ნაწილი ითხოვს იმის დადასტურებას, რომ\n" "თქვენ ხართ ის, ვინც აცხადებთ, რომ ხართ. ამიტომ ჩვენ ვითხოვთ\n" "თქვენი ელ. ფოსტის მისამართის საკუთრების დადასტურებას. " #: templates/account/verified_email_required.html:16 msgid "" "We have sent an e-mail to you for\n" "verification. Please click on the link inside this e-mail. Please\n" "contact us if you do not receive it within a few minutes." msgstr "" "ჩვენ გამოგიგზავნეთ ელ. წერილი\n" "ვერიფიკაციისთვის. გთხოვთ მიჰყევით მასში მოცემულ ლინკს. გთხოვთ\n" "გთხოვთ დაგვიკავშირდით თუ არ მიიღებთ მას რამდენიმე წუთში." #: templates/account/verified_email_required.html:20 #, python-format msgid "" "Note: you can still change your e-" "mail address." msgstr "" "შენიშვნა: თქვენ ჯერ კიდეგ შეგიძლიათ შეცვალოთ ელ. ფოსტის მისამართო." #: templates/openid/login.html:9 msgid "OpenID Sign In" msgstr "OpenID-ით შესვლა" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:8 msgid "Social Network Login Failure" msgstr "შეცდომა სოციალური ანგარიშით შესვლისას" #: templates/socialaccount/authentication_error.html:10 msgid "" "An error occurred while attempting to login via your social network account." msgstr "დაფიქსირდა შეცდომა სოციალური ანგარიშით შესვლის დროს." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:8 msgid "Account Connections" msgstr "ანგარიშის კავშირები" #: templates/socialaccount/connections.html:11 msgid "" "You can sign in to your account using any of the following third party " "accounts:" msgstr "" "თქვენ შეგიძლიათ შეხვიდეთ თქვენს ანგარიშში რომელიმე შემდეგი სოციალური " "ანგარიშის გამოყენებით:" #: templates/socialaccount/connections.html:43 msgid "" "You currently have no social network accounts connected to this account." msgstr "" "თქვენ ამჟამად არ გაქვთ ამ ანგარიშთან დაკავშირებული სოციალური ქსელის " "ანგარიშები." #: templates/socialaccount/connections.html:46 msgid "Add a 3rd Party Account" msgstr "სოციალური ანგარიშის დამატება" #: templates/socialaccount/login.html:6 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:8 #, python-format msgid "You are about to connect a new third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:10 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:12 #, python-format msgid "You are about to sign in using a third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "შესვლა გაუქმებულია" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "თქვენ გადაწყვიტეთ გააუქმოთ შესვლა ჩვენს საიტზე თქვენი ერთ-ერთი არსებული " "ანგარიშის გამოყენებით. თუ ეს შეცდომა იყო, გთხოვთ ხელახლა შედით." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "სოციალური ანგარიში მიბმულია." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "ეს სოციალური ანგარიში უკვე მიბმულია სხვა მომხმარებლის ანგარიშთან." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "სოციალური ანგარიში იყო გაუქმებული." #: templates/socialaccount/signup.html:10 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "თქვენ აპირებთ გამოიყენოთ თქვენი %(provider_name)s ანგარიში შესასვლელად\n" "%(site_name)s-ზე. როგორც საბოლოო ნაბიჯი, გთხოვთ შეავსეთ ეს ფორმა:" django-allauth-0.47.0/allauth/locale/ko/000077500000000000000000000000001415442050100177725ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/ko/LC_MESSAGES/000077500000000000000000000000001415442050100215575ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/ko/LC_MESSAGES/django.po000066400000000000000000000607331415442050100233720ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-12-09 08:41-0600\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" #: account/adapter.py:45 msgid "Username can not be used. Please use other username." msgstr "해당 아이디는 이미 사용중입니다. 다른 사용자명을 이용해 주세요." #: account/adapter.py:51 msgid "Too many failed login attempts. Try again later." msgstr "너무 많은 로그인 실패가 감지되었습니다. 잠시 후에 다시 시도하세요." #: account/adapter.py:53 msgid "A user is already registered with this e-mail address." msgstr "해당 이메일은 이미 사용되고 있습니다." #: account/adapter.py:300 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "비밀번호는 최소 {0}자 이상이어야 합니다." #: account/apps.py:7 msgid "Accounts" msgstr "계정" #: account/forms.py:59 account/forms.py:413 msgid "You must type the same password each time." msgstr "동일한 비밀번호를 입력해야 합니다." #: account/forms.py:92 account/forms.py:381 account/forms.py:498 msgid "Password" msgstr "비밀번호" #: account/forms.py:93 msgid "Remember Me" msgstr "아이디 저장" #: account/forms.py:97 msgid "This account is currently inactive." msgstr "해당 계정은 현재 비활성화 상태입니다." #: account/forms.py:99 msgid "The e-mail address and/or password you specified are not correct." msgstr "이메일 또는 비밀번호가 올바르지 않습니다." #: account/forms.py:102 msgid "The username and/or password you specified are not correct." msgstr "아이디 또는 비밀번호가 올바르지 않습니다." #: account/forms.py:113 account/forms.py:279 account/forms.py:439 #: account/forms.py:517 msgid "E-mail address" msgstr "이메일 주소" #: account/forms.py:117 account/forms.py:316 account/forms.py:436 #: account/forms.py:512 msgid "E-mail" msgstr "이메일" #: account/forms.py:120 account/forms.py:123 account/forms.py:269 #: account/forms.py:272 msgid "Username" msgstr "아이디" #: account/forms.py:133 msgid "Username or e-mail" msgstr "아이디 또는 이메일" #: account/forms.py:136 msgctxt "field label" msgid "Login" msgstr "로그인" #: account/forms.py:307 msgid "E-mail (again)" msgstr "이메일 (확인)" #: account/forms.py:311 msgid "E-mail address confirmation" msgstr "이메일 주소 확인" #: account/forms.py:319 msgid "E-mail (optional)" msgstr "이메일 (선택사항)" #: account/forms.py:359 msgid "You must type the same email each time." msgstr "동일한 이메일을 입력해야 합니다." #: account/forms.py:384 account/forms.py:499 msgid "Password (again)" msgstr "비밀번호 (확인)" #: account/forms.py:448 msgid "This e-mail address is already associated with this account." msgstr "해당 이메일은 이미 이 계정에 등록되어 있습니다." #: account/forms.py:451 msgid "This e-mail address is already associated with another account." msgstr "해당 이메일은 다른 계정에 등록되어 있습니다." #: account/forms.py:453 #, fuzzy, python-format #| msgid "Your account has no verified e-mail address." msgid "You cannot add more than %d e-mail addresses." msgstr "당신의 계정에는 인증된 이메일이 없습니다." #: account/forms.py:478 msgid "Current Password" msgstr "현재 비밀번호" #: account/forms.py:480 account/forms.py:570 msgid "New Password" msgstr "새 비밀번호" #: account/forms.py:481 account/forms.py:571 msgid "New Password (again)" msgstr "새 비밀번호 (확인)" #: account/forms.py:489 msgid "Please type your current password." msgstr "현재 비밀번호를 입력하세요." #: account/forms.py:529 msgid "The e-mail address is not assigned to any user account" msgstr "해당 이메일을 가지고 있는 사용자가 없습니다." #: account/forms.py:592 msgid "The password reset token was invalid." msgstr "비밀번호 초기화 토큰이 올바르지 않습니다." #: account/models.py:22 msgid "user" msgstr "사용자" #: account/models.py:28 account/models.py:83 msgid "e-mail address" msgstr "이메일 주소" #: account/models.py:30 msgid "verified" msgstr "인증완료" #: account/models.py:31 msgid "primary" msgstr "주" #: account/models.py:36 msgid "email address" msgstr "이메일 주소" #: account/models.py:37 msgid "email addresses" msgstr "이메일 주소" #: account/models.py:86 msgid "created" msgstr "생성됨" #: account/models.py:87 msgid "sent" msgstr "전송됨" #: account/models.py:88 socialaccount/models.py:58 msgid "key" msgstr "키" #: account/models.py:93 msgid "email confirmation" msgstr "이메일 확인" #: account/models.py:94 msgid "email confirmations" msgstr "이메일 확인" #: socialaccount/adapter.py:26 #, python-format msgid "" "An account already exists with this e-mail address. Please sign in to that " "account first, then connect your %s account." msgstr "" "해당 이메일을 사용중인 계정이 이미 존재합니다. 해당 계정으로 로그인 후에 %s " "계정으로 연결하세요." #: socialaccount/adapter.py:131 msgid "Your account has no password set up." msgstr "당신의 계정에 비밀번호가 설정되어있지 않습니다." #: socialaccount/adapter.py:138 msgid "Your account has no verified e-mail address." msgstr "당신의 계정에는 인증된 이메일이 없습니다." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "소셜 계정" #: socialaccount/models.py:41 socialaccount/models.py:84 msgid "provider" msgstr "제공자" #: socialaccount/models.py:45 msgid "name" msgstr "이름" #: socialaccount/models.py:47 msgid "client id" msgstr "클라이언트 아이디" #: socialaccount/models.py:49 msgid "App ID, or consumer key" msgstr "앱 아이디 또는 컨슈머 아이디" #: socialaccount/models.py:52 msgid "secret key" msgstr "비밀 키" #: socialaccount/models.py:55 msgid "API secret, client secret, or consumer secret" msgstr "API 비밀 키, 클라이언트 비밀 키, 또는 컨슈머 비밀 키" #: socialaccount/models.py:58 msgid "Key" msgstr "키" #: socialaccount/models.py:74 msgid "social application" msgstr "소셜 어플리케이션" #: socialaccount/models.py:75 msgid "social applications" msgstr "소셜 어플리케이션" #: socialaccount/models.py:105 msgid "uid" msgstr "" #: socialaccount/models.py:107 msgid "last login" msgstr "최종 로그인" #: socialaccount/models.py:108 msgid "date joined" msgstr "가입 날짜" #: socialaccount/models.py:109 msgid "extra data" msgstr "추가 정보" #: socialaccount/models.py:113 msgid "social account" msgstr "소셜 계정" #: socialaccount/models.py:114 msgid "social accounts" msgstr "소셜 계정" #: socialaccount/models.py:139 msgid "token" msgstr "토큰" #: socialaccount/models.py:140 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "\"oauth_token\" (OAuth1) 또는 access token (OAuth2)" #: socialaccount/models.py:144 msgid "token secret" msgstr "" #: socialaccount/models.py:145 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "\"oauth_token_secret\" (OAuth1) 또는 refresh token (OAuth2)" #: socialaccount/models.py:148 msgid "expires at" msgstr "만료일" #: socialaccount/models.py:153 msgid "social application token" msgstr "소셜 어플리케이션 토큰" #: socialaccount/models.py:154 msgid "social application tokens" msgstr "소셜 어플리케이션 토큰" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "" #: socialaccount/providers/oauth/client.py:85 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "\"%s\".로 부터 request 토큰을 받는 도중 잘못된 응답을 받았습니다." #: socialaccount/providers/oauth/client.py:117 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "\"%s\".로 부터 access 토큰을 받는 도중 잘못된 응답을 받았습니다." #: socialaccount/providers/oauth/client.py:138 #, python-format msgid "No request token saved for \"%s\"." msgstr "\"%s\".을(를) 위한 request 토큰이 없습니다." #: socialaccount/providers/oauth/client.py:189 #, python-format msgid "No access token saved for \"%s\"." msgstr "\"%s\".을(를) 위한 access 토큰이 없습니다." #: socialaccount/providers/oauth/client.py:210 #, python-format msgid "No access to private resources at \"%s\"." msgstr "\"%s\".에 접근하기 위한 권한이 없습니다." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:8 msgid "Account Inactive" msgstr "계정 비활성" #: templates/account/account_inactive.html:10 msgid "This account is inactive." msgstr "해당 계정은 비활성화된 상태입니다." #: templates/account/email.html:5 templates/account/email.html:8 msgid "E-mail Addresses" msgstr "이메일 계정" #: templates/account/email.html:10 msgid "The following e-mail addresses are associated with your account:" msgstr "다음 이메일 주소들이 당신의 계정에 등록되어 있습니다." #: templates/account/email.html:24 msgid "Verified" msgstr "인증완료" #: templates/account/email.html:26 msgid "Unverified" msgstr "인증대기" #: templates/account/email.html:28 msgid "Primary" msgstr "주" #: templates/account/email.html:34 msgid "Make Primary" msgstr "주 이메일로 지정" #: templates/account/email.html:35 msgid "Re-send Verification" msgstr "인증 재전송" #: templates/account/email.html:36 templates/socialaccount/connections.html:35 msgid "Remove" msgstr "제거" #: templates/account/email.html:43 msgid "Warning:" msgstr "경고: " #: templates/account/email.html:43 msgid "" "You currently do not have any e-mail address set up. You should really add " "an e-mail address so you can receive notifications, reset your password, etc." msgstr "" "등록된 이메일이 없습니다. 알림, 비밀번호 초기화 등을 위해 이메일을 등록해야 " "합니다." #: templates/account/email.html:48 msgid "Add E-mail Address" msgstr "이메일 주소 추가" #: templates/account/email.html:53 msgid "Add E-mail" msgstr "이메일 추가" #: templates/account/email.html:63 msgid "Do you really want to remove the selected e-mail address?" msgstr "정말로 선택하신 이메일을 제거하시겠습니까?" #: templates/account/email/base_message.txt:1 #, fuzzy, python-format #| msgid "" #| "Thank you from %(site_name)s!\n" #| "%(site_domain)s" msgid "Hello from %(site_name)s!" msgstr "" "감사합니다!\n" "%(site_name)s %(site_domain)s" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because user %(user_display)s at " #| "%(site_domain)s has given yours as an e-mail address to connect their " #| "account.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s\n" msgid "" "You're receiving this e-mail because user %(user_display)s has given your e-" "mail address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "안녕하세요. %(site_name)s 입니다!\n" "\n" "%(user_display)s 에 대해 %(site_domain)s 으로부터 이메일을 인증이 전송되었습" "니다.\n" "\n" "%(activate_url)s 에서 인증을 완료하세요.\n" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your E-mail Address" msgstr "이메일 주소를 확인하세요." #: templates/account/email/password_reset_key_message.txt:4 msgid "" "You're receiving this e-mail because you or someone else has requested a " "password for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "" #: templates/account/email/password_reset_key_subject.txt:3 msgid "Password Reset E-mail" msgstr "비밀번호 초기화 이메일" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm E-mail Address" msgstr "이메일 확인" #: templates/account/email_confirm.html:16 #, python-format msgid "" "Please confirm that %(email)s is an e-mail " "address for user %(user_display)s." msgstr "" #: templates/account/email_confirm.html:20 msgid "Confirm" msgstr "" #: templates/account/email_confirm.html:27 #, python-format msgid "" "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgstr "" #: templates/account/login.html:6 templates/account/login.html:10 #: templates/account/login.html:43 msgid "Sign In" msgstr "로그인" #: templates/account/login.html:15 #, python-format msgid "" "Please sign in with one\n" "of your existing third party accounts. Or, sign " "up\n" "for a %(site_name)s account and sign in below:" msgstr "" #: templates/account/login.html:25 msgid "or" msgstr "또는" #: templates/account/login.html:32 #, python-format msgid "" "If you have not created an account yet, then please\n" "sign up first." msgstr "" "계정이 없다면\n" "회원가입을 진행하세요." #: templates/account/login.html:42 templates/account/password_change.html:14 msgid "Forgot Password?" msgstr "비밀번호를 잊으셨나요?" #: templates/account/logout.html:5 templates/account/logout.html:8 #: templates/account/logout.html:17 msgid "Sign Out" msgstr "로그아웃" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "정말로 로그아웃 하시겠습니까?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary e-mail address (%(email)s)." msgstr "주 이메일은 제거할 수 없습니다 (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation e-mail sent to %(email)s." msgstr "%(email)s 으로 확인 메일이 전송되었습니다." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "%(email)s 을 확인하였습니다." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed e-mail address %(email)s." msgstr "%(email)s 을 제거하였습니다." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "%(name)s 으로 로그인 되었습니다." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "로그아웃 되었습니다." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "비밀번호가 성공적으로 변경되었습니다." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "비밀번호가 성공적으로 설정되었습니다." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary e-mail address set." msgstr "주 이메일이 지정되었습니다." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary e-mail address must be verified." msgstr "주 이메일은 인증이 필요합니다." #: templates/account/password_change.html:5 #: templates/account/password_change.html:8 #: templates/account/password_change.html:13 #: templates/account/password_reset_from_key.html:4 #: templates/account/password_reset_from_key.html:7 #: templates/account/password_reset_from_key_done.html:4 #: templates/account/password_reset_from_key_done.html:7 msgid "Change Password" msgstr "비밀번호 변경" #: templates/account/password_reset.html:6 #: templates/account/password_reset.html:10 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:9 msgid "Password Reset" msgstr "비밀번호 초기화" #: templates/account/password_reset.html:15 msgid "" "Forgotten your password? Enter your e-mail address below, and we'll send you " "an e-mail allowing you to reset it." msgstr "" "비밀번호를 잊으셨나요? 아래에 당신의 이메일을 입력하시면, 비밀번호 초기화 이" "메일을 전송해 드리겠습니다." #: templates/account/password_reset.html:20 msgid "Reset My Password" msgstr "비밀번호 초기화" #: templates/account/password_reset.html:23 msgid "Please contact us if you have any trouble resetting your password." msgstr "비밀번호 초기화에 문제가 있으시면 저희에게 연락주세요." #: templates/account/password_reset_done.html:15 msgid "" "We have sent you an e-mail. Please contact us if you do not receive it " "within a few minutes." msgstr "" "이메일이 전송되었습니다. 몇 분 후에도 이메일이 오지 않으면 저희에게 연락주세" "요." #: templates/account/password_reset_from_key.html:7 msgid "Bad Token" msgstr "올비르지 않은 토큰" #: templates/account/password_reset_from_key.html:11 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "비밀번호 초기화 링크가 올바르지 않습니다. 다시 비밀번호 초기화 하세요." #: templates/account/password_reset_from_key.html:17 msgid "change password" msgstr "비밀번호 변경" #: templates/account/password_reset_from_key.html:20 #: templates/account/password_reset_from_key_done.html:8 msgid "Your password is now changed." msgstr "비밀번호가 변경되었습니다." #: templates/account/password_set.html:5 templates/account/password_set.html:8 #: templates/account/password_set.html:13 msgid "Set Password" msgstr "비밀번호 설정" #: templates/account/signup.html:5 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "회원가입" #: templates/account/signup.html:8 templates/account/signup.html:18 #: templates/socialaccount/signup.html:8 templates/socialaccount/signup.html:19 msgid "Sign Up" msgstr "회원가입" #: templates/account/signup.html:10 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "" "이미 계정이 있으신가요? 바로 로그인 하세요." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:8 msgid "Sign Up Closed" msgstr "회원가입 종료" #: templates/account/signup_closed.html:10 msgid "We are sorry, but the sign up is currently closed." msgstr "죄송합니다. 회원가입은 현재 종료되었습니다." #: templates/account/snippets/already_logged_in.html:5 msgid "Note" msgstr "메모" #: templates/account/snippets/already_logged_in.html:5 #, python-format msgid "you are already logged in as %(user_display)s." msgstr "%(user_display)s 로 이미 로그인 되어있습니다." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:8 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:8 msgid "Verify Your E-mail Address" msgstr "이메일을 인증하세요" #: templates/account/verification_sent.html:10 msgid "" "We have sent an e-mail to you for verification. Follow the link provided to " "finalize the signup process. Please contact us if you do not receive it " "within a few minutes." msgstr "" "이메일 인증 메일이 전송되었습니다.회원가입 완료를 위해 전송된 메일의 링크를 " "클릭하세요.몇 분 후에도 메일이 전송되지 않으면 저희에게 연락주세요." #: templates/account/verified_email_required.html:12 msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your e-mail address. " msgstr "" "해당 페이지는 이메일 인증이 필요합니다.\n" "이메일을 인증하세요." #: templates/account/verified_email_required.html:16 msgid "" "We have sent an e-mail to you for\n" "verification. Please click on the link inside this e-mail. Please\n" "contact us if you do not receive it within a few minutes." msgstr "" "인증메일을 전송하였습니다.\n" "이메일의 링크를 클릭하시고,\n" "몇 분 후에도 메일이 전송되지 않으면 저희에게 연락주세요." #: templates/account/verified_email_required.html:20 #, python-format msgid "" "Note: you can still change your e-" "mail address." msgstr "" "메모: 이메일 변경이 가능합니" "다." #: templates/openid/login.html:9 msgid "OpenID Sign In" msgstr "OpenID 로그인" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:8 msgid "Social Network Login Failure" msgstr "소셜 계정 로그인 실패" #: templates/socialaccount/authentication_error.html:10 msgid "" "An error occurred while attempting to login via your social network account." msgstr "소셜 계정을 통해 로그인 하는 도중 오류가 발생했습니다." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:8 msgid "Account Connections" msgstr "계정 연결" #: templates/socialaccount/connections.html:11 msgid "" "You can sign in to your account using any of the following third party " "accounts:" msgstr "다음 서드파티 계정들을 통해 로그인 할 수 있습니다:" #: templates/socialaccount/connections.html:43 msgid "" "You currently have no social network accounts connected to this account." msgstr "해당 계정에 연결되어있는 소셜 계정이 없습니다." #: templates/socialaccount/connections.html:46 msgid "Add a 3rd Party Account" msgstr "서드파티 계정을 추가하세요." #: templates/socialaccount/login.html:6 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:8 #, python-format msgid "You are about to connect a new third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:10 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:12 #, python-format msgid "You are about to sign in using a third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "로그인 취소됨" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "소셜 계정이 연결되었습니다." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "해당 소셜 계정이 이미 다른 계정에 연결되어 있습니다." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "소셜 계정 연결이 해제되었습니다." #: templates/socialaccount/signup.html:10 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "%(provider_name)s 의 계정을 이용하여 %(site_name)s 으로 로그인하려 합니다.\n" "마지막으로 다음 폼을 작성해주세요:" #~ msgid "Account" #~ msgstr "계정" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "로그인 또는 비밀번호가 올바르지 않습니다." #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "아이디는 글자, 숫자 및 @/./+/-/_. 으로만 구성되어야 합니다." django-allauth-0.47.0/allauth/locale/ky/000077500000000000000000000000001415442050100200045ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/ky/LC_MESSAGES/000077500000000000000000000000001415442050100215715ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/ky/LC_MESSAGES/django.po000066400000000000000000000732011415442050100233760ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-12-09 08:41-0600\n" "PO-Revision-Date: 2016-07-20 22:24+0600\n" "Last-Translator: Murat Jumashev \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.5.4\n" "Plural-Forms: nplurals=1; plural=0;\n" #: account/adapter.py:45 msgid "Username can not be used. Please use other username." msgstr "Бул атты колдонуу мүмкүн эмес. Башкасын тандаңыз." #: account/adapter.py:51 msgid "Too many failed login attempts. Try again later." msgstr "Өтө көп жолу кирүү аракеттери жасалды. Кайрадан аракеттениңиз." #: account/adapter.py:53 msgid "A user is already registered with this e-mail address." msgstr "Мындай эмейл менен катталган колдонуучу бар." #: account/adapter.py:300 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Купуя жок дегенде {0} белгиден турушу керек." #: account/apps.py:7 msgid "Accounts" msgstr "Эсептер" #: account/forms.py:59 account/forms.py:413 msgid "You must type the same password each time." msgstr "Сиз ошол эле купуяны кайрадан териңиз." #: account/forms.py:92 account/forms.py:381 account/forms.py:498 msgid "Password" msgstr "Купуя" #: account/forms.py:93 msgid "Remember Me" msgstr "Мени эстеп кал" #: account/forms.py:97 msgid "This account is currently inactive." msgstr "Бул эсеп учурда активдүү эмес." #: account/forms.py:99 msgid "The e-mail address and/or password you specified are not correct." msgstr "Сиз берген эмейл дарек жана/же купуя туура эмес." #: account/forms.py:102 msgid "The username and/or password you specified are not correct." msgstr "Сиз берген колдонуучу аты жана/же купуя туура эмес." #: account/forms.py:113 account/forms.py:279 account/forms.py:439 #: account/forms.py:517 msgid "E-mail address" msgstr "Эмейл дарек" #: account/forms.py:117 account/forms.py:316 account/forms.py:436 #: account/forms.py:512 msgid "E-mail" msgstr "Эмейл" #: account/forms.py:120 account/forms.py:123 account/forms.py:269 #: account/forms.py:272 msgid "Username" msgstr "Колдонуучу аты" #: account/forms.py:133 msgid "Username or e-mail" msgstr "Колдонуучу аты же эмейл" #: account/forms.py:136 msgctxt "field label" msgid "Login" msgstr "Логин" #: account/forms.py:307 #, fuzzy #| msgid "E-mail (optional)" msgid "E-mail (again)" msgstr "Эмейл (милдеттүү эмес)" #: account/forms.py:311 #, fuzzy #| msgid "email confirmation" msgid "E-mail address confirmation" msgstr "эмейл ырастоо" #: account/forms.py:319 msgid "E-mail (optional)" msgstr "Эмейл (милдеттүү эмес)" #: account/forms.py:359 #, fuzzy #| msgid "You must type the same password each time." msgid "You must type the same email each time." msgstr "Сиз ошол эле купуяны кайрадан териңиз." #: account/forms.py:384 account/forms.py:499 msgid "Password (again)" msgstr "Купуя (дагы бир жолу)" #: account/forms.py:448 msgid "This e-mail address is already associated with this account." msgstr "Бул эмейл дарек ушул эсеп менен буга чейин туташтырылган." #: account/forms.py:451 msgid "This e-mail address is already associated with another account." msgstr "Бул эмейл дарек башка бир эсеп менен буга чейин туташтырылган." #: account/forms.py:453 #, fuzzy, python-format #| msgid "Your account has no verified e-mail address." msgid "You cannot add more than %d e-mail addresses." msgstr "Сиздин эсебиңизде дурусталган эмейл даректер жок." #: account/forms.py:478 msgid "Current Password" msgstr "Азыркы купуя" #: account/forms.py:480 account/forms.py:570 msgid "New Password" msgstr "Жаңы купуя" #: account/forms.py:481 account/forms.py:571 msgid "New Password (again)" msgstr "Жаңы купуя (кайрадан)" #: account/forms.py:489 msgid "Please type your current password." msgstr "Учурдагы купуяңызды жазыңыз." #: account/forms.py:529 msgid "The e-mail address is not assigned to any user account" msgstr "Эмейл дарек эч бир колдонуучу эсебине байланган эмес" #: account/forms.py:592 msgid "The password reset token was invalid." msgstr "Купуяны жаңыртуу токени туура эмес." #: account/models.py:22 msgid "user" msgstr "колдонуучу" #: account/models.py:28 account/models.py:83 msgid "e-mail address" msgstr "эмейл дарек" #: account/models.py:30 msgid "verified" msgstr "дурусталган" #: account/models.py:31 msgid "primary" msgstr "негизги" #: account/models.py:36 msgid "email address" msgstr "эмейл дарек" #: account/models.py:37 msgid "email addresses" msgstr "эмейл даректер" #: account/models.py:86 msgid "created" msgstr "түзүлгөн" #: account/models.py:87 msgid "sent" msgstr "жөнөтүлгөн" #: account/models.py:88 socialaccount/models.py:58 msgid "key" msgstr "ачкыч" #: account/models.py:93 msgid "email confirmation" msgstr "эмейл ырастоо" #: account/models.py:94 msgid "email confirmations" msgstr "эмейл ырастоолор" #: socialaccount/adapter.py:26 #, python-format msgid "" "An account already exists with this e-mail address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Бул эмейл менен башка эсеп катталган. Ошол эсеп аркылуу кирип, %s эсебиңизди " "туташтырып алыңыз." #: socialaccount/adapter.py:131 msgid "Your account has no password set up." msgstr "Сиздин эсебиңизде купуя орнотулган эмес." #: socialaccount/adapter.py:138 msgid "Your account has no verified e-mail address." msgstr "Сиздин эсебиңизде дурусталган эмейл даректер жок." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Социалдык эсептер" #: socialaccount/models.py:41 socialaccount/models.py:84 msgid "provider" msgstr "провайдер" #: socialaccount/models.py:45 msgid "name" msgstr "аты" #: socialaccount/models.py:47 msgid "client id" msgstr "кардар id'си" #: socialaccount/models.py:49 msgid "App ID, or consumer key" msgstr "Колдонмо ID'си, же керектөөчү ачкычы" #: socialaccount/models.py:52 msgid "secret key" msgstr "жашыруун ачкыч" #: socialaccount/models.py:55 msgid "API secret, client secret, or consumer secret" msgstr "API, кардар же керектөөчүнүн жашыруун ачкычы" #: socialaccount/models.py:58 msgid "Key" msgstr "Ачкыч" #: socialaccount/models.py:74 msgid "social application" msgstr "социалдык колдонмо" #: socialaccount/models.py:75 msgid "social applications" msgstr "социалдык колдонмолор" #: socialaccount/models.py:105 msgid "uid" msgstr "uid" #: socialaccount/models.py:107 msgid "last login" msgstr "акыркы кириши" #: socialaccount/models.py:108 msgid "date joined" msgstr "кошулган күнү" #: socialaccount/models.py:109 msgid "extra data" msgstr "кошумча маалымат" #: socialaccount/models.py:113 msgid "social account" msgstr "социалдык эсеп" #: socialaccount/models.py:114 msgid "social accounts" msgstr "социалдык эсептер" #: socialaccount/models.py:139 msgid "token" msgstr "токен" #: socialaccount/models.py:140 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "\"oauth_token\" (OAuth1) же жетки токени (OAuth2)" #: socialaccount/models.py:144 msgid "token secret" msgstr "токендин жашыруун ачкычы" #: socialaccount/models.py:145 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "\"oauth_token_secret\" (OAuth1) же жаңыртуу токени (OAuth2)" #: socialaccount/models.py:148 msgid "expires at" msgstr "мөөнөтү аяктайт" #: socialaccount/models.py:153 msgid "social application token" msgstr "социалдык колдонмо токени" #: socialaccount/models.py:154 msgid "social application tokens" msgstr "социалдык колдонмо токендери" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "" #: socialaccount/providers/oauth/client.py:85 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "\"%s\" тарабынан сурам токенин алууда туура эмес жооп келди." #: socialaccount/providers/oauth/client.py:117 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "\"%s\" тарабынан жетки токенин алууда туура эмес жооп келди." #: socialaccount/providers/oauth/client.py:138 #, python-format msgid "No request token saved for \"%s\"." msgstr "\"%s\" үчүн сурам токени сакталган жок." #: socialaccount/providers/oauth/client.py:189 #, python-format msgid "No access token saved for \"%s\"." msgstr "\"%s\" үчүн жетки токени сакталган жок." #: socialaccount/providers/oauth/client.py:210 #, python-format msgid "No access to private resources at \"%s\"." msgstr "\"%s\" тарабындагы жеке ресурстарга жетки жок." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:8 msgid "Account Inactive" msgstr "Эсеп активдүү эмес" #: templates/account/account_inactive.html:10 msgid "This account is inactive." msgstr "Бул эсеп активдүү эмес." #: templates/account/email.html:5 templates/account/email.html:8 msgid "E-mail Addresses" msgstr "Эмейл даректер" #: templates/account/email.html:10 msgid "The following e-mail addresses are associated with your account:" msgstr "Төмөнкү эмейл даректер сиздин эсебиңизге байланган:" #: templates/account/email.html:24 msgid "Verified" msgstr "Дурусталган" #: templates/account/email.html:26 msgid "Unverified" msgstr "Дурустала элек" #: templates/account/email.html:28 msgid "Primary" msgstr "Негизги" #: templates/account/email.html:34 msgid "Make Primary" msgstr "Негизги кылуу" #: templates/account/email.html:35 msgid "Re-send Verification" msgstr "Дурустоо катын кайрадан жиберүү" #: templates/account/email.html:36 templates/socialaccount/connections.html:35 msgid "Remove" msgstr "Алып салуу" #: templates/account/email.html:43 msgid "Warning:" msgstr "Эскертүү:" #: templates/account/email.html:43 msgid "" "You currently do not have any e-mail address set up. You should really add " "an e-mail address so you can receive notifications, reset your password, etc." msgstr "" "Сизде азыр бир дагы эмейл катталган эмес. Билдирүүлөрдү алуу, купуяны " "жаңыртуу ж.б. үчүн каттап коюңуз." #: templates/account/email.html:48 msgid "Add E-mail Address" msgstr "Эмейл дарек кошуу" #: templates/account/email.html:53 msgid "Add E-mail" msgstr "Эмейл кошуу" #: templates/account/email.html:63 msgid "Do you really want to remove the selected e-mail address?" msgstr "Тандалган эмейл даректи алып салууну дурустайсызбы?" #: templates/account/email/base_message.txt:1 #, fuzzy, python-format #| msgid "" #| "Thank you from %(site_name)s!\n" #| "%(site_domain)s" msgid "Hello from %(site_name)s!" msgstr "" "%(site_name)s сайтынан алкыш!\n" "%(site_domain)s" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "%(site_name)s сайтын колдонгонуңузга алкыш!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because user %(user_display)s at " #| "%(site_domain)s has given yours as an e-mail address to connect their " #| "account.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s\n" msgid "" "You're receiving this e-mail because user %(user_display)s has given your e-" "mail address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "%(site_name)s сайтынан салам!\n" "\n" "%(user_display)s деген колдонуучу %(site_domain)s деген сайттан сиздин эмейл " "дарегиңизди өзүнүн эсебине туташтырыш үчүн жазгандыктан,\n" "сиз ушул эмейл катты алып жатасыз.\n" "\n" "Бул туура десеңиз, анда %(activate_url)s аркылуу өтүп, ырастаңыз\n" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your E-mail Address" msgstr "Эмейл дарегиңизди ырастаңыз" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account at %(site_domain)s.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this e-mail because you or someone else has requested a " "password for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "%(site_name)s сайтынан салам!\n" "\n" "Сиз бул катты %(site_domain)s сайтынан кимдир бирөө эсебиңиздин купуясын " "жаңыртуу сурамын жөнөткөндүктөн алып жататсыз.\n" "Эгерде сурамды сиз жөнөтпөгөн болсоңуз, бул катка көңүл бурбай эле коюңуз. " "Купуяны жаңыртуу үчүн төмөндөгү шилтемени басыңыз." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "Эстей албай жатсаңыз, сиздин колдонуучу атыңыз %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 msgid "Password Reset E-mail" msgstr "Купуяны жаңыртуу эмейли" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm E-mail Address" msgstr "Эмейл даректи ырастаңыз" #: templates/account/email_confirm.html:16 #, python-format msgid "" "Please confirm that %(email)s is an e-mail " "address for user %(user_display)s." msgstr "" "%(email)s деген эмейл дарек " "%(user_display)s колдонуучусуна таандык экенин ырастаңыз." #: templates/account/email_confirm.html:20 msgid "Confirm" msgstr "Ырастоо" #: templates/account/email_confirm.html:27 #, python-format msgid "" "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgstr "" "Бул эмейлди ырастоо шилтемесинин мөөнөтү өтүп кеткен же ал туура эмес. эмейлди ырастоо сурамын кайрадан жөнөтүңүз." #: templates/account/login.html:6 templates/account/login.html:10 #: templates/account/login.html:43 msgid "Sign In" msgstr "Кирүү" #: templates/account/login.html:15 #, python-format msgid "" "Please sign in with one\n" "of your existing third party accounts. Or, sign " "up\n" "for a %(site_name)s account and sign in below:" msgstr "" "Тышкаркы кызматтарда катталган\n" "эсебиңиз аркылуу кириңиз. Же, %(site_name)s \n" "сайтына катталып\n" "\"төмөн жактан кириңиз:" #: templates/account/login.html:25 msgid "or" msgstr "же" #: templates/account/login.html:32 #, python-format msgid "" "If you have not created an account yet, then please\n" "sign up first." msgstr "" "Эгерде сиз эсеп түзө элек болсоңуз, анда\n" "биринчи катталыңыз" #: templates/account/login.html:42 templates/account/password_change.html:14 msgid "Forgot Password?" msgstr "Купуяңызды унуттуңузбу?" #: templates/account/logout.html:5 templates/account/logout.html:8 #: templates/account/logout.html:17 msgid "Sign Out" msgstr "Чыгуу" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Сиз чыгып жатканыңызды дурустайсызбы?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary e-mail address (%(email)s)." msgstr "Негизги эмейл даректи алып салуу мүмкүн эмес (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation e-mail sent to %(email)s." msgstr "Ырастоо эмейли %(email)s дарегине жөнөтүлдү." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "Сиз %(email)s дарегин ырастадыңыз." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed e-mail address %(email)s." msgstr "%(email)s дарегин алып салдык." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "%(name)s аты менен ийгиликтүү кирдик." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Сиз чыгып кеттиңиз." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Купуя ийгиликтүү өзгөртүлдү." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Купуя ийгиликтүү орнотулду." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary e-mail address set." msgstr "Негизги эмейл орнотулду." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary e-mail address must be verified." msgstr "Негизги эмейл дарегиңиз дурусталышы керек." #: templates/account/password_change.html:5 #: templates/account/password_change.html:8 #: templates/account/password_change.html:13 #: templates/account/password_reset_from_key.html:4 #: templates/account/password_reset_from_key.html:7 #: templates/account/password_reset_from_key_done.html:4 #: templates/account/password_reset_from_key_done.html:7 msgid "Change Password" msgstr "Купуяны өзгөртүү" #: templates/account/password_reset.html:6 #: templates/account/password_reset.html:10 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:9 msgid "Password Reset" msgstr "Купуяны жаңыртуу" #: templates/account/password_reset.html:15 msgid "" "Forgotten your password? Enter your e-mail address below, and we'll send you " "an e-mail allowing you to reset it." msgstr "" "Купуяңызды унуттуңузбу? Эмейл дарегиңизди төмөндө жазсаңыз, биз сизге кат " "жөнөтүп, аны жаңыртканга жардам беребиз." #: templates/account/password_reset.html:20 msgid "Reset My Password" msgstr "Купуямды жаңырт" #: templates/account/password_reset.html:23 msgid "Please contact us if you have any trouble resetting your password." msgstr "Купуяны жаңыртууда суроолор пайда болсо, бизге кайрылыңыз." #: templates/account/password_reset_done.html:15 msgid "" "We have sent you an e-mail. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Биз сизге кат жөнөттүк. Бир нече мүнөттүн ичинде келбей калса бизге " "кайрылыңыз." #: templates/account/password_reset_from_key.html:7 msgid "Bad Token" msgstr "Токен туура эмес" #: templates/account/password_reset_from_key.html:11 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Купуя жаңыртуу шилтемеси туура эмес экен, ал мурун колдонулса керек. Купуяны жаңыртуу сурамын кайрадан жөнөтүңүз." #: templates/account/password_reset_from_key.html:17 msgid "change password" msgstr "купуяны өзгөртүү" #: templates/account/password_reset_from_key.html:20 #: templates/account/password_reset_from_key_done.html:8 msgid "Your password is now changed." msgstr "Купуяңыз эми өзгөртүлдү." #: templates/account/password_set.html:5 templates/account/password_set.html:8 #: templates/account/password_set.html:13 msgid "Set Password" msgstr "Купуя орнотуу" #: templates/account/signup.html:5 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Катталуу" #: templates/account/signup.html:8 templates/account/signup.html:18 #: templates/socialaccount/signup.html:8 templates/socialaccount/signup.html:19 msgid "Sign Up" msgstr "Катталуу" #: templates/account/signup.html:10 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "Эсебиңиз барбы? Анда кириңиз." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:8 msgid "Sign Up Closed" msgstr "Катталуу жабык" #: templates/account/signup_closed.html:10 msgid "We are sorry, but the sign up is currently closed." msgstr "Кечирим сурайбых, бирок учурда катталуу жабык." #: templates/account/snippets/already_logged_in.html:5 msgid "Note" msgstr "Эскертүү" #: templates/account/snippets/already_logged_in.html:5 #, python-format msgid "you are already logged in as %(user_display)s." msgstr "сиз %(user_display)s катары кирип турасыз." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:8 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:8 msgid "Verify Your E-mail Address" msgstr "Эмейл дарегиңизди дурустап бериңиз" #: templates/account/verification_sent.html:10 msgid "" "We have sent an e-mail to you for verification. Follow the link provided to " "finalize the signup process. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Биз эмейлиңизди дурустоо үчүн кат жөнөттүк. Ошондо берилген шилтеме аркылуу " "өтүп, каттоодон өтүңүз. Кат бир нече мүнөттө келбесе, бизге кайрылыңыз." #: templates/account/verified_email_required.html:12 msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your e-mail address. " msgstr "" "Сайттын бул бөлүгүнө өтүш үчүн сиз чын эле сиз айткан \n" "адам экендиңизди такташыбыз керек. Ал үчүн эмейл\n" "дарек сизге таандык экенин дурусташыңыз керек." #: templates/account/verified_email_required.html:16 msgid "" "We have sent an e-mail to you for\n" "verification. Please click on the link inside this e-mail. Please\n" "contact us if you do not receive it within a few minutes." msgstr "" "Биз сизге кат жөнөттүк, дурустоо үчүн.\n" "Ичинде берилген шилтемени басыңыз. Эгерде\n" "кат бир нече мүнөттө келбей калса, бизге кайрылыңыз." #: templates/account/verified_email_required.html:20 #, python-format msgid "" "Note: you can still change your e-" "mail address." msgstr "" "Эскертүү: эмейл дарегиңизди дагы деле өзгөртсөңүз болот." #: templates/openid/login.html:9 msgid "OpenID Sign In" msgstr "OpenID менен кирүү" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:8 msgid "Social Network Login Failure" msgstr "Социалдык тармак аркылуу кирүү ийгиликсиз" #: templates/socialaccount/authentication_error.html:10 msgid "" "An error occurred while attempting to login via your social network account." msgstr "Социалдык тармак эсебиңиз аркылуу кирүүдө ката кетти." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:8 msgid "Account Connections" msgstr "Эсеп байланыштары" #: templates/socialaccount/connections.html:11 msgid "" "You can sign in to your account using any of the following third party " "accounts:" msgstr "" "Эсебиңизге кийинки үчүнчү тарап эсептердин бирин колдонуп кирсеңиз болот:" #: templates/socialaccount/connections.html:43 msgid "" "You currently have no social network accounts connected to this account." msgstr "Азырынча эсебиңизге социалдык тармак эсептер байланган эмес." #: templates/socialaccount/connections.html:46 msgid "Add a 3rd Party Account" msgstr "3-тарап эсеп кошуу" #: templates/socialaccount/login.html:6 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:8 #, python-format msgid "You are about to connect a new third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:10 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:12 #, python-format msgid "You are about to sign in using a third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Кирүү токтотулду" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Эсептериңизин бирөөсүн колдонуп сайтыбызга кирүүдөн баш тарттыңыз. Аны " "байкабастан кылып алсаңыз, кирүүнү улантсаңыз " "болот." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "Социалдык эсеп туташтырылды." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "Бул социалдык эсеп башка эсепке туташтырылган." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Социалдык эсеп ажыратылды." #: templates/socialaccount/signup.html:10 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Сиз азыр %(provider_name)s эсебиңизди колдонуп, %(site_name)s\n" "сайтына кирейин деп турасыз. Акыркы кадам катары кийинки калыпты\n" "толтуруп коюңузду суранабыз :" #~ msgid "Account" #~ msgstr "Эсеп" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "Сиз берген логин жана/же купуя туура эмес." #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "" #~ "Колдонуучу аттары тамгалардан, сандардан жана @/./+/-/_ белгилеринен гана " #~ "тура алат." django-allauth-0.47.0/allauth/locale/lt/000077500000000000000000000000001415442050100200005ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/lt/LC_MESSAGES/000077500000000000000000000000001415442050100215655ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/lt/LC_MESSAGES/django.po000066400000000000000000000655301415442050100234000ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-12-09 08:41-0600\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < " "11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? " "1 : n % 1 != 0 ? 2: 3);\n" #: account/adapter.py:45 msgid "Username can not be used. Please use other username." msgstr "" "Šis naudotojo vardas negalimas. Prašome pasirinkti kitą naudotojo vardą." #: account/adapter.py:51 msgid "Too many failed login attempts. Try again later." msgstr "" #: account/adapter.py:53 msgid "A user is already registered with this e-mail address." msgstr "Šiuo el. pašto adresu jau yra užsiregistravęs kitas naudotojas." #: account/adapter.py:300 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Slaptažodis turi būti sudarytas mažiausiai iš {0} simbolių." #: account/apps.py:7 msgid "Accounts" msgstr "Paskyros" #: account/forms.py:59 account/forms.py:413 msgid "You must type the same password each time." msgstr "Turite įvesti tą patį slaptažodį kiekvieną kartą." #: account/forms.py:92 account/forms.py:381 account/forms.py:498 msgid "Password" msgstr "Slaptažodis" #: account/forms.py:93 msgid "Remember Me" msgstr "Prisimink mane" #: account/forms.py:97 msgid "This account is currently inactive." msgstr "Šiuo metu ši paskyra yra neaktyvi." #: account/forms.py:99 msgid "The e-mail address and/or password you specified are not correct." msgstr "Pateiktas el. pašto adresas ir/arba slaptažodis yra neteisingi." #: account/forms.py:102 msgid "The username and/or password you specified are not correct." msgstr "Pateiktas naudotojo vardas ir/arba slaptažodis yra neteisingi." #: account/forms.py:113 account/forms.py:279 account/forms.py:439 #: account/forms.py:517 msgid "E-mail address" msgstr "El. pašto adresas" #: account/forms.py:117 account/forms.py:316 account/forms.py:436 #: account/forms.py:512 msgid "E-mail" msgstr "El. paštas" #: account/forms.py:120 account/forms.py:123 account/forms.py:269 #: account/forms.py:272 msgid "Username" msgstr "Naudotojo vardas" #: account/forms.py:133 msgid "Username or e-mail" msgstr "Naudotojo vardas arba el. paštas" #: account/forms.py:136 msgctxt "field label" msgid "Login" msgstr "Prisijungimo vardas" #: account/forms.py:307 #, fuzzy #| msgid "E-mail (optional)" msgid "E-mail (again)" msgstr "El. paštas (neprivalomas)" #: account/forms.py:311 #, fuzzy #| msgid "email confirmation" msgid "E-mail address confirmation" msgstr "el. pašto patvirtinimas" #: account/forms.py:319 msgid "E-mail (optional)" msgstr "El. paštas (neprivalomas)" #: account/forms.py:359 #, fuzzy #| msgid "You must type the same password each time." msgid "You must type the same email each time." msgstr "Turite įvesti tą patį slaptažodį kiekvieną kartą." #: account/forms.py:384 account/forms.py:499 msgid "Password (again)" msgstr "Slaptažodis (pakartoti)" #: account/forms.py:448 msgid "This e-mail address is already associated with this account." msgstr "Šis el. pašto adresas jau susietas su šia paskyra." #: account/forms.py:451 msgid "This e-mail address is already associated with another account." msgstr "Šis el. pašto adresas jau susietas su kita paskyra." #: account/forms.py:453 #, fuzzy, python-format #| msgid "Your account has no verified e-mail address." msgid "You cannot add more than %d e-mail addresses." msgstr "Jūsų paskyra neturi patvirtinto el. pašto adreso." #: account/forms.py:478 msgid "Current Password" msgstr "Esamas slaptažodis" #: account/forms.py:480 account/forms.py:570 msgid "New Password" msgstr "Naujas slaptažodis" #: account/forms.py:481 account/forms.py:571 msgid "New Password (again)" msgstr "Naujas slaptažodis (pakartoti)" #: account/forms.py:489 msgid "Please type your current password." msgstr "Prašome įvesti esamą jūsų slaptažodį." #: account/forms.py:529 msgid "The e-mail address is not assigned to any user account" msgstr "El. pašto adresas nėra susietas su jokia naudotojo paskyra" #: account/forms.py:592 msgid "The password reset token was invalid." msgstr "Neteisingas slaptažodžio atstatymo atpažinimo ženklas." #: account/models.py:22 msgid "user" msgstr "naudotojas" #: account/models.py:28 account/models.py:83 msgid "e-mail address" msgstr "el. pašto adresas" #: account/models.py:30 msgid "verified" msgstr "patvirtintas" #: account/models.py:31 msgid "primary" msgstr "pirminis" #: account/models.py:36 msgid "email address" msgstr "el. pašto adresas" #: account/models.py:37 msgid "email addresses" msgstr "el. pašto adresai" #: account/models.py:86 msgid "created" msgstr "sukurtas" #: account/models.py:87 msgid "sent" msgstr "išsiųstas" #: account/models.py:88 socialaccount/models.py:58 msgid "key" msgstr "raktas" #: account/models.py:93 msgid "email confirmation" msgstr "el. pašto patvirtinimas" #: account/models.py:94 msgid "email confirmations" msgstr "el. pašto patvirtinimai" #: socialaccount/adapter.py:26 #, python-format msgid "" "An account already exists with this e-mail address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Paskyra su šiuo el. pašto adresu jau egzistuoja. Prašome pirmiausia " "prisijungti prie tos paskyros ir tada prijunkite %s paskyrą." #: socialaccount/adapter.py:131 msgid "Your account has no password set up." msgstr "Jūsų paskyra neturi nustatyto slaptažodžio." #: socialaccount/adapter.py:138 msgid "Your account has no verified e-mail address." msgstr "Jūsų paskyra neturi patvirtinto el. pašto adreso." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Socialinės paskyros" #: socialaccount/models.py:41 socialaccount/models.py:84 msgid "provider" msgstr "tiekėjas" #: socialaccount/models.py:45 msgid "name" msgstr "pavadinimas" #: socialaccount/models.py:47 msgid "client id" msgstr "kliento id" #: socialaccount/models.py:49 msgid "App ID, or consumer key" msgstr "App ID arba consumer key" #: socialaccount/models.py:52 msgid "secret key" msgstr "secret key" #: socialaccount/models.py:55 msgid "API secret, client secret, or consumer secret" msgstr "API secret, client secret, arba consumer secret" #: socialaccount/models.py:58 msgid "Key" msgstr "Raktas" #: socialaccount/models.py:74 msgid "social application" msgstr "socialinė programėlė" #: socialaccount/models.py:75 msgid "social applications" msgstr "socialinės programėlės" #: socialaccount/models.py:105 msgid "uid" msgstr "uid" #: socialaccount/models.py:107 msgid "last login" msgstr "paskutinis prisijungimas" #: socialaccount/models.py:108 msgid "date joined" msgstr "registracijos data" #: socialaccount/models.py:109 msgid "extra data" msgstr "papildomi duomenys" #: socialaccount/models.py:113 msgid "social account" msgstr "socialinė paskyra" #: socialaccount/models.py:114 msgid "social accounts" msgstr "socialinės paskyros" #: socialaccount/models.py:139 msgid "token" msgstr "atpažinimo ženklas" #: socialaccount/models.py:140 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "\"oauth_token\" (OAuth1) arba prieigos atpažinimo ženklas (OAuth2)" #: socialaccount/models.py:144 msgid "token secret" msgstr "token secret" #: socialaccount/models.py:145 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "" "\"oauth_token_secret\" (OAuth1) arba atnaujintas atpažinimo ženklas (OAuth2)" #: socialaccount/models.py:148 msgid "expires at" msgstr "galiojimas" #: socialaccount/models.py:153 msgid "social application token" msgstr "socialinės programėlės atpažinimo ženklas" #: socialaccount/models.py:154 msgid "social application tokens" msgstr "socialinės programėlės atpažinimo ženklai" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "" #: socialaccount/providers/oauth/client.py:85 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Klaidingas atsakymas gaunant užklausos atpažinimo ženklą iš \"%s\"." #: socialaccount/providers/oauth/client.py:117 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Klaidingas atsakymas gaunant prieigos atpažinimo ženklą iš \"%s\"." #: socialaccount/providers/oauth/client.py:138 #, python-format msgid "No request token saved for \"%s\"." msgstr "Nėra užklausos atpažinimo žymės šiam \"%s\"." #: socialaccount/providers/oauth/client.py:189 #, python-format msgid "No access token saved for \"%s\"." msgstr "Nėra prieigos atpažinimo žymės šiam \"%s\"." #: socialaccount/providers/oauth/client.py:210 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Nėra prieigos prie privataus resurso iš \"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:8 msgid "Account Inactive" msgstr "Paskyra neaktyvi" #: templates/account/account_inactive.html:10 msgid "This account is inactive." msgstr "Ši paskyra neaktyvi." #: templates/account/email.html:5 templates/account/email.html:8 msgid "E-mail Addresses" msgstr "El. pašto adresai" #: templates/account/email.html:10 msgid "The following e-mail addresses are associated with your account:" msgstr "Šie el. pašto adresas yra susieti su jūsų paskyra:" #: templates/account/email.html:24 msgid "Verified" msgstr "Patvirtintas" #: templates/account/email.html:26 msgid "Unverified" msgstr "Nepatvirtintas" #: templates/account/email.html:28 msgid "Primary" msgstr "Pirminis" #: templates/account/email.html:34 msgid "Make Primary" msgstr "Padaryti pirminiu" #: templates/account/email.html:35 msgid "Re-send Verification" msgstr "Pakartotinai siųsti patvirtinimą" #: templates/account/email.html:36 templates/socialaccount/connections.html:35 msgid "Remove" msgstr "Šalinti" #: templates/account/email.html:43 msgid "Warning:" msgstr "Įspėjimas:" #: templates/account/email.html:43 msgid "" "You currently do not have any e-mail address set up. You should really add " "an e-mail address so you can receive notifications, reset your password, etc." msgstr "" "Šiuo metu jūs neturite nustatyto el. pašto adreso. Rekomenduojame pridėti " "el. pašto adresą, kad gautumėte pranešimus, galėtumėte atstatyti slaptažodį " "ir pan." #: templates/account/email.html:48 msgid "Add E-mail Address" msgstr "Pridėti el. pašto adresą" #: templates/account/email.html:53 msgid "Add E-mail" msgstr "Pridėti el. paštą" #: templates/account/email.html:63 msgid "Do you really want to remove the selected e-mail address?" msgstr "Ar tikrai norite ištrinti pasirinktą el. pašto adresą?" #: templates/account/email/base_message.txt:1 #, fuzzy, python-format #| msgid "" #| "Thank you from %(site_name)s!\n" #| "%(site_domain)s" msgid "Hello from %(site_name)s!" msgstr "" "Ačiū nuo %(site_name)s\n" "%(site_domain)s" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "Ačiū, kad naudojate %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because user %(user_display)s at " #| "%(site_domain)s has given yours as an e-mail address to connect their " #| "account.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s\n" msgid "" "You're receiving this e-mail because user %(user_display)s has given your e-" "mail address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "Su jumis sveikinasi %(site_name)s\n" "\n" "Jūs gavote šį laišką, kadangi naudotojas %(user_display)s iš %(site_domain)s " "prijungė šį el. pašto adresą prie savo paskyros.\n" "\n" "Tam, kad patvirtintumėte prijungimą sekite šia nuoroda: %(activate_url)s\n" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your E-mail Address" msgstr "Prašome patvirtinti savo el. pašto adresą" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account at %(site_domain)s.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this e-mail because you or someone else has requested a " "password for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Su jumis sveikinasi %(site_name)s\n" "\n" "Jūs gavote šį laišką, kadangi jūs arba kažkas kitas pateikė slaptažodžio " "keitimo užklausą paskyrai susietai su šiuo el. pašto adresu iš " "%(site_domain)s.\n" "Jei jūs neteikėte slaptažodžio keitimo užklausos, galite ignoruoti šį " "laišką. Kad pakeistumėte savo slaptažodį sekite žemiau esančia nuoroda." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "Primename, kad jūsų naudotojo vardas yra %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 msgid "Password Reset E-mail" msgstr "Slaptažodžio keitimo el. paštas" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm E-mail Address" msgstr "Patvirtinkite el. pašto adresą" #: templates/account/email_confirm.html:16 #, python-format msgid "" "Please confirm that %(email)s is an e-mail " "address for user %(user_display)s." msgstr "" "Prašome patvirtinti, kad %(email)s yra " "%(user_display)s el. pašto adresas." #: templates/account/email_confirm.html:20 msgid "Confirm" msgstr "Patvirtinti" #: templates/account/email_confirm.html:27 #, python-format msgid "" "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgstr "" "Šios el. pašto patvirtinimo nuorodos galiojimas baigėsi arba nuoroda yra " "klaidinga. Prašome pateikti naują el. pašto " "patvirtinimo užklausimą." #: templates/account/login.html:6 templates/account/login.html:10 #: templates/account/login.html:43 msgid "Sign In" msgstr "Prisijungti" #: templates/account/login.html:15 #, python-format msgid "" "Please sign in with one\n" "of your existing third party accounts. Or, sign " "up\n" "for a %(site_name)s account and sign in below:" msgstr "" "Prašome prisijungti viena\n" "iš jūsų turimų trečios šalies paskyrų. Arba, susikurkite\n" "naują %(site_name)s paskyrą ir prisijunkite žemiau:" #: templates/account/login.html:25 msgid "or" msgstr "arba" #: templates/account/login.html:32 #, python-format msgid "" "If you have not created an account yet, then please\n" "sign up first." msgstr "" "Jei dar nesusikūrėte paskyros, tuomet prašome pirmiausia\n" "susikurti." #: templates/account/login.html:42 templates/account/password_change.html:14 msgid "Forgot Password?" msgstr "Pamiršote slaptažodį?" #: templates/account/logout.html:5 templates/account/logout.html:8 #: templates/account/logout.html:17 msgid "Sign Out" msgstr "Atsijungti" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Ar tikrai norite atsijungti?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary e-mail address (%(email)s)." msgstr "Negalite ištrinti pirminio (%(email)s) el. pašto adreso." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation e-mail sent to %(email)s." msgstr "Patvirtinimo laiškas išsiųstas adresu %(email)s." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "%(email)s patvirtintas." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed e-mail address %(email)s." msgstr "%(email)s el. pašto adresas ištrintas." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Sėkmingai prisijungėte kaip %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Atsijungėte." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Slaptažodis sėkmingai pakeistas." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Slaptažodis pakeistas sėkmingai." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary e-mail address set." msgstr "Pirminis el. pašto adresas pakeistas sėkmingai." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary e-mail address must be verified." msgstr "Pirminis el. pašto adresas turi būti patvirtintas." #: templates/account/password_change.html:5 #: templates/account/password_change.html:8 #: templates/account/password_change.html:13 #: templates/account/password_reset_from_key.html:4 #: templates/account/password_reset_from_key.html:7 #: templates/account/password_reset_from_key_done.html:4 #: templates/account/password_reset_from_key_done.html:7 msgid "Change Password" msgstr "Keisti slaptažodį" #: templates/account/password_reset.html:6 #: templates/account/password_reset.html:10 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:9 msgid "Password Reset" msgstr "Slaptažodžio atstatymas" #: templates/account/password_reset.html:15 msgid "" "Forgotten your password? Enter your e-mail address below, and we'll send you " "an e-mail allowing you to reset it." msgstr "" "Pamiršote slaptažodį? Įveskite savo el. pašto adresą žemiau ir mes išsiūsime " "jums laišką, kurio pagalba galėsite pasikeisti slaptažodį." #: templates/account/password_reset.html:20 msgid "Reset My Password" msgstr "Atstatyti mano slaptažodį" #: templates/account/password_reset.html:23 msgid "Please contact us if you have any trouble resetting your password." msgstr "Prašome susisiekti su mumis jei negalite atstatyti slaptažodžio." #: templates/account/password_reset_done.html:15 msgid "" "We have sent you an e-mail. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Išsiuntėme jums laišką. Prašome susisiekti su mums jei per kelias minutes " "negausite laiško." #: templates/account/password_reset_from_key.html:7 msgid "Bad Token" msgstr "Klaidinga atpažinimo žymė" #: templates/account/password_reset_from_key.html:11 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Slaptažodžio atstatymo nuoroda klaidinga, taip gali būti dėl to, kad nuoroda " "jau buvo kartą panaudota. Prašome pakartoti slaptažodžio atstatymą." #: templates/account/password_reset_from_key.html:17 msgid "change password" msgstr "keisti slaptažodį" #: templates/account/password_reset_from_key.html:20 #: templates/account/password_reset_from_key_done.html:8 msgid "Your password is now changed." msgstr "Jūsų slaptažodis pakeistas." #: templates/account/password_set.html:5 templates/account/password_set.html:8 #: templates/account/password_set.html:13 msgid "Set Password" msgstr "Nustatyti slaptažodį" #: templates/account/signup.html:5 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Registracija" #: templates/account/signup.html:8 templates/account/signup.html:18 #: templates/socialaccount/signup.html:8 templates/socialaccount/signup.html:19 msgid "Sign Up" msgstr "Registruotis" #: templates/account/signup.html:10 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "Jau turite paskyrą? Prašome prisijungti." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:8 msgid "Sign Up Closed" msgstr "Registracija uždaryta" #: templates/account/signup_closed.html:10 msgid "We are sorry, but the sign up is currently closed." msgstr "Atsiprašome, tačiau registracija šiuo metu yra uždaryta." #: templates/account/snippets/already_logged_in.html:5 msgid "Note" msgstr "Pastaba" #: templates/account/snippets/already_logged_in.html:5 #, python-format msgid "you are already logged in as %(user_display)s." msgstr "jūs jau esate prisijungęs, kaip %(user_display)s." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:8 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:8 msgid "Verify Your E-mail Address" msgstr "Patvirtinkite savo el. pašto adresą" #: templates/account/verification_sent.html:10 msgid "" "We have sent an e-mail to you for verification. Follow the link provided to " "finalize the signup process. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Išsiuntėme jums laišką patvirtinimui. Sekite laiške pateikta nuoroda, kad " "užbaigtumėte registraciją. Prašome susisiekti su mumis, jei laiško negavote " "per kelias minutes." #: templates/account/verified_email_required.html:12 msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your e-mail address. " msgstr "" "Šioje svetainės vietoje privalome gauti iš jūsų patvirtinimą,\n" "kad jūs tikrai esate tas asmuo, kaip teigiate. Dėl šios priežasties\n" "prašome patvirtinti el. pašto adreso nuosavybę. " #: templates/account/verified_email_required.html:16 msgid "" "We have sent an e-mail to you for\n" "verification. Please click on the link inside this e-mail. Please\n" "contact us if you do not receive it within a few minutes." msgstr "" "Išsiuntėme jums patvirtinimo laišką.\n" "Prašome sekite nuoroda pateiktą laiške. Susisiekite su mumis\n" "jei negausite laiško per kelias minutes." #: templates/account/verified_email_required.html:20 #, python-format msgid "" "Note: you can still change your e-" "mail address." msgstr "" "Pastaba: vis dar galite pakeisti " "savo el. pašto adresą." #: templates/openid/login.html:9 msgid "OpenID Sign In" msgstr "OpenID prisijungimas" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:8 msgid "Social Network Login Failure" msgstr "Socialinio tinklo prisijungimo klaida" #: templates/socialaccount/authentication_error.html:10 msgid "" "An error occurred while attempting to login via your social network account." msgstr "" "Įvyko nenumatyta klaida bandant prisijungti per jūsų socialinio tinklo " "paskyrą." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:8 msgid "Account Connections" msgstr "Paskyros ryšiai" #: templates/socialaccount/connections.html:11 msgid "" "You can sign in to your account using any of the following third party " "accounts:" msgstr "" "Galite prisijungti prie savo paskyros naudodami vieną iš galimų trečios " "šalies paskyrų:" #: templates/socialaccount/connections.html:43 msgid "" "You currently have no social network accounts connected to this account." msgstr "Šiuo metu jūs neturite nei vienos prijungtos socialinės paskyros." #: templates/socialaccount/connections.html:46 msgid "Add a 3rd Party Account" msgstr "Pridėti trečios šalies paskyrą" #: templates/socialaccount/login.html:6 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:8 #, python-format msgid "You are about to connect a new third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:10 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:12 #, python-format msgid "You are about to sign in using a third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Prisijungimas atšauktas" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Nusprendėte atšaukti prisijungimą naudojant vieną iš esamų paskyrų. Jei tai " "buvo klaida, prašome pakartoti prisijungimą." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "Socialinė paskyra buvo prijungta." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "Socialinė paskyra jau yra prijungta prie kitos paskyros." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Socialinė paskyra buvo atjungta." #: templates/socialaccount/signup.html:10 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Jūs beveik prisijungėte prie %(site_name)s naudodami %(provider_name)s\n" "paskyrą. Liko paskutinis žingsnis, užpildyti sekančią formą:" #~ msgid "Account" #~ msgstr "Paskyra" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "Pateiktas prisijungimo vardas ir/arba slaptažodis yra neteisingi." #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "Naudotojo vardui galima naudoti tik raides, skaičius ir @/./+/-/_." #~ msgid "This username is already taken. Please choose another." #~ msgstr "Šis naudotojo vardas jau užimtas. Prašome pasirinkti kitą." #, fuzzy #~| msgid "Sign In" #~ msgid "Shopify Sign In" #~ msgstr "Prisijungti" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "Jūs patvirtinote, kad %(email)s yra " #~ "%(user_display)s naudotojo el. pašto adresas." django-allauth-0.47.0/allauth/locale/lv/000077500000000000000000000000001415442050100200025ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/lv/LC_MESSAGES/000077500000000000000000000000001415442050100215675ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/lv/LC_MESSAGES/django.po000066400000000000000000000640031415442050100233740ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-12-09 08:41-0600\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : " "2);\n" #: account/adapter.py:45 msgid "Username can not be used. Please use other username." msgstr "" "Lietotājvārds nevar tikt izmantots. Lūdzu izvēlietis citu lietotājvārdu." #: account/adapter.py:51 msgid "Too many failed login attempts. Try again later." msgstr "" "Pārāk daudz neveiksmīgi pieslēgšanās mēģinājumi. Mēģiniet vēlreiz vēlāk." #: account/adapter.py:53 msgid "A user is already registered with this e-mail address." msgstr "Lietotājs ar šādu e-pasta adresi jau ir reģistrēts." #: account/adapter.py:300 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Parolei jābūt vismaz {0} simbolus garai." #: account/apps.py:7 msgid "Accounts" msgstr "Konti" #: account/forms.py:59 account/forms.py:413 msgid "You must type the same password each time." msgstr "Katru reizi jums ir jāievada tā pati parole." #: account/forms.py:92 account/forms.py:381 account/forms.py:498 msgid "Password" msgstr "Parole" #: account/forms.py:93 msgid "Remember Me" msgstr "Atcerēties mani" #: account/forms.py:97 msgid "This account is currently inactive." msgstr "Šis konts šobrīd ir neaktīvs." #: account/forms.py:99 msgid "The e-mail address and/or password you specified are not correct." msgstr "Nepareizs e-pasts un/vai parole." #: account/forms.py:102 msgid "The username and/or password you specified are not correct." msgstr "Nepareizs lietotāja vārds un/vai parole." #: account/forms.py:113 account/forms.py:279 account/forms.py:439 #: account/forms.py:517 msgid "E-mail address" msgstr "E-pasta adrese" #: account/forms.py:117 account/forms.py:316 account/forms.py:436 #: account/forms.py:512 msgid "E-mail" msgstr "E-pasts" #: account/forms.py:120 account/forms.py:123 account/forms.py:269 #: account/forms.py:272 msgid "Username" msgstr "Lietotājvārds" #: account/forms.py:133 msgid "Username or e-mail" msgstr "Lietotājvārds vai e-pasts" #: account/forms.py:136 msgctxt "field label" msgid "Login" msgstr "Ieiet" #: account/forms.py:307 #, fuzzy #| msgid "E-mail (optional)" msgid "E-mail (again)" msgstr "E-pasts (izvēles)" #: account/forms.py:311 #, fuzzy #| msgid "email confirmation" msgid "E-mail address confirmation" msgstr "e-pasta apstiprinājums" #: account/forms.py:319 msgid "E-mail (optional)" msgstr "E-pasts (izvēles)" #: account/forms.py:359 #, fuzzy #| msgid "You must type the same password each time." msgid "You must type the same email each time." msgstr "Katru reizi jums ir jāievada tā pati parole." #: account/forms.py:384 account/forms.py:499 msgid "Password (again)" msgstr "Parole (vēlreiz)" #: account/forms.py:448 msgid "This e-mail address is already associated with this account." msgstr "Šī e-pasta adrese jau ir piesaistīta šim kontam." #: account/forms.py:451 msgid "This e-mail address is already associated with another account." msgstr "Šī e-pasta adrese jau ir piesaistīta citam kontam." #: account/forms.py:453 #, fuzzy, python-format #| msgid "Your account has no verified e-mail address." msgid "You cannot add more than %d e-mail addresses." msgstr "Jūsu kontam nav apstiprinātas e-pasta adreses." #: account/forms.py:478 msgid "Current Password" msgstr "Šobrīdējā parole" #: account/forms.py:480 account/forms.py:570 msgid "New Password" msgstr "Jaunā parole" #: account/forms.py:481 account/forms.py:571 msgid "New Password (again)" msgstr "Jaunā parole (vēlreiz)" #: account/forms.py:489 msgid "Please type your current password." msgstr "Lūdzu ievadiet jūsu šobrīdējo paroli." #: account/forms.py:529 msgid "The e-mail address is not assigned to any user account" msgstr "E-pasta adrese nav piesaistīta nevienam lietotāja kontam" #: account/forms.py:592 msgid "The password reset token was invalid." msgstr "Paroles atjaunošanas marķieris bija nederīgs." #: account/models.py:22 msgid "user" msgstr "lietotājs" #: account/models.py:28 account/models.py:83 msgid "e-mail address" msgstr "e-pasta adrese" #: account/models.py:30 msgid "verified" msgstr "apstiprināts" #: account/models.py:31 msgid "primary" msgstr "primārā" #: account/models.py:36 msgid "email address" msgstr "e-pasta adrese" #: account/models.py:37 msgid "email addresses" msgstr "e-pasta adreses" #: account/models.py:86 msgid "created" msgstr "izveidots" #: account/models.py:87 msgid "sent" msgstr "nosūtīts" #: account/models.py:88 socialaccount/models.py:58 msgid "key" msgstr "atslēga" #: account/models.py:93 msgid "email confirmation" msgstr "e-pasta apstiprinājums" #: account/models.py:94 msgid "email confirmations" msgstr "e-pasta apstiprinājumi" #: socialaccount/adapter.py:26 #, python-format msgid "" "An account already exists with this e-mail address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Jau eksistē konts ar šo e-pasta adresi. Lūdzu sākumā ieejiet tajā kontā, tad " "pievienojiet %s kontu." #: socialaccount/adapter.py:131 msgid "Your account has no password set up." msgstr "Jūsu kontam nav uzstādīta parole." #: socialaccount/adapter.py:138 msgid "Your account has no verified e-mail address." msgstr "Jūsu kontam nav apstiprinātas e-pasta adreses." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Sociālie konti" #: socialaccount/models.py:41 socialaccount/models.py:84 msgid "provider" msgstr "sniedzējs" #: socialaccount/models.py:45 msgid "name" msgstr "vārds" #: socialaccount/models.py:47 msgid "client id" msgstr "klienta id" #: socialaccount/models.py:49 msgid "App ID, or consumer key" msgstr "App ID, vai consumer key" #: socialaccount/models.py:52 msgid "secret key" msgstr "secret key" #: socialaccount/models.py:55 msgid "API secret, client secret, or consumer secret" msgstr "API secret, client secret, vai consumer secret" #: socialaccount/models.py:58 msgid "Key" msgstr "Key" #: socialaccount/models.py:74 msgid "social application" msgstr "sociālā aplikācija" #: socialaccount/models.py:75 msgid "social applications" msgstr "sociālās aplikācijas" #: socialaccount/models.py:105 msgid "uid" msgstr "uid" #: socialaccount/models.py:107 msgid "last login" msgstr "pēdējā pieslēgšanās" #: socialaccount/models.py:108 msgid "date joined" msgstr "reģistrācijas datums" #: socialaccount/models.py:109 msgid "extra data" msgstr "papildus informācija" #: socialaccount/models.py:113 msgid "social account" msgstr "sociālais konts" #: socialaccount/models.py:114 msgid "social accounts" msgstr "sociālie konti" #: socialaccount/models.py:139 msgid "token" msgstr "token" #: socialaccount/models.py:140 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "\"oauth_token\" (OAuth1) vai piekļūt marķierim (OAuth2)" #: socialaccount/models.py:144 msgid "token secret" msgstr "token secret" #: socialaccount/models.py:145 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "\"oauth_token_secret\" (OAuth1) vai atjaunot marķieri (OAuth2)" #: socialaccount/models.py:148 msgid "expires at" msgstr "beidzas" #: socialaccount/models.py:153 msgid "social application token" msgstr "sociālās aplikācijas marķieris" #: socialaccount/models.py:154 msgid "social application tokens" msgstr "sociālās aplikācijas marķieri" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "" #: socialaccount/providers/oauth/client.py:85 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Nederīga atbilde iegūstot pieprasījuma marķieri no \"%s\"." #: socialaccount/providers/oauth/client.py:117 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Nederīga atbilde iegūstot pieejas marķieri no \"%s\"." #: socialaccount/providers/oauth/client.py:138 #, python-format msgid "No request token saved for \"%s\"." msgstr "Netika saglabāts pieprasījuma marķieris priekš \"%s\"." #: socialaccount/providers/oauth/client.py:189 #, python-format msgid "No access token saved for \"%s\"." msgstr "Netika saglabāts pieejas marķieris priekš \"%s\"." #: socialaccount/providers/oauth/client.py:210 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Nav pieejas privātam resursam \"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:8 msgid "Account Inactive" msgstr "Neaktīvs konts" #: templates/account/account_inactive.html:10 msgid "This account is inactive." msgstr "Šis konts ir neaktīvs." #: templates/account/email.html:5 templates/account/email.html:8 msgid "E-mail Addresses" msgstr "E-pasta adreses" #: templates/account/email.html:10 msgid "The following e-mail addresses are associated with your account:" msgstr "Sekojošas e-pasta adreses ir piesaistītas jūsu kontam:" #: templates/account/email.html:24 msgid "Verified" msgstr "Apstiprināta" #: templates/account/email.html:26 msgid "Unverified" msgstr "Neapstiprināta" #: templates/account/email.html:28 msgid "Primary" msgstr "Primārā" #: templates/account/email.html:34 msgid "Make Primary" msgstr "Iestatīt kā primāro" #: templates/account/email.html:35 msgid "Re-send Verification" msgstr "Pārsūtīt apstiprināšanu" #: templates/account/email.html:36 templates/socialaccount/connections.html:35 msgid "Remove" msgstr "Noņemt" #: templates/account/email.html:43 msgid "Warning:" msgstr "Brīdinājums:" #: templates/account/email.html:43 msgid "" "You currently do not have any e-mail address set up. You should really add " "an e-mail address so you can receive notifications, reset your password, etc." msgstr "" "Jums pašlaik nav izveidota neviena e-pasta adrese. Jums patiešām vajadzētu " "pievienot e-pasta adresi, lai jūs varētu saņemt paziņojumus, atiestatīt savu " "paroli utt." #: templates/account/email.html:48 msgid "Add E-mail Address" msgstr "Pievienot e-pasta adresi" #: templates/account/email.html:53 msgid "Add E-mail" msgstr "Pievienot e-pastu" #: templates/account/email.html:63 msgid "Do you really want to remove the selected e-mail address?" msgstr "Vai jūs tiešām vēlaties noņemt izvēlēto e-pasta adresi?" #: templates/account/email/base_message.txt:1 #, fuzzy, python-format #| msgid "" #| "Thank you from %(site_name)s!\n" #| "%(site_domain)s" msgid "Hello from %(site_name)s!" msgstr "" "Visu labu vēlot, %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "Paldies, ka izmantojat %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because user %(user_display)s at " #| "%(site_domain)s has given yours as an e-mail address to connect their " #| "account.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s\n" msgid "" "You're receiving this e-mail because user %(user_display)s has given your e-" "mail address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "Sveiciens no %(site_name)s!\n" "\n" "Jūs saņemat šo e-pasta vēstuli tāpēc, ka lietotājs %(user_display)s lapā " "%(site_domain)s ir iesniedzis šo e-pasta adresi, lai tā tiktu sasaistīta ar " "viņa kontu.\n" "\n" "Lai apstiprinātu, ka viss ir parezi, ejiet uz %(activate_url)s\n" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your E-mail Address" msgstr "Lūdzu apstipriniet savu e-pasta adresi" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account at %(site_domain)s.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this e-mail because you or someone else has requested a " "password for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Sveiciens no %(site_name)s!\n" "\n" "Jūs saņemat šo e-pasta vēstuli tāpēc, ka jūs vai kāds cits ir pieprasījis " "paroles atjaunošanu jūsu kontam lapā %(site_domain)s.\n" "Jūs varat droši ignorēt šo e-pasta vēstuli, ja jūs nepieprasījat paroles " "atjaunošanu. Spiedied uz linka zemāk, lai atjaunotu jūsu paroli." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "Gadījumā ja jūs aizmirsāt, tad jūsu lietotājvārds ir %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 msgid "Password Reset E-mail" msgstr "Paroles atjaunošanas e-pasts" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm E-mail Address" msgstr "Apstipriniet e-pasta adresi" #: templates/account/email_confirm.html:16 #, python-format msgid "" "Please confirm that %(email)s is an e-mail " "address for user %(user_display)s." msgstr "" "Lūdzu apstipriniet ka %(email)s e-pasta " "adrese pieder lietotājam %(user_display)s." #: templates/account/email_confirm.html:20 msgid "Confirm" msgstr "Apstiprināt" #: templates/account/email_confirm.html:27 #, python-format msgid "" "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgstr "" "Šī e-pasta apstiprināšanas saitei ir beidzies derīguma termiņš vai tas ir " "nederīgs. Lūdzu pieprasiet jaunu e-pasta " "apstiprināšanas linku." #: templates/account/login.html:6 templates/account/login.html:10 #: templates/account/login.html:43 msgid "Sign In" msgstr "Ieiet" #: templates/account/login.html:15 #, python-format msgid "" "Please sign in with one\n" "of your existing third party accounts. Or, sign " "up\n" "for a %(site_name)s account and sign in below:" msgstr "" "Lūdzu ieejiet iekšā ar vienu\n" "no jūsu eksistējošiem trešās puses kontiem. Vai reģistrējieties\n" "%(site_name)s kontam un ieejiet zemāk:" #: templates/account/login.html:25 msgid "or" msgstr "vai" #: templates/account/login.html:32 #, python-format msgid "" "If you have not created an account yet, then please\n" "sign up first." msgstr "" "Ja jūs vēl neesat izveidojuši kontu, tad lūdzu\n" "piereģistrējaties." #: templates/account/login.html:42 templates/account/password_change.html:14 msgid "Forgot Password?" msgstr "Aizmirsāt paroli?" #: templates/account/logout.html:5 templates/account/logout.html:8 #: templates/account/logout.html:17 msgid "Sign Out" msgstr "Iziet" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Vai jūs tiešām vēlaties iziet?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary e-mail address (%(email)s)." msgstr "Jūs nevarat noņemt savu primāro e-pasta adresi (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation e-mail sent to %(email)s." msgstr "Apstiprinājuma e-pasts nosūtīts uz %(email)s." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "Jūs esat apstiprinājis %(email)s." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed e-mail address %(email)s." msgstr "Noņemta e-pasta adrese %(email)s." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Veiksmīgi iegājuši kā %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Jūs esat izgājuši." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Parole veiksmīgi nomainīta." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Parole veiksmīgi uzstādīta." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary e-mail address set." msgstr "Primārā e-pasta adrese uzstādīta." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary e-mail address must be verified." msgstr "Jūsu primārajai e-pasta adresei jābūt apstiprinātai." #: templates/account/password_change.html:5 #: templates/account/password_change.html:8 #: templates/account/password_change.html:13 #: templates/account/password_reset_from_key.html:4 #: templates/account/password_reset_from_key.html:7 #: templates/account/password_reset_from_key_done.html:4 #: templates/account/password_reset_from_key_done.html:7 msgid "Change Password" msgstr "Mainīt paroli" #: templates/account/password_reset.html:6 #: templates/account/password_reset.html:10 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:9 msgid "Password Reset" msgstr "Atjaunot paroli" #: templates/account/password_reset.html:15 msgid "" "Forgotten your password? Enter your e-mail address below, and we'll send you " "an e-mail allowing you to reset it." msgstr "" "Aizmirsāt savu paroli? Ievadiet zemāk savu e-pasta adresi, un mēs jums " "nosūtīsim e-pasta vēstuli, lai atjaunotu to." #: templates/account/password_reset.html:20 msgid "Reset My Password" msgstr "Atjaunot manu paroli" #: templates/account/password_reset.html:23 msgid "Please contact us if you have any trouble resetting your password." msgstr "Lūdzu sazinieties ar mums, ja jums ir kādas problēmas atjaunojot to." #: templates/account/password_reset_done.html:15 msgid "" "We have sent you an e-mail. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Mēs jums nosūtījām e-pasta vēstuli. Lūdzu sazinieties ar mums, ja dažu " "minūšu laikā nesaņemat vēstuli." #: templates/account/password_reset_from_key.html:7 msgid "Bad Token" msgstr "Nederīgs marķieris" #: templates/account/password_reset_from_key.html:11 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Paroles atjaunošanas links ir nederīgs, iespējams, tāpēc ka tas jau ir " "izmantots. Lūdzu pieprasiet jaunu paroles " "atjaunošanu." #: templates/account/password_reset_from_key.html:17 msgid "change password" msgstr "Nomainīt paroli" #: templates/account/password_reset_from_key.html:20 #: templates/account/password_reset_from_key_done.html:8 msgid "Your password is now changed." msgstr "Jūsu parole ir nomainīta." #: templates/account/password_set.html:5 templates/account/password_set.html:8 #: templates/account/password_set.html:13 msgid "Set Password" msgstr "Uzstādīt paroli" #: templates/account/signup.html:5 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Reģistrēties" #: templates/account/signup.html:8 templates/account/signup.html:18 #: templates/socialaccount/signup.html:8 templates/socialaccount/signup.html:19 msgid "Sign Up" msgstr "Reģistrēties" #: templates/account/signup.html:10 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "Jau ir konts? Tad lūdzu spiedied šeit." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:8 msgid "Sign Up Closed" msgstr "Reģistrācija slēgta" #: templates/account/signup_closed.html:10 msgid "We are sorry, but the sign up is currently closed." msgstr "Mēs atvainojamies, bet reģistrācija šobrīd ir slēgta." #: templates/account/snippets/already_logged_in.html:5 msgid "Note" msgstr "Piezīme" #: templates/account/snippets/already_logged_in.html:5 #, python-format msgid "you are already logged in as %(user_display)s." msgstr "jūs jau esat iegājuši kā %(user_display)s." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:8 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:8 msgid "Verify Your E-mail Address" msgstr "Apstipriniet savu e-pasta adresi" #: templates/account/verification_sent.html:10 msgid "" "We have sent an e-mail to you for verification. Follow the link provided to " "finalize the signup process. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Jums ir nosūtīts apstiprinājuma e-pasts. Sekojiet saitei, lai pabeigu " "reģistrācijas procesu. Lūdzu sazinieties ar mums, ja dažu minūšu laikā " "nesaņemat vēstuli." #: templates/account/verified_email_required.html:12 msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your e-mail address. " msgstr "" "Šī lapas daļa mums nosaka pārbaudīt, ka\n" "jūs esat tas, kas jūs apgalvojat esam. Šim mērķim, mēs pieprasām, lai jūs\n" "apstipriniet, jūsu e-pasta adreses piederību. " #: templates/account/verified_email_required.html:16 msgid "" "We have sent an e-mail to you for\n" "verification. Please click on the link inside this e-mail. Please\n" "contact us if you do not receive it within a few minutes." msgstr "" "Mēs esam jums nosūtījuši e-pastu\n" "apstiprināšanai. Lūdzu klikšķiniet uz saites šajā e-pastā. Lūdzu\n" "sazinieties ar mums, ja dažu minūšu laikā nesaņemat vēstuli." #: templates/account/verified_email_required.html:20 #, python-format msgid "" "Note: you can still change your e-" "mail address." msgstr "" "Piezīme: jūs vēljoprojām varat nomainīt jūsu e-pasta adresi." #: templates/openid/login.html:9 msgid "OpenID Sign In" msgstr "Ieiet ar OpenID" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:8 msgid "Social Network Login Failure" msgstr "Sociālā tīkla ieiešanas kļūda" #: templates/socialaccount/authentication_error.html:10 msgid "" "An error occurred while attempting to login via your social network account." msgstr "Notikusi kļūme, mēģinot ieiet ar jūsu sociālo kontu." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:8 msgid "Account Connections" msgstr "Konta savienojumi" #: templates/socialaccount/connections.html:11 msgid "" "You can sign in to your account using any of the following third party " "accounts:" msgstr "" "Jūs varat ieiet jūsu kontā izmantojot jebkuru no sekojošiem trešo pušu " "kontiem:" #: templates/socialaccount/connections.html:43 msgid "" "You currently have no social network accounts connected to this account." msgstr "Jūsu kontam šobrīd nav piesaistīts neviens sociālais konts." #: templates/socialaccount/connections.html:46 msgid "Add a 3rd Party Account" msgstr "Pievienot trešās puses kontu" #: templates/socialaccount/login.html:6 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:8 #, python-format msgid "You are about to connect a new third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:10 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:12 #, python-format msgid "You are about to sign in using a third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Ieiešana pārtraukta" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Jūs nolēmāt pārtraukt ieiešanu mūsu lapa izmantojot vienu no jūsu kontiem. " "Ja šī ir kļūda, lūdzu dodaties uz ieiet." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "Sociālais konts ir piesaistīts." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "Sociālais konts jau ir piesaistīts citam kontam." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Sociālais konts ir atvienots." #: templates/socialaccount/signup.html:10 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Jūs izmantosiet savu %(provider_name)s kontu, lai ieietu\n" "%(site_name)s. Kā pēdējo soli, lūdzu aizpildiet sekojošo formu:" #~ msgid "Account" #~ msgstr "Konts" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "Nepareiza pieteikšanās informācija un/vai parole." #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "Lietotājvārds var saturēt tikai burtus, ciparus un @/./+/-/_." #~ msgid "This username is already taken. Please choose another." #~ msgstr "Šis lietotājvārds jau ir aizņemts. Lūdzu izvēlaties citu." #~ msgid "Shopify Sign In" #~ msgstr "Ieiet ar Shopify" django-allauth-0.47.0/allauth/locale/mn/000077500000000000000000000000001415442050100177735ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/mn/LC_MESSAGES/000077500000000000000000000000001415442050100215605ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/mn/LC_MESSAGES/django.po000066400000000000000000000707641415442050100234000ustar00rootroot00000000000000# Mongolian Translation # Copyright (C) 2021 # This file is distributed under the same license as the PACKAGE package. # Bilgutei Erdenebayar , 2021. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: 0.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-12-09 08:41-0600\n" "PO-Revision-Date: 2021-11-12 09:54+0800\n" "Last-Translator: Bilgutei Erdenebayar \n" "Language-Team: Mongolian \n" "Language: mn\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: account/adapter.py:45 msgid "Username can not be used. Please use other username." msgstr "Хэрэглэгчийн нэрийг ашиглах боломжгүй. Өөр нэр сонгоно уу." #: account/adapter.py:51 msgid "Too many failed login attempts. Try again later." msgstr "Хэт олон амжилтгүй нэвтрэх оролдлого. Дараа дахин оролдоорой." #: account/adapter.py:53 msgid "A user is already registered with this e-mail address." msgstr "Өөр хэрэглэгч энэ имэйл хаягаар бүртгүүлсэн байна." #: account/adapter.py:300 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Нууц үг хамгийн багадаа {0} тэмдэгттэй байх ёстой." #: account/apps.py:7 msgid "Accounts" msgstr "Бүртгэлүүд" #: account/forms.py:59 account/forms.py:413 msgid "You must type the same password each time." msgstr "Та өмнө оруулсантай ижил нууц үг оруулах ёстой." #: account/forms.py:92 account/forms.py:381 account/forms.py:498 msgid "Password" msgstr "Нууц үг" #: account/forms.py:93 msgid "Remember Me" msgstr "Намайг Санах" #: account/forms.py:97 msgid "This account is currently inactive." msgstr "Энэ бүртгэл одоогоор идэвхгүй байна." #: account/forms.py:99 msgid "The e-mail address and/or password you specified are not correct." msgstr "Таны оруулсан имэйл хаяг болон/эсвэл нууц үг буруу байна." #: account/forms.py:102 msgid "The username and/or password you specified are not correct." msgstr "Таны оруулсан имэйл хаяг болон/эсвэл нууц үг буруу байна." #: account/forms.py:113 account/forms.py:279 account/forms.py:439 #: account/forms.py:517 msgid "E-mail address" msgstr "" #: account/forms.py:117 account/forms.py:316 account/forms.py:436 #: account/forms.py:512 msgid "E-mail" msgstr "Имэйл хаяг" #: account/forms.py:120 account/forms.py:123 account/forms.py:269 #: account/forms.py:272 msgid "Username" msgstr "Хэрэглэгчийн нэр" #: account/forms.py:133 msgid "Username or e-mail" msgstr "Хэрэглэгчийн нэр эсвэл имэйл" #: account/forms.py:136 msgctxt "field label" msgid "Login" msgstr "Нэвтрэх" #: account/forms.py:307 msgid "E-mail (again)" msgstr "Имэйл (дахин)" #: account/forms.py:311 msgid "E-mail address confirmation" msgstr "Имэйл хаягийн баталгаажуулалт" #: account/forms.py:319 msgid "E-mail (optional)" msgstr "Имэйл (заавал биш)" #: account/forms.py:359 msgid "You must type the same email each time." msgstr "Та өмнө оруулсантай ижил имэйл бичих ёстой." #: account/forms.py:384 account/forms.py:499 msgid "Password (again)" msgstr "Нууц үг (дахин)" #: account/forms.py:448 msgid "This e-mail address is already associated with this account." msgstr "Энэ имэйл хаяг энэ бүртгэлтэй холбогдсон байна." #: account/forms.py:451 msgid "This e-mail address is already associated with another account." msgstr "Энэ имэйл хаяг өөр бүртгэлтэй холбогдсон байна." #: account/forms.py:453 #, python-format msgid "You cannot add more than %d e-mail addresses." msgstr "Та %d-с илүү имэйл хаяг нэмэх боломжгүй." #: account/forms.py:478 msgid "Current Password" msgstr "Одоогын Нууц Үг" #: account/forms.py:480 account/forms.py:570 msgid "New Password" msgstr "Шинэ Нууц Үг" #: account/forms.py:481 account/forms.py:571 msgid "New Password (again)" msgstr "Шинэ Нууц Үг (дахин)" #: account/forms.py:489 msgid "Please type your current password." msgstr "Одоогийн нууц үгээ оруулна уу." #: account/forms.py:529 msgid "The e-mail address is not assigned to any user account" msgstr "Имэйл хаяг ямар ч хэрэглэгчийн бүртгэлтэй холбогдоогүй" #: account/forms.py:592 msgid "The password reset token was invalid." msgstr "Нууц үг шинэчлэх токен буруу байна." #: account/models.py:22 msgid "user" msgstr "хэрэглэгч" #: account/models.py:28 account/models.py:83 msgid "e-mail address" msgstr "имэйл хаяг" #: account/models.py:30 msgid "verified" msgstr "баталгаажуулсан" #: account/models.py:31 msgid "primary" msgstr "үндсэн" #: account/models.py:36 msgid "email address" msgstr "имэйл хаяг" #: account/models.py:37 msgid "email addresses" msgstr "имэйл хаягууд" #: account/models.py:86 msgid "created" msgstr "үүсгэсэн" #: account/models.py:87 msgid "sent" msgstr "илгээсэн" #: account/models.py:88 socialaccount/models.py:58 msgid "key" msgstr "түлхүүр" #: account/models.py:93 msgid "email confirmation" msgstr "имэйл баталгаажуулалт" #: account/models.py:94 msgid "email confirmations" msgstr "имэйл баталгаажуулалт" #: socialaccount/adapter.py:26 #, python-format msgid "" "An account already exists with this e-mail address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Энэ имэйл хаягтай бүртгэл системд байна. Түүгээр нэвтэрнэ үүэхлээд бүртгэл, " "дараа нь %s бүртгэлээ холбоно уу" #: socialaccount/adapter.py:131 msgid "Your account has no password set up." msgstr "Таны бүртгэлд нууц үг тохируулаагүй байна." #: socialaccount/adapter.py:138 msgid "Your account has no verified e-mail address." msgstr "Таны бүртгэлд баталгаажсан имэйл хаяг алга." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Сошиал Бүртгэлүүд" #: socialaccount/models.py:41 socialaccount/models.py:84 msgid "provider" msgstr "үйлчилгээ үзүүлэгч" #: socialaccount/models.py:45 msgid "name" msgstr "нэр" #: socialaccount/models.py:47 msgid "client id" msgstr "клиент ID" #: socialaccount/models.py:49 msgid "App ID, or consumer key" msgstr "Апп ID эсвэл хэрэглэгчийн түлхүүр" #: socialaccount/models.py:52 msgid "secret key" msgstr "нууц түлхүүр" #: socialaccount/models.py:55 msgid "API secret, client secret, or consumer secret" msgstr "API нууц, клиент нууц эсвэл хэрэглэгчийн нууц" #: socialaccount/models.py:58 msgid "Key" msgstr "Түлхүүр" #: socialaccount/models.py:74 msgid "social application" msgstr "сошиал апп" #: socialaccount/models.py:75 msgid "social applications" msgstr "сошиал апп-ууд" #: socialaccount/models.py:105 msgid "uid" msgstr "uid" #: socialaccount/models.py:107 msgid "last login" msgstr "сүүлд нэвтэрсэн" #: socialaccount/models.py:108 msgid "date joined" msgstr "бүртгүүлсэн огноо" #: socialaccount/models.py:109 msgid "extra data" msgstr "нэмэлт өгөгдөл" #: socialaccount/models.py:113 msgid "social account" msgstr "сошиал хаяг" #: socialaccount/models.py:114 msgid "social accounts" msgstr "сошиал хаягууд" #: socialaccount/models.py:139 msgid "token" msgstr "токен" #: socialaccount/models.py:140 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "\"oauth_token\" (OAuth1) эсвэл нэвтрэх токен (OAuth2)" #: socialaccount/models.py:144 msgid "token secret" msgstr "токен нууц" #: socialaccount/models.py:145 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "\"oauth_token_secret\" (OAuth1) эсвэл шинэчлэх токен (OAuth2)" #: socialaccount/models.py:148 msgid "expires at" msgstr "дуусах хугацаа" #: socialaccount/models.py:153 msgid "social application token" msgstr "сошиал апп токен" #: socialaccount/models.py:154 msgid "social application tokens" msgstr "сошиал апп токенууд" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "Буруу профайлын өгөгдөл" #: socialaccount/providers/oauth/client.py:85 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "\"%s\"-с request токен авах үед буруу хариу." #: socialaccount/providers/oauth/client.py:117 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "\"%s\"-с access токен авах үед буруу хариу." #: socialaccount/providers/oauth/client.py:138 #, python-format msgid "No request token saved for \"%s\"." msgstr "\"%s\"-д request токен хадгалагдаагүй." #: socialaccount/providers/oauth/client.py:189 #, python-format msgid "No access token saved for \"%s\"." msgstr "\"%s\"-д access токен хадгалагдаагүй." #: socialaccount/providers/oauth/client.py:210 #, python-format msgid "No access to private resources at \"%s\"." msgstr "\"%s\" дээрх private resource-д хандах боломжгүй." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:8 msgid "Account Inactive" msgstr "Бүртгэл идэвхгүй" #: templates/account/account_inactive.html:10 msgid "This account is inactive." msgstr "Энэ бүртгэл идэвхгүй байна." #: templates/account/email.html:5 templates/account/email.html:8 msgid "E-mail Addresses" msgstr "Имэйл Хаягууд" #: templates/account/email.html:10 msgid "The following e-mail addresses are associated with your account:" msgstr "Дараах и-мэйл хаягууд таны бүртгэлтэй холбоотой байна:" #: templates/account/email.html:24 msgid "Verified" msgstr "Баталгаажсан" #: templates/account/email.html:26 msgid "Unverified" msgstr "Баталгаажаагүй" #: templates/account/email.html:28 msgid "Primary" msgstr "Үндсэн" #: templates/account/email.html:34 msgid "Make Primary" msgstr "Үндсэн Болгох" #: templates/account/email.html:35 msgid "Re-send Verification" msgstr "Баталгаажуулалтыг дахин илгээх" #: templates/account/email.html:36 templates/socialaccount/connections.html:35 msgid "Remove" msgstr "Устгах" #: templates/account/email.html:43 msgid "Warning:" msgstr "Анхааруулга:" #: templates/account/email.html:43 msgid "" "You currently do not have any e-mail address set up. You should really add " "an e-mail address so you can receive notifications, reset your password, etc." msgstr "" "Танд одоогоор тохируулсан имэйл хаяг байхгүй байна. Та имэйл хаяг нэмэх " "хэрэгтэйингэснээр та мэдэгдэл хүлээн авах, нууц үгээ шинэчлэх г.м боломжтой " "болно." #: templates/account/email.html:48 msgid "Add E-mail Address" msgstr "Имэйл хаяг нэмэх" #: templates/account/email.html:53 msgid "Add E-mail" msgstr "Имэйл нэмэх" #: templates/account/email.html:63 msgid "Do you really want to remove the selected e-mail address?" msgstr "Та үнэхээр сонгосон имэйл хаягаа устгахыг хүсэж байна уу?" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "%(site_name)s-с мэнд хүргэж байна!" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "%(site_name)s-г хэрэглэсэнд баярлалаа!%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, python-format msgid "" "You're receiving this e-mail because user %(user_display)s has given your e-" "mail address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "%(user_display)s хэрэглэгч %(site_domain)s дээр бүртгэл бүртгүүлэхийн " "тулданы и-мэйл хаягийг өгсөн тул та энэ имэйлийг хүлээн авч байна.\n" "\n" "Үүнийг зөв эсэхийг баталгаажуулахын тулд %(activate_url)s руу очно уу" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your E-mail Address" msgstr "Имэйл хаягаа баталгаажуулна уу" #: templates/account/email/password_reset_key_message.txt:4 msgid "" "You're receiving this e-mail because you or someone else has requested a " "password for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Та эсвэл өөр хэн нэгэн таны бүртгэлтэй нууц үгийг хүссэн тул нэ " "имэйлийгхүлээн авч байна.\n" "Хэрэв та нууц үг шинэчлэх хүсэлт гаргаагүй бол энэ имэйлийг устгаж болно." "Нууц үгээ шинэчлэх бол доорх холбоос дээр дарна уу." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "Хэрэв та мартсан бол таны хэрэглэгчийн нэр %(username)s байна." #: templates/account/email/password_reset_key_subject.txt:3 msgid "Password Reset E-mail" msgstr "Нууц Үг Шинэчлэх Имэйл" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm E-mail Address" msgstr "Имэйл Хаяг Баталгаажуулах" #: templates/account/email_confirm.html:16 #, python-format msgid "" "Please confirm that %(email)s is an e-mail " "address for user %(user_display)s." msgstr "" "%(email)s нь %(user_display)s " "хэрэглэгчийнимайл хаяг гэдгийг баталгаажуулна уу." #: templates/account/email_confirm.html:20 msgid "Confirm" msgstr "Баталгаажуулах" #: templates/account/email_confirm.html:27 #, python-format msgid "" "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgstr "" "Энэ и-мэйл баталгаажуулах холбоосын хугацаа дууссан эсвэл хүчингүй байна.шинэ имэйлээр баталгаажуулах хүсэлт гаргана уу." #: templates/account/login.html:6 templates/account/login.html:10 #: templates/account/login.html:43 msgid "Sign In" msgstr "Нэвтрэх" #: templates/account/login.html:15 #, python-format msgid "" "Please sign in with one\n" "of your existing third party accounts. Or, sign " "up\n" "for a %(site_name)s account and sign in below:" msgstr "" "Одоо байгаа гуравдагч\n" "этгээдийн бүртгэлийн аль нэгээр нэвтэрнэ үү. Эсвэл %(site_name)s бүртгэлд бүртгүүлждоор нэвтэрнэ үү:" #: templates/account/login.html:25 msgid "or" msgstr "эсвэл" #: templates/account/login.html:32 #, python-format msgid "" "If you have not created an account yet, then please\n" "sign up first." msgstr "" "Хэрэв та бүртгэл үүсгээгүй байгаа бол\n" "эхлээд бүртгүүлнэ үү." #: templates/account/login.html:42 templates/account/password_change.html:14 msgid "Forgot Password?" msgstr "Нууц Үг Мартсан?" #: templates/account/logout.html:5 templates/account/logout.html:8 #: templates/account/logout.html:17 msgid "Sign Out" msgstr "Гарах" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Та холболт салгахдаа итгэлтэй байна уу?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary e-mail address (%(email)s)." msgstr "Та үндсэн имэйл хаяг (%(email)s)-г устгах боломжгүй." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation e-mail sent to %(email)s." msgstr "%(email)s-руу баталгаажуулах имэйл илгээсэн." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "Та %(email)s-г баталгаажууллаа." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed e-mail address %(email)s." msgstr "%(email)s и-мэйл хаягийг устгасан." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "%(name)s нэрээр амжилттай нэвтэрлээ." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Та холболт салгалаа." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Нууц үг амжилттай өөрчлөгдлөө." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Нууц үгийг амжилттай тохирууллаа." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary e-mail address set." msgstr "Үндсэн имэйл хаягийг тохируулсан." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary e-mail address must be verified." msgstr "Таны үндсэн имэйл хаягийг баталгаажуулсан байх ёстой." #: templates/account/password_change.html:5 #: templates/account/password_change.html:8 #: templates/account/password_change.html:13 #: templates/account/password_reset_from_key.html:4 #: templates/account/password_reset_from_key.html:7 #: templates/account/password_reset_from_key_done.html:4 #: templates/account/password_reset_from_key_done.html:7 msgid "Change Password" msgstr "Нууц үг солих" #: templates/account/password_reset.html:6 #: templates/account/password_reset.html:10 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:9 msgid "Password Reset" msgstr "Нууц үг шинэчлэх" #: templates/account/password_reset.html:15 msgid "" "Forgotten your password? Enter your e-mail address below, and we'll send you " "an e-mail allowing you to reset it." msgstr "" "Нууц үгээ мартсан уу? Доор бүртгэлтэй и-мэйл хаягаа оруулж нууц үг шинэчлэх " "имэйлээр нууц үгээ сэргээнэ уу." #: templates/account/password_reset.html:20 msgid "Reset My Password" msgstr "Нууц Үг Шинэчлэх" #: templates/account/password_reset.html:23 msgid "Please contact us if you have any trouble resetting your password." msgstr "Нууц үгээ шинэчлэхэд асуудал гарвал бидэнтэй холбогдоно уу." #: templates/account/password_reset_done.html:15 msgid "" "We have sent you an e-mail. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Бид танд имэйл илгээсэн. Хэдхэн минутын дотор хүлээж авахгүй бол бидэнтэй " "холбоо барина уу." #: templates/account/password_reset_from_key.html:7 msgid "Bad Token" msgstr "Муу токен" #: templates/account/password_reset_from_key.html:11 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Нууц үг шинэчлэх холбоос хүчингүй байсан, үүнийг аль хэдийн ашигласан байж " "магадгүй. шинэ нууц үг шинэчлэх хүсэлт " "гаргана уу." #: templates/account/password_reset_from_key.html:17 msgid "change password" msgstr "нууц үг солих" #: templates/account/password_reset_from_key.html:20 #: templates/account/password_reset_from_key_done.html:8 msgid "Your password is now changed." msgstr "Таны нууц үг одоо өөрчлөгдсөн байна." #: templates/account/password_set.html:5 templates/account/password_set.html:8 #: templates/account/password_set.html:13 msgid "Set Password" msgstr "Нууц үг тохируулах" #: templates/account/signup.html:5 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Бүртгүүлэх" #: templates/account/signup.html:8 templates/account/signup.html:18 #: templates/socialaccount/signup.html:8 templates/socialaccount/signup.html:19 msgid "Sign Up" msgstr "Бүртгүүлэх" #: templates/account/signup.html:10 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "" "Бүртгэлтэй юу? Тэгвэл бүртгэлтэй хаягаар нэвтрэнэ " "үү." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:8 msgid "Sign Up Closed" msgstr "Бүртгэл хаалттай" #: templates/account/signup_closed.html:10 msgid "We are sorry, but the sign up is currently closed." msgstr "Уучлаарай, бүртгэл одоогоор хаалттай байна." #: templates/account/snippets/already_logged_in.html:5 msgid "Note" msgstr "Анхаарна уу" #: templates/account/snippets/already_logged_in.html:5 #, python-format msgid "you are already logged in as %(user_display)s." msgstr "Та аль хэдийн %(user_display)s нэрээр нэвтэрсэн байна." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:8 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:8 msgid "Verify Your E-mail Address" msgstr "Имэйл хаягаа баталгаажуулна уу" #: templates/account/verification_sent.html:10 msgid "" "We have sent an e-mail to you for verification. Follow the link provided to " "finalize the signup process. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Бид танд баталгаажуулах и-мэйл илгээсэн. Бүртгүүлэх үйл явцыг дуусгахын тулд " "өгөгдсөн холбоосыг дагана уу. Хэдэн минутын дотор хүлээж авахгүй бол " "бидэнтэй холбоо барина уу." #: templates/account/verified_email_required.html:12 msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your e-mail address. " msgstr "" "Сайтын энэ хэсэг нь таныг өөрийгөө мөн болохыг\n" "баталгаажуулахыг биднээс шаарддаг. Энэ зорилгоор бид таныг цахим\n" "шуудангийн хаягаа эзэмшиж буй эсэхийг баталгаажуулахыг шаардаж байна." #: templates/account/verified_email_required.html:16 msgid "" "We have sent an e-mail to you for\n" "verification. Please click on the link inside this e-mail. Please\n" "contact us if you do not receive it within a few minutes." msgstr "" "Бид танд баталгаажуулах и-мэйл илгээсэн.\n" "Энэ цахим шуудангийн доторх холбоос дээр дарна уу. Хэдэн минутын\n" "дотор хүлээж авахгүй бол бидэнтэй холбоо барина уу." #: templates/account/verified_email_required.html:20 #, python-format msgid "" "Note: you can still change your e-" "mail address." msgstr "" "Санамж: та мэйл хаягаа өөрчлөхболомжтой хэвээр байна." #: templates/openid/login.html:9 msgid "OpenID Sign In" msgstr "OpenID-р Нэвтрэх" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:8 msgid "Social Network Login Failure" msgstr "Сошиал-р нэвтрэхэд алдаа гарлаа" #: templates/socialaccount/authentication_error.html:10 msgid "" "An error occurred while attempting to login via your social network account." msgstr "Таны сошиал бүртгэлээр нэвтрэхийг оролдох үед алдаа гарлаа." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:8 msgid "Account Connections" msgstr "Бүртгэлийн холболтууд" #: templates/socialaccount/connections.html:11 msgid "" "You can sign in to your account using any of the following third party " "accounts:" msgstr "" "Та дараах гуравдагч этгээдийн аль нэг бүртгэлийг ашиглан өөрийн бүртгэлд " "нэвтэрч болно." #: templates/socialaccount/connections.html:43 msgid "" "You currently have no social network accounts connected to this account." msgstr "Танд одоогоор энэ бүртгэлд холбогдсон сошиал бүртгэл байхгүй байна." #: templates/socialaccount/connections.html:46 msgid "Add a 3rd Party Account" msgstr "Гуравдагч этгээдийн бүртгэл нэмэх" #: templates/socialaccount/login.html:6 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:8 #, python-format msgid "You are about to connect a new third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:10 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:12 #, python-format msgid "You are about to sign in using a third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Нэвтрэлт цуцлагдсан" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Та одоо байгаа бүртгэлийнхээ аль нэгийг ашиглан манай сайтад нэвтрэхээ " "цуцлахаар шийдсэн. Хэрэв энэ нь алдаа байсан бол нэвтэрнэ үү." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "Сошиал хаяг холбогдсон байна." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "Сошиал хаяг аль хэдийн өөр бүртгэлд холбогдсон байна." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Сошиал хаягыг салгасан." #: templates/socialaccount/signup.html:10 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Та %(site_name)s руу нэвтрэхийн тулд %(provider_name)s бүртгэлээ\n" "ашиглах гэж байна. Эцсийн алхам болгон дараах маягтыг бөглөнө үү:" django-allauth-0.47.0/allauth/locale/nb/000077500000000000000000000000001415442050100177605ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/nb/LC_MESSAGES/000077500000000000000000000000001415442050100215455ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/nb/LC_MESSAGES/django.po000066400000000000000000000614671415442050100233650ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-12-09 08:41-0600\n" "PO-Revision-Date: 2019-12-18 18:56+0100\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: account/adapter.py:45 msgid "Username can not be used. Please use other username." msgstr "Brukernavnet kan ikke benyttes. Vennligst velg et annet brukernavn." #: account/adapter.py:51 msgid "Too many failed login attempts. Try again later." msgstr "For mange innloggingsforsøk. Vennligst prøv igjen senere." #: account/adapter.py:53 msgid "A user is already registered with this e-mail address." msgstr "En bruker med denne e-postadressen er allerede registrert." #: account/adapter.py:300 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Passordet må være minst {0} tegn." #: account/apps.py:7 msgid "Accounts" msgstr "Kontoer" #: account/forms.py:59 account/forms.py:413 msgid "You must type the same password each time." msgstr "Du må skrive det samme passordet hver gang." #: account/forms.py:92 account/forms.py:381 account/forms.py:498 msgid "Password" msgstr "Passord" #: account/forms.py:93 msgid "Remember Me" msgstr "Husk meg" #: account/forms.py:97 msgid "This account is currently inactive." msgstr "Denne kontoen er inaktiv." #: account/forms.py:99 msgid "The e-mail address and/or password you specified are not correct." msgstr "E-postadressen og/eller passordet du oppgav er feil." #: account/forms.py:102 msgid "The username and/or password you specified are not correct." msgstr "Brukernavnet og/eller passordet du oppgav er feil." #: account/forms.py:113 account/forms.py:279 account/forms.py:439 #: account/forms.py:517 msgid "E-mail address" msgstr "E-postadresse" #: account/forms.py:117 account/forms.py:316 account/forms.py:436 #: account/forms.py:512 msgid "E-mail" msgstr "E-post" #: account/forms.py:120 account/forms.py:123 account/forms.py:269 #: account/forms.py:272 msgid "Username" msgstr "Brukernavn" #: account/forms.py:133 msgid "Username or e-mail" msgstr "Brukernavn eller e-post" #: account/forms.py:136 msgctxt "field label" msgid "Login" msgstr "Logg inn" #: account/forms.py:307 msgid "E-mail (again)" msgstr "E-post (igjen)" #: account/forms.py:311 msgid "E-mail address confirmation" msgstr "Bekreftelse av e-postadresse" #: account/forms.py:319 msgid "E-mail (optional)" msgstr "E-post (valgfritt)" #: account/forms.py:359 msgid "You must type the same email each time." msgstr "Du må skrive inn samme e-post hver gang." #: account/forms.py:384 account/forms.py:499 msgid "Password (again)" msgstr "Passord (igjen)" #: account/forms.py:448 msgid "This e-mail address is already associated with this account." msgstr "Denne e-postadressen er allerede tilknyttet denne kontoen." #: account/forms.py:451 msgid "This e-mail address is already associated with another account." msgstr "Denne e-postadressen er tilknyttet en annen konto." #: account/forms.py:453 #, fuzzy, python-format #| msgid "Your account has no verified e-mail address." msgid "You cannot add more than %d e-mail addresses." msgstr "Din konto har ingen verifisert e-postadresse." #: account/forms.py:478 msgid "Current Password" msgstr "Nåværende passord" #: account/forms.py:480 account/forms.py:570 msgid "New Password" msgstr "Nytt passord" #: account/forms.py:481 account/forms.py:571 msgid "New Password (again)" msgstr "Nytt passord (igjen)" #: account/forms.py:489 msgid "Please type your current password." msgstr "Vennligst skriv inn ditt passord." #: account/forms.py:529 msgid "The e-mail address is not assigned to any user account" msgstr "E-postadressen er ikke tilknyttet noen brukerkonto" #: account/forms.py:592 msgid "The password reset token was invalid." msgstr "Nøkkelen for passordgjenopprettelse var ugyldig." #: account/models.py:22 msgid "user" msgstr "bruker" #: account/models.py:28 account/models.py:83 msgid "e-mail address" msgstr "epostadresse" #: account/models.py:30 msgid "verified" msgstr "verifisert" #: account/models.py:31 msgid "primary" msgstr "primær" #: account/models.py:36 msgid "email address" msgstr "e-postadresse" #: account/models.py:37 msgid "email addresses" msgstr "e-postadresser" #: account/models.py:86 msgid "created" msgstr "opprettet" #: account/models.py:87 msgid "sent" msgstr "sendt" #: account/models.py:88 socialaccount/models.py:58 msgid "key" msgstr "nøkkel" #: account/models.py:93 msgid "email confirmation" msgstr "e-postbekreftelse" #: account/models.py:94 msgid "email confirmations" msgstr "e-postbekreftelser" #: socialaccount/adapter.py:26 #, python-format msgid "" "An account already exists with this e-mail address. Please sign in to that " "account first, then connect your %s account." msgstr "" "En konto med denne e-postadressen eksisterer fra før. Vennligst logg inn på " "den kontoen først for så å koble til din %s konto." #: socialaccount/adapter.py:131 msgid "Your account has no password set up." msgstr "Kontoen din har ikke noe passord." #: socialaccount/adapter.py:138 msgid "Your account has no verified e-mail address." msgstr "Din konto har ingen verifisert e-postadresse." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Sosiale kontoer" #: socialaccount/models.py:41 socialaccount/models.py:84 msgid "provider" msgstr "tilbyder" #: socialaccount/models.py:45 msgid "name" msgstr "navn" #: socialaccount/models.py:47 msgid "client id" msgstr "klient-ID" #: socialaccount/models.py:49 msgid "App ID, or consumer key" msgstr "App-ID eller konsumentnøkkel" #: socialaccount/models.py:52 msgid "secret key" msgstr "hemmelig nøkkel" #: socialaccount/models.py:55 msgid "API secret, client secret, or consumer secret" msgstr "API-nøkkel, klient-nøkkel eller konsumentnøkkel" #: socialaccount/models.py:58 msgid "Key" msgstr "Nøkkel" #: socialaccount/models.py:74 msgid "social application" msgstr "sosial applikasjon" #: socialaccount/models.py:75 msgid "social applications" msgstr "sosiale applikasjoner" #: socialaccount/models.py:105 msgid "uid" msgstr "uid" #: socialaccount/models.py:107 msgid "last login" msgstr "siste innlogging" #: socialaccount/models.py:108 msgid "date joined" msgstr "ble med dato" #: socialaccount/models.py:109 msgid "extra data" msgstr "ekstra data" #: socialaccount/models.py:113 msgid "social account" msgstr "sosialkonto" #: socialaccount/models.py:114 msgid "social accounts" msgstr "sosialkontoer" #: socialaccount/models.py:139 msgid "token" msgstr "nøkkel" #: socialaccount/models.py:140 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "\"oauth_token\" (OAuth1) eller aksess token (OAuth2)" #: socialaccount/models.py:144 msgid "token secret" msgstr "hemmelig nøkkel" #: socialaccount/models.py:145 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "\"oauth_token_secret\" (OAuth1) eller oppdateringsnøkkel (OAuth2)" #: socialaccount/models.py:148 msgid "expires at" msgstr "utgår den" #: socialaccount/models.py:153 msgid "social application token" msgstr "sosial applikasjonsnøkkel" #: socialaccount/models.py:154 msgid "social application tokens" msgstr "sosial applikasjonsnøkler" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "Ugyldig profildata" #: socialaccount/providers/oauth/client.py:85 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Ugyldig respons ved henting av forespørselsnøkkel fra \"%s\"." #: socialaccount/providers/oauth/client.py:117 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Ugyldig respons ved henting av tilgangsnøkkel fra \"%s\"." #: socialaccount/providers/oauth/client.py:138 #, python-format msgid "No request token saved for \"%s\"." msgstr "Ingen etterspørselsnøkler lagret for \"%s\"." #: socialaccount/providers/oauth/client.py:189 #, python-format msgid "No access token saved for \"%s\"." msgstr "Ingen tilgangsnøkler lagret for \"%s\"." #: socialaccount/providers/oauth/client.py:210 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Ingen tilgang til private ressurser på \"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:8 msgid "Account Inactive" msgstr "Inaktiv konto" #: templates/account/account_inactive.html:10 msgid "This account is inactive." msgstr "Denne kontoen er inaktiv." #: templates/account/email.html:5 templates/account/email.html:8 msgid "E-mail Addresses" msgstr "E-postadresser" #: templates/account/email.html:10 msgid "The following e-mail addresses are associated with your account:" msgstr "Følgende e-postadresser er assosiert med din konto:" #: templates/account/email.html:24 msgid "Verified" msgstr "Verifisert" #: templates/account/email.html:26 msgid "Unverified" msgstr "Ikke verifisert" #: templates/account/email.html:28 msgid "Primary" msgstr "Primær" #: templates/account/email.html:34 msgid "Make Primary" msgstr "Sett som primær" #: templates/account/email.html:35 msgid "Re-send Verification" msgstr "Send verifikasjon på nytt" #: templates/account/email.html:36 templates/socialaccount/connections.html:35 msgid "Remove" msgstr "Fjern" #: templates/account/email.html:43 msgid "Warning:" msgstr "Advarsel:" #: templates/account/email.html:43 msgid "" "You currently do not have any e-mail address set up. You should really add " "an e-mail address so you can receive notifications, reset your password, etc." msgstr "" "Du har for tiden ingen e-postadresse satt opp. Du burde legge til en e-" "postadresse slik at du kan motta varsler, gjennoprette passord ol." #: templates/account/email.html:48 msgid "Add E-mail Address" msgstr "Legg til e-postadresse" #: templates/account/email.html:53 msgid "Add E-mail" msgstr "Legg til e-post" #: templates/account/email.html:63 msgid "Do you really want to remove the selected e-mail address?" msgstr "Er du sikker på at du vil fjerne valgt e-postadresse?" #: templates/account/email/base_message.txt:1 #, fuzzy, python-format #| msgid "" #| "Thank you from %(site_name)s!\n" #| "%(site_domain)s" msgid "Hello from %(site_name)s!" msgstr "" "Takk fra %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "Takk for at du bruker %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because user %(user_display)s has given " #| "yours as an e-mail address to connect their account.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s\n" msgid "" "You're receiving this e-mail because user %(user_display)s has given your e-" "mail address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "Hei fra %(site_name)s!\n" "\n" "Du mottar denne e-postadressen fordi %(user_display)s har gitt din e-" "postkonto for å koble til sin brukerkonto.\n" "\n" "For å bekrefte at dette stemmer, gå til %(activate_url)s\n" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your E-mail Address" msgstr "Vennligst bekreft din e-postadresse" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this e-mail because you or someone else has requested a " "password for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Hei fra %(site_name)s!\n" "\n" "Du mottar denne e-postadressen fordi du eller noen andre har etterspurt et " "passord for din brukerkonto.\n" "Meldingen kan trygt ignoreres om du ikke foretok denne etterspørselen. Klikk " "på linken nedenfor for å gjennopprette ditt passord." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "I tilfelle du har glemt det: Brukernavnet ditt er %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 msgid "Password Reset E-mail" msgstr "E-post for gjenopprettelse av passord" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm E-mail Address" msgstr "Bekreft e-postadresse" #: templates/account/email_confirm.html:16 #, python-format msgid "" "Please confirm that %(email)s is an e-mail " "address for user %(user_display)s." msgstr "" "Vennligst bekreft at %(email)s er en e-" "postadresse for bruker %(user_display)s." #: templates/account/email_confirm.html:20 msgid "Confirm" msgstr "Bekreft" #: templates/account/email_confirm.html:27 #, python-format msgid "" "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgstr "" "Denne e-postbekreftelseslinken er utgått eller ugyldig. Vennligst etterspør en ny e-postbekreftelseslink." #: templates/account/login.html:6 templates/account/login.html:10 #: templates/account/login.html:43 msgid "Sign In" msgstr "Logg inn" #: templates/account/login.html:15 #, python-format msgid "" "Please sign in with one\n" "of your existing third party accounts. Or, sign " "up\n" "for a %(site_name)s account and sign in below:" msgstr "" "Vennligst logg in med en\n" "av dine eksisterende tredjeparts kontoer på %(site_name)s. Eller, registrer deg\n" "og logg inn nedenfor:" #: templates/account/login.html:25 msgid "or" msgstr "eller" #: templates/account/login.html:32 #, python-format msgid "" "If you have not created an account yet, then please\n" "sign up first." msgstr "" "Om du enda ikke har laget en konto, vennligst\n" "registrer deg først." #: templates/account/login.html:42 templates/account/password_change.html:14 msgid "Forgot Password?" msgstr "Glemt passord?" #: templates/account/logout.html:5 templates/account/logout.html:8 #: templates/account/logout.html:17 msgid "Sign Out" msgstr "Logg ut" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Er du sikker at du ønsker å logge ut?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary e-mail address (%(email)s)." msgstr "Du kan ikke fjerne den primær e-postadressen (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation e-mail sent to %(email)s." msgstr "Bekreftelsese-post er sendt til %(email)s." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "Du har bekreftet %(email)s." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed e-mail address %(email)s." msgstr "Fjern e-postadressen %(email)s." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Logget inn som %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Du har logget ut." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Passordet er endret." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Passordet er satt." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary e-mail address set." msgstr "Primær e-postadresse er satt." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary e-mail address must be verified." msgstr "Din primære e-postadresse må være verifisert." #: templates/account/password_change.html:5 #: templates/account/password_change.html:8 #: templates/account/password_change.html:13 #: templates/account/password_reset_from_key.html:4 #: templates/account/password_reset_from_key.html:7 #: templates/account/password_reset_from_key_done.html:4 #: templates/account/password_reset_from_key_done.html:7 msgid "Change Password" msgstr "Endre Passord" #: templates/account/password_reset.html:6 #: templates/account/password_reset.html:10 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:9 msgid "Password Reset" msgstr "Passordgjenopprettelse" #: templates/account/password_reset.html:15 msgid "" "Forgotten your password? Enter your e-mail address below, and we'll send you " "an e-mail allowing you to reset it." msgstr "" "Glemt ditt passord? Skriv inn din e-postadresse nedenfor, så sender vi deg " "en e-post for å lage et nytt." #: templates/account/password_reset.html:20 msgid "Reset My Password" msgstr "Gjenopprett mitt passord" #: templates/account/password_reset.html:23 msgid "Please contact us if you have any trouble resetting your password." msgstr "Vennligst kontakt oss om du har problemer med passordgjenopprettelsen." #: templates/account/password_reset_done.html:15 msgid "" "We have sent you an e-mail. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Vi har sendt deg en e-post. Vennligst kontakt oss om du ikke mottar den " "innen et par minutter." #: templates/account/password_reset_from_key.html:7 msgid "Bad Token" msgstr "Ugyldig token" #: templates/account/password_reset_from_key.html:11 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Passordgjenopprettelseslinken er ugyldig – muligens fordi den allerede er " "brukt. Vennligst etterspør en ny " "passordgjennopprettelse." #: templates/account/password_reset_from_key.html:17 msgid "change password" msgstr "Endre passord" #: templates/account/password_reset_from_key.html:20 #: templates/account/password_reset_from_key_done.html:8 msgid "Your password is now changed." msgstr "Ditt passord er endret." #: templates/account/password_set.html:5 templates/account/password_set.html:8 #: templates/account/password_set.html:13 msgid "Set Password" msgstr "Sett passord" #: templates/account/signup.html:5 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Registrer deg" #: templates/account/signup.html:8 templates/account/signup.html:18 #: templates/socialaccount/signup.html:8 templates/socialaccount/signup.html:19 msgid "Sign Up" msgstr "Registrer deg" #: templates/account/signup.html:10 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "" "Har du allerede en konto? Vennligst logg inn." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:8 msgid "Sign Up Closed" msgstr "Registrering stengt" #: templates/account/signup_closed.html:10 msgid "We are sorry, but the sign up is currently closed." msgstr "Beklager, men registrering er for tiden stengt." #: templates/account/snippets/already_logged_in.html:5 msgid "Note" msgstr "Notat" #: templates/account/snippets/already_logged_in.html:5 #, python-format msgid "you are already logged in as %(user_display)s." msgstr "du er allerede logget inn som %(user_display)s." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:8 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:8 msgid "Verify Your E-mail Address" msgstr "Bekreft din e-postadresse" #: templates/account/verification_sent.html:10 msgid "" "We have sent an e-mail to you for verification. Follow the link provided to " "finalize the signup process. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Vi har sendt deg en e-post for verifisering. Følg linken for å fullføre " "registreringen. Vennligst kontakt oss om du ikke har mottatt den innen et " "par minutter." #: templates/account/verified_email_required.html:12 msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your e-mail address. " msgstr "" "Denne delen av siden krever at du verifiserer at du er den du er. På grunn " "av dette, må du verifisere ditt eierskap av din e-postadresse. " #: templates/account/verified_email_required.html:16 msgid "" "We have sent an e-mail to you for\n" "verification. Please click on the link inside this e-mail. Please\n" "contact us if you do not receive it within a few minutes." msgstr "" "Vi har send en e-post til deg for\n" "verifikasjon. Vennligst klikk på linken i e-posten. Vennligst kontakt oss om " "du ikke mottar den innen et par minutter." #: templates/account/verified_email_required.html:20 #, python-format msgid "" "Note: you can still change your e-" "mail address." msgstr "" "Merk: du kan fremdeles endre din " "your e-postadresse." #: templates/openid/login.html:9 msgid "OpenID Sign In" msgstr "OpenID-innlogging" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:8 msgid "Social Network Login Failure" msgstr "Innlogging ved hjelp av sosialt nettverk mislyktes" #: templates/socialaccount/authentication_error.html:10 msgid "" "An error occurred while attempting to login via your social network account." msgstr "" "Det skjedde en feil ved forsøket på å logge inn via din nettverkskonto." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:8 msgid "Account Connections" msgstr "Kontotilkoblinger" #: templates/socialaccount/connections.html:11 msgid "" "You can sign in to your account using any of the following third party " "accounts:" msgstr "" "Du kan logge inn på din konto ved å bruke en av følgende tredjeparts kontoer:" #: templates/socialaccount/connections.html:43 msgid "" "You currently have no social network accounts connected to this account." msgstr "Du har for tiden ingen tredjepartskontoer tilkoblet din konto." #: templates/socialaccount/connections.html:46 msgid "Add a 3rd Party Account" msgstr "Legg til en tredjepartskonto" #: templates/socialaccount/login.html:6 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:8 #, python-format msgid "You are about to connect a new third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:10 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:12 #, python-format msgid "You are about to sign in using a third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Innlogging kansellert" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Du bestemt deg for å kansellere innlogging til siden ved å bruke en av dine " "eksisterende kontoer. Om dette var ved en feil, vennligst fortsett til innloggingen." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "Tredjepartskontoen har blitt tilknytet." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "Tredjepartskonten er allerede tilknytet til en annen konto." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Tredjepartskontoen er blitt frakoblet." #: templates/socialaccount/signup.html:10 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Du er på vei til å bruke din %(provider_name)s konto for å logge inn på\n" "%(site_name)s. Som et siste steg, vennligst fullfør følgende skjema:" #~ msgid "Account" #~ msgstr "Konto" django-allauth-0.47.0/allauth/locale/nl/000077500000000000000000000000001415442050100177725ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/nl/LC_MESSAGES/000077500000000000000000000000001415442050100215575ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/nl/LC_MESSAGES/django.po000066400000000000000000000626341415442050100233740ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # pennersr , 2013 msgid "" msgstr "" "Project-Id-Version: django-allauth\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-12-09 08:41-0600\n" "PO-Revision-Date: 2021-12-09 16:29+0100\n" "Last-Translator: pennersr \n" "Language-Team: Dutch (http://www.transifex.com/projects/p/django-allauth/" "language/nl/)\n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: account/adapter.py:45 msgid "Username can not be used. Please use other username." msgstr "Deze gebruikersnaam mag je niet gebruiken, kies een andere." #: account/adapter.py:51 msgid "Too many failed login attempts. Try again later." msgstr "Te veel inlogpogingen. Probeer het later nogmaals." #: account/adapter.py:53 msgid "A user is already registered with this e-mail address." msgstr "Er is al een gebruiker geregistreerd met dit e-mailadres." #: account/adapter.py:300 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Het wachtwoord moet minimaal {0} tekens bevatten." #: account/apps.py:7 msgid "Accounts" msgstr "Accounts" #: account/forms.py:59 account/forms.py:413 msgid "You must type the same password each time." msgstr "Je moet hetzelfde wachtwoord twee keer intoetsen." #: account/forms.py:92 account/forms.py:381 account/forms.py:498 msgid "Password" msgstr "Wachtwoord" #: account/forms.py:93 msgid "Remember Me" msgstr "Onthouden" #: account/forms.py:97 msgid "This account is currently inactive." msgstr "Dit account is niet actief" #: account/forms.py:99 msgid "The e-mail address and/or password you specified are not correct." msgstr "Je e-mailadres en wachtwoord komen niet overeen." #: account/forms.py:102 msgid "The username and/or password you specified are not correct." msgstr "Je gebruikersnaam en wachtwoord komen niet overeen." #: account/forms.py:113 account/forms.py:279 account/forms.py:439 #: account/forms.py:517 msgid "E-mail address" msgstr "E-mailadres" #: account/forms.py:117 account/forms.py:316 account/forms.py:436 #: account/forms.py:512 msgid "E-mail" msgstr "E-mail" #: account/forms.py:120 account/forms.py:123 account/forms.py:269 #: account/forms.py:272 msgid "Username" msgstr "Gebruikersnaam" #: account/forms.py:133 msgid "Username or e-mail" msgstr "Gebruikersnaam of e-mail" #: account/forms.py:136 msgctxt "field label" msgid "Login" msgstr "Login" #: account/forms.py:307 msgid "E-mail (again)" msgstr "E-mail (optioneel)" #: account/forms.py:311 msgid "E-mail address confirmation" msgstr "Bevestig e-mailadres" #: account/forms.py:319 msgid "E-mail (optional)" msgstr "E-mail (optioneel)" #: account/forms.py:359 msgid "You must type the same email each time." msgstr "Je moet hetzelfde e-mailadres twee keer intoetsen." #: account/forms.py:384 account/forms.py:499 msgid "Password (again)" msgstr "Wachtwoord (bevestigen)" #: account/forms.py:448 msgid "This e-mail address is already associated with this account." msgstr "Dit e-mailadres is al geassocieerd met dit account." #: account/forms.py:451 msgid "This e-mail address is already associated with another account." msgstr "Dit e-mailadres is al geassocieerd met een ander account." #: account/forms.py:453 #, python-format msgid "You cannot add more than %d e-mail addresses." msgstr "Je kunt niet meer dan %d e-mailadressen toevoegen." #: account/forms.py:478 msgid "Current Password" msgstr "Huidig wachtwoord" #: account/forms.py:480 account/forms.py:570 msgid "New Password" msgstr "Nieuw wachtwoord" #: account/forms.py:481 account/forms.py:571 msgid "New Password (again)" msgstr "Nieuw wachtwoord (bevestigen)" #: account/forms.py:489 msgid "Please type your current password." msgstr "Geef je huidige wachtwoord op." #: account/forms.py:529 msgid "The e-mail address is not assigned to any user account" msgstr "Dit e-mailadres is niet bij ons bekend" #: account/forms.py:592 msgid "The password reset token was invalid." msgstr "De wachtwoordherstel-sleutel is niet geldig." #: account/models.py:22 msgid "user" msgstr "gebruiker" #: account/models.py:28 account/models.py:83 msgid "e-mail address" msgstr "e-mailadres" #: account/models.py:30 msgid "verified" msgstr "geverifieerd" #: account/models.py:31 msgid "primary" msgstr "Primair" #: account/models.py:36 msgid "email address" msgstr "e-mailadres" #: account/models.py:37 msgid "email addresses" msgstr "e-mailadressen" #: account/models.py:86 msgid "created" msgstr "aangemaakt" #: account/models.py:87 msgid "sent" msgstr "verstuurd" #: account/models.py:88 socialaccount/models.py:58 msgid "key" msgstr "sleutel" #: account/models.py:93 msgid "email confirmation" msgstr "e-mailadres bevestiging" #: account/models.py:94 msgid "email confirmations" msgstr "e-mailadres bevestigingen" #: socialaccount/adapter.py:26 #, python-format msgid "" "An account already exists with this e-mail address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Er bestaat al een account met dit e-mailadres. Meld je eerst aan met dit " "account, verbind daarna je %s account." #: socialaccount/adapter.py:131 msgid "Your account has no password set up." msgstr "Je account heeft geen wachtwoord ingesteld." #: socialaccount/adapter.py:138 msgid "Your account has no verified e-mail address." msgstr "Je account heeft geen geverifieerd e-mailadres." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Sociale accounts" #: socialaccount/models.py:41 socialaccount/models.py:84 msgid "provider" msgstr "" #: socialaccount/models.py:45 msgid "name" msgstr "naam" #: socialaccount/models.py:47 msgid "client id" msgstr "" #: socialaccount/models.py:49 msgid "App ID, or consumer key" msgstr "" #: socialaccount/models.py:52 msgid "secret key" msgstr "" #: socialaccount/models.py:55 msgid "API secret, client secret, or consumer secret" msgstr "" #: socialaccount/models.py:58 msgid "Key" msgstr "" #: socialaccount/models.py:74 msgid "social application" msgstr "" #: socialaccount/models.py:75 msgid "social applications" msgstr "" #: socialaccount/models.py:105 msgid "uid" msgstr "" #: socialaccount/models.py:107 msgid "last login" msgstr "" #: socialaccount/models.py:108 msgid "date joined" msgstr "" #: socialaccount/models.py:109 msgid "extra data" msgstr "" #: socialaccount/models.py:113 msgid "social account" msgstr "" #: socialaccount/models.py:114 msgid "social accounts" msgstr "" #: socialaccount/models.py:139 msgid "token" msgstr "" #: socialaccount/models.py:140 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "" #: socialaccount/models.py:144 msgid "token secret" msgstr "" #: socialaccount/models.py:145 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "" #: socialaccount/models.py:148 msgid "expires at" msgstr "" #: socialaccount/models.py:153 msgid "social application token" msgstr "" #: socialaccount/models.py:154 msgid "social application tokens" msgstr "" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "" #: socialaccount/providers/oauth/client.py:85 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "" "Ongeldig antwoord ontvangen tijdens het ophalen van een verzoeksleutel van " "\"%s\"." #: socialaccount/providers/oauth/client.py:117 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "" "Ongeldig antwoord ontvangen tijdens het ophalen van een toegangssleutel van " "\"%s\"." #: socialaccount/providers/oauth/client.py:138 #, python-format msgid "No request token saved for \"%s\"." msgstr "Geen verzoeksleutel opgeslagen voor \"%s\"." #: socialaccount/providers/oauth/client.py:189 #, python-format msgid "No access token saved for \"%s\"." msgstr "Geen toegangssleutel opgeslagen voor \"%s\"." #: socialaccount/providers/oauth/client.py:210 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Geen toegang tot prive data bij \"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:8 msgid "Account Inactive" msgstr "Account inactief" #: templates/account/account_inactive.html:10 msgid "This account is inactive." msgstr "Dit account is niet actief" #: templates/account/email.html:5 templates/account/email.html:8 msgid "E-mail Addresses" msgstr "E-mailadressen" #: templates/account/email.html:10 msgid "The following e-mail addresses are associated with your account:" msgstr "De volgende e-mailadressen zijn gekoppeld aan jouw account:" #: templates/account/email.html:24 msgid "Verified" msgstr "Geverifieerd" #: templates/account/email.html:26 msgid "Unverified" msgstr "Ongeverifieerd" #: templates/account/email.html:28 msgid "Primary" msgstr "Primair" #: templates/account/email.html:34 msgid "Make Primary" msgstr "Maak primair" #: templates/account/email.html:35 msgid "Re-send Verification" msgstr "Stuur verificatie e-mail opnieuw" #: templates/account/email.html:36 templates/socialaccount/connections.html:35 msgid "Remove" msgstr "Verwijder" #: templates/account/email.html:43 msgid "Warning:" msgstr "Waarschuwing:" #: templates/account/email.html:43 msgid "" "You currently do not have any e-mail address set up. You should really add " "an e-mail address so you can receive notifications, reset your password, etc." msgstr "" "Het is raadzaam een e-mailadres toe te voegen zodat je notificaties kunt " "ontvangen, je wachtwoord opnieuw kunt instellen, enz." #: templates/account/email.html:48 msgid "Add E-mail Address" msgstr "Voeg e-mailadres toe" #: templates/account/email.html:53 msgid "Add E-mail" msgstr "E-mail toevoegen" #: templates/account/email.html:63 msgid "Do you really want to remove the selected e-mail address?" msgstr "Wil je het geselecteerde e-mailadres echt verwijderen?" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "Hallo van %(site_name)s!" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "Bedankt voor het gebruiken van %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, python-format msgid "" "You're receiving this e-mail because user %(user_display)s has given your e-" "mail address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "Je ontvangt deze e-mail omdat gebruiker %(user_display)s van\n" "%(site_domain)s dit als e-mailadres heeft opgegeven om te koppelen\n" "aan zijn of haar account.\n" "\n" "Om te bevestigen dat dit correct is, bezoek: %(activate_url)s" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your E-mail Address" msgstr "Bevestig je e-mailadres" #: templates/account/email/password_reset_key_message.txt:4 msgid "" "You're receiving this e-mail because you or someone else has requested a " "password for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Je ontvangt deze mail omdat er een verzoek is ingelegd om het\n" "wachtwoord behorende bij je %(site_domain)s account opnieuw in te\n" "stellen. Je kunt deze gerust mail negeren als je dit niet zelf gedaan\n" "hebt. Anders, klik op de volgende link om je wachtwoord opnieuw in te\n" "stellen." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "Deze link hoort bij je account met gebruikersnaam %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 msgid "Password Reset E-mail" msgstr "Nieuw wachtwoord" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm E-mail Address" msgstr "Bevestig e-mailadres" #: templates/account/email_confirm.html:16 #, python-format msgid "" "Please confirm that %(email)s is an e-mail " "address for user %(user_display)s." msgstr "" "Bevestig dat %(email)s een e-mailadres is " "voor gebruiker %(user_display)s." #: templates/account/email_confirm.html:20 msgid "Confirm" msgstr "Bevestigen" #: templates/account/email_confirm.html:27 #, python-format msgid "" "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgstr "" "Deze e-mail verificatie link is verlopen of niet geldig. Dien een\n" "nieuw e-mail verificatie verzoek in." #: templates/account/login.html:6 templates/account/login.html:10 #: templates/account/login.html:43 msgid "Sign In" msgstr "Aanmelden" #: templates/account/login.html:15 #, python-format msgid "" "Please sign in with one\n" "of your existing third party accounts. Or, sign " "up\n" "for a %(site_name)s account and sign in below:" msgstr "" "Meld je aan met een van je bestaande externe accounts. Of, registreer voor een %(site_name)s account en " "meld je hiermee aan:" #: templates/account/login.html:25 msgid "or" msgstr "of" #: templates/account/login.html:32 #, python-format msgid "" "If you have not created an account yet, then please\n" "sign up first." msgstr "" "Als je nog geen account hebt registreer je\n" "dan eerst." #: templates/account/login.html:42 templates/account/password_change.html:14 msgid "Forgot Password?" msgstr "Wachtwoord vergeten?" #: templates/account/logout.html:5 templates/account/logout.html:8 #: templates/account/logout.html:17 msgid "Sign Out" msgstr "Afmelden" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Weet je zeker dat je wilt afmelden?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary e-mail address (%(email)s)." msgstr "You kunt je primaire e-mailadres (%(email)s) niet verwijderen." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation e-mail sent to %(email)s." msgstr "Bevestigings e-mail verzonden aan %(email)s." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "Je hebt het e-mailadres %(email)s bevestigd" #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed e-mail address %(email)s." msgstr "E-mailadres %(email)s verwijderd." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Je bent nu ingelogd als %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Je bent afgemeld." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Wachtwoord wijziging geslaagd." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Je wachtwoord is gewijzigd." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary e-mail address set." msgstr "Primair e-mailadres ingesteld." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary e-mail address must be verified." msgstr "Je primaire e-mailadres moet geverifieerd zijn." #: templates/account/password_change.html:5 #: templates/account/password_change.html:8 #: templates/account/password_change.html:13 #: templates/account/password_reset_from_key.html:4 #: templates/account/password_reset_from_key.html:7 #: templates/account/password_reset_from_key_done.html:4 #: templates/account/password_reset_from_key_done.html:7 msgid "Change Password" msgstr "Wachtwoord wijzigen" #: templates/account/password_reset.html:6 #: templates/account/password_reset.html:10 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:9 msgid "Password Reset" msgstr "Nieuw wachtwoord" #: templates/account/password_reset.html:15 msgid "" "Forgotten your password? Enter your e-mail address below, and we'll send you " "an e-mail allowing you to reset it." msgstr "" "Wachtwoord vergeten? Vul je e-mailadres in en we sturen je een e-mail " "waarmee je een nieuw wachtwoord kunt instellen." #: templates/account/password_reset.html:20 msgid "Reset My Password" msgstr "Herstel mijn wachtwoord" #: templates/account/password_reset.html:23 msgid "Please contact us if you have any trouble resetting your password." msgstr "" "Neem a.u.b. contact met ons op als het niet lukt je wachtwoord opnieuw in te " "stellen." #: templates/account/password_reset_done.html:15 msgid "" "We have sent you an e-mail. Please contact us if you do not receive it " "within a few minutes." msgstr "" "We hebben je een e-mail verstuurd. Neem a.u.b. contact met ons op als je " "deze niet binnen enkele minuten ontvangen hebt." #: templates/account/password_reset_from_key.html:7 msgid "Bad Token" msgstr "Ongeldige sleutel" #: templates/account/password_reset_from_key.html:11 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "De link om je wachtwoord opnieuw in te stellen is niet geldig. Mogelijk is " "deze al een keer gebruikt. Herstel je " "wachtwoord opnieuw." #: templates/account/password_reset_from_key.html:17 msgid "change password" msgstr "Wachtwoord wijzigen" #: templates/account/password_reset_from_key.html:20 #: templates/account/password_reset_from_key_done.html:8 msgid "Your password is now changed." msgstr "Je wachtwoord is gewijzigd." #: templates/account/password_set.html:5 templates/account/password_set.html:8 #: templates/account/password_set.html:13 msgid "Set Password" msgstr "Zet wachtwoord" #: templates/account/signup.html:5 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Registreren" #: templates/account/signup.html:8 templates/account/signup.html:18 #: templates/socialaccount/signup.html:8 templates/socialaccount/signup.html:19 msgid "Sign Up" msgstr "Registreren" #: templates/account/signup.html:10 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "Heb je al een account? Meld je dan aan." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:8 msgid "Sign Up Closed" msgstr "Registratie gesloten" #: templates/account/signup_closed.html:10 msgid "We are sorry, but the sign up is currently closed." msgstr "Helaas, maar je kunt je momenteel niet registreren." #: templates/account/snippets/already_logged_in.html:5 msgid "Note" msgstr "Notitie" #: templates/account/snippets/already_logged_in.html:5 #, python-format msgid "you are already logged in as %(user_display)s." msgstr "je bent al ingelogd als %(user_display)s." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:8 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:8 msgid "Verify Your E-mail Address" msgstr "Verifieer je e-mailadres" #: templates/account/verification_sent.html:10 msgid "" "We have sent an e-mail to you for verification. Follow the link provided to " "finalize the signup process. Please contact us if you do not receive it " "within a few minutes." msgstr "" "We hebben een e-mail verstuurd ter verificatie. Volg de link in deze mail om " "je registratie af te ronden. Neem a.u.b. contact met ons op als je deze e-" "mail niet binnen enkele minuten ontvangt." #: templates/account/verified_email_required.html:12 msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your e-mail address. " msgstr "" "Voor dit gedeelte van de site is het nodig dat we je identiteit\n" "verifiëren. Via een verificatie e-mail kunnen we controleren dat je\n" "daadwerkelijk toegang hebt tot het opgegeven e-mailadres." #: templates/account/verified_email_required.html:16 msgid "" "We have sent an e-mail to you for\n" "verification. Please click on the link inside this e-mail. Please\n" "contact us if you do not receive it within a few minutes." msgstr "" "Volg de link in de verificatie e-mail om de controle af te ronden. Neem a.u." "b. contact met ons op als je de e-mail niet binnen enkele minuten ontvangt." #: templates/account/verified_email_required.html:20 #, python-format msgid "" "Note: you can still change your e-" "mail address." msgstr "" "Merk op: je kunt altijd je e-mail " "adres wijzigen." #: templates/openid/login.html:9 msgid "OpenID Sign In" msgstr "Aanmelden via OpenID" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:8 msgid "Social Network Login Failure" msgstr "Aanmelden Mislukt" #: templates/socialaccount/authentication_error.html:10 msgid "" "An error occurred while attempting to login via your social network account." msgstr "" "Er is een fout opgetreden toen we je wilde inloggen via je externe account." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:8 msgid "Account Connections" msgstr "Account Connecties" #: templates/socialaccount/connections.html:11 msgid "" "You can sign in to your account using any of the following third party " "accounts:" msgstr "Je kunt jezelf aanmelden met een van de volgende externe accounts:" #: templates/socialaccount/connections.html:43 msgid "" "You currently have no social network accounts connected to this account." msgstr "Je hebt momenteel geen externe accounts gekoppeld." #: templates/socialaccount/connections.html:46 msgid "Add a 3rd Party Account" msgstr "Voeg een extern account toe" #: templates/socialaccount/login.html:6 #, python-format msgid "Connect %(provider)s" msgstr "Koppel %(provider)s" #: templates/socialaccount/login.html:8 #, python-format msgid "You are about to connect a new third party account from %(provider)s." msgstr "Je staat op het punt om een nieuw account van %(provider)s aan je account te koppelen." #: templates/socialaccount/login.html:10 #, python-format msgid "Sign In Via %(provider)s" msgstr "Aanmelden via %(provider)s" #: templates/socialaccount/login.html:12 #, python-format msgid "You are about to sign in using a third party account from %(provider)s." msgstr "Je staat op het punt om jezelf aan te melden via %(provider)s." #: templates/socialaccount/login.html:17 msgid "Continue" msgstr "Ga verder" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Aanmelden geannuleerd" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Je hebt het aanmelden via een extern account geannuleerd. Als dit een " "vergissing was, meld je dan opnieuw aan." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "Het externe account is gekoppeld." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "Dit externe account is al gekoppeld aan een ander account." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Het externe account is ontkoppeld." #: templates/socialaccount/signup.html:10 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Om bij %(site_name)s in te kunnen loggen via %(provider_name)s hebben we de " "volgende gegevens nodig:" #~ msgid "Account" #~ msgstr "Account" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "Je login en wachtwoord komen niet overeen." #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "" #~ "Gebruikersnamen mogen alleen letters, cijfers en @/./+/-/_ bevatten." #~ msgid "This username is already taken. Please choose another." #~ msgstr "Deze gebruikersnaam is al in gebruik. Kies a.u.b. een andere naam." #, fuzzy #~| msgid "Sign In" #~ msgid "Shopify Sign In" #~ msgstr "Aanmelden" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "Je hebt bevestigd dat %(email)s een e-" #~ "mail adres is voor gebruiker %(user_display)s." #~ msgid "Thanks for using our site!" #~ msgstr "Bedankt voor het gebruik van onze site!" #~ msgid "Confirmation e-mail sent to %(email)s" #~ msgstr "Bevestigings e-mail verzonden aan %(email)s" #~ msgid "Delete Password" #~ msgstr "Wis wachtwoord" #~ msgid "" #~ "You may delete your password since you are currently logged in using " #~ "OpenID." #~ msgstr "Je kunt je wachtwoord wissen omdat je via OpenID bent ingelogd." #~ msgid "delete my password" #~ msgstr "Wis mijn wachtwoord" #~ msgid "Password Deleted" #~ msgstr "Wachtwoord gewist" #~ msgid "Your password has been deleted." #~ msgstr "Je wachtwoord is gewist." django-allauth-0.47.0/allauth/locale/pl/000077500000000000000000000000001415442050100177745ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/pl/LC_MESSAGES/000077500000000000000000000000001415442050100215615ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/pl/LC_MESSAGES/django.po000066400000000000000000000641511415442050100233720ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Free Software Foundation, Inc. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-12-09 08:41-0600\n" "PO-Revision-Date: 2020-10-12 12:34+0200\n" "Last-Translator: Radek Czajka \n" "Language-Team: \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.3\n" "Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n" "%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n" "%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" #: account/adapter.py:45 msgid "Username can not be used. Please use other username." msgstr "Nie możesz użyć tej nazwy użytkownika. Proszę wybierz inną." #: account/adapter.py:51 msgid "Too many failed login attempts. Try again later." msgstr "Zbyt wiele nieudanych prób logowania. Spróbuj ponownie później." #: account/adapter.py:53 msgid "A user is already registered with this e-mail address." msgstr "W systemie jest już zarejestrowany użytkownik o tym adresie e-mail." #: account/adapter.py:300 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Hasło musi składać się z co najmniej {0} znaków." #: account/apps.py:7 msgid "Accounts" msgstr "Konta" #: account/forms.py:59 account/forms.py:413 msgid "You must type the same password each time." msgstr "Musisz wpisać za każdym razem to samo hasło." #: account/forms.py:92 account/forms.py:381 account/forms.py:498 msgid "Password" msgstr "Hasło" #: account/forms.py:93 msgid "Remember Me" msgstr "Pamiętaj mnie" #: account/forms.py:97 msgid "This account is currently inactive." msgstr "Konto jest obecnie nieaktywne." #: account/forms.py:99 msgid "The e-mail address and/or password you specified are not correct." msgstr "Podany adres e-mail i/lub hasło są niepoprawne." #: account/forms.py:102 msgid "The username and/or password you specified are not correct." msgstr "Podana nazwa użytkownika i/lub hasło są niepoprawne." #: account/forms.py:113 account/forms.py:279 account/forms.py:439 #: account/forms.py:517 msgid "E-mail address" msgstr "Adres e-mail" #: account/forms.py:117 account/forms.py:316 account/forms.py:436 #: account/forms.py:512 msgid "E-mail" msgstr "E-mail" #: account/forms.py:120 account/forms.py:123 account/forms.py:269 #: account/forms.py:272 msgid "Username" msgstr "Nazwa użytkownika" #: account/forms.py:133 msgid "Username or e-mail" msgstr "Nazwa użytkownika lub e-mail" #: account/forms.py:136 msgctxt "field label" msgid "Login" msgstr "Login" #: account/forms.py:307 msgid "E-mail (again)" msgstr "E-mail (ponownie)" #: account/forms.py:311 msgid "E-mail address confirmation" msgstr "Powierdzenie adresu email" #: account/forms.py:319 msgid "E-mail (optional)" msgstr "E-mail (opcjonalnie)" #: account/forms.py:359 msgid "You must type the same email each time." msgstr "Musisz wpisać za każdym razem ten sam e-mail." #: account/forms.py:384 account/forms.py:499 msgid "Password (again)" msgstr "Hasło (ponownie)" #: account/forms.py:448 msgid "This e-mail address is already associated with this account." msgstr "Ten adres e-mail jest już powiązany z tym kontem." #: account/forms.py:451 msgid "This e-mail address is already associated with another account." msgstr "Ten adres e-mail jest już powiązany z innym kontem." #: account/forms.py:453 #, python-format msgid "You cannot add more than %d e-mail addresses." msgstr "Nie możesz dodać więcej niż %d adresów e-mail." #: account/forms.py:478 msgid "Current Password" msgstr "Obecne hasło" #: account/forms.py:480 account/forms.py:570 msgid "New Password" msgstr "Nowe hasło" #: account/forms.py:481 account/forms.py:571 msgid "New Password (again)" msgstr "Nowe hasło (ponownie)" #: account/forms.py:489 msgid "Please type your current password." msgstr "Proszę wpisz swoje obecne hasło." #: account/forms.py:529 msgid "The e-mail address is not assigned to any user account" msgstr "Adres e-mail nie jest powiązany z żadnym kontem użytkownika" #: account/forms.py:592 msgid "The password reset token was invalid." msgstr "Token resetowania hasła był nieprawidłowy." #: account/models.py:22 msgid "user" msgstr "użytkownik" #: account/models.py:28 account/models.py:83 msgid "e-mail address" msgstr "adres e-mail" #: account/models.py:30 msgid "verified" msgstr "zweryfikowany" #: account/models.py:31 msgid "primary" msgstr "podstawowy" #: account/models.py:36 msgid "email address" msgstr "adres e-mail" #: account/models.py:37 msgid "email addresses" msgstr "adresy e-mail" #: account/models.py:86 msgid "created" msgstr "utworzono" #: account/models.py:87 msgid "sent" msgstr "wysłano" #: account/models.py:88 socialaccount/models.py:58 msgid "key" msgstr "klucz" #: account/models.py:93 msgid "email confirmation" msgstr "potwierdzenie adresu e-mail" #: account/models.py:94 msgid "email confirmations" msgstr "potwierdzenia adresów e-mail" #: socialaccount/adapter.py:26 #, python-format msgid "" "An account already exists with this e-mail address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Istnieje już konto dla tego adresu e-mail. Zaloguj się najpierw na to konto, " "a następnie połącz swoje konto %s." #: socialaccount/adapter.py:131 msgid "Your account has no password set up." msgstr "Twoje konto nie posiada hasła." #: socialaccount/adapter.py:138 msgid "Your account has no verified e-mail address." msgstr "Twoje konto nie ma zweryfikowanego adresu e-mail." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Konta społecznościowe" #: socialaccount/models.py:41 socialaccount/models.py:84 msgid "provider" msgstr "dostawca usług" #: socialaccount/models.py:45 msgid "name" msgstr "nazwa" #: socialaccount/models.py:47 msgid "client id" msgstr "id klienta" #: socialaccount/models.py:49 msgid "App ID, or consumer key" msgstr "ID aplikacji lub klucz odbiorcy" #: socialaccount/models.py:52 msgid "secret key" msgstr "klucz prywatny" #: socialaccount/models.py:55 msgid "API secret, client secret, or consumer secret" msgstr "Klucz prywatny API, klienta lub odbiorcy" #: socialaccount/models.py:58 msgid "Key" msgstr "Klucz" #: socialaccount/models.py:74 msgid "social application" msgstr "aplikacja społecznościowa" #: socialaccount/models.py:75 msgid "social applications" msgstr "aplikacje społecznościowe" #: socialaccount/models.py:105 msgid "uid" msgstr "uid" #: socialaccount/models.py:107 msgid "last login" msgstr "data ostatniego logowania" #: socialaccount/models.py:108 msgid "date joined" msgstr "data przyłączenia" #: socialaccount/models.py:109 msgid "extra data" msgstr "dodatkowe dane" #: socialaccount/models.py:113 msgid "social account" msgstr "konto społecznościowe" #: socialaccount/models.py:114 msgid "social accounts" msgstr "konta społecznościowe" #: socialaccount/models.py:139 msgid "token" msgstr "token" #: socialaccount/models.py:140 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "\"oauth_token\" (OAuth1) lub access token (OAuth2)" #: socialaccount/models.py:144 msgid "token secret" msgstr "token secret" #: socialaccount/models.py:145 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "\"oauth_token_secret\" (OAuth1) lub refresh token (OAuth2)" #: socialaccount/models.py:148 msgid "expires at" msgstr "wygasa" #: socialaccount/models.py:153 msgid "social application token" msgstr "token aplikacji społecznościowej" #: socialaccount/models.py:154 msgid "social application tokens" msgstr "tokeny aplikacji społecznościowych" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "Nieprawidłowe dane profilu" #: socialaccount/providers/oauth/client.py:85 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Błędna odpowiedź podczas pobierania tokena z \"%s\"." #: socialaccount/providers/oauth/client.py:117 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Błędna odpowiedź podczas pobierania tokena autoryzacji z \"%s\"." #: socialaccount/providers/oauth/client.py:138 #, python-format msgid "No request token saved for \"%s\"." msgstr "Brak tokena zapisanego dla \"%s\"." #: socialaccount/providers/oauth/client.py:189 #, python-format msgid "No access token saved for \"%s\"." msgstr "Brak zapisanego tokena autoryzacji \"%s\"." #: socialaccount/providers/oauth/client.py:210 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Brak dostępu do prywatnych zasobów na \"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:8 msgid "Account Inactive" msgstr "Konto nieaktywne" #: templates/account/account_inactive.html:10 msgid "This account is inactive." msgstr "To konto jest nieaktywne." #: templates/account/email.html:5 templates/account/email.html:8 msgid "E-mail Addresses" msgstr "Adresy e-mail" #: templates/account/email.html:10 msgid "The following e-mail addresses are associated with your account:" msgstr "Poniższe adresy e-mail są powiązane z Twoim kontem:" #: templates/account/email.html:24 msgid "Verified" msgstr "Zweryfikowany" #: templates/account/email.html:26 msgid "Unverified" msgstr "Brak weryfikacji" #: templates/account/email.html:28 msgid "Primary" msgstr "Podstawowy" #: templates/account/email.html:34 msgid "Make Primary" msgstr "Uczyń podstawowym" #: templates/account/email.html:35 msgid "Re-send Verification" msgstr "Prześlij ponownie wiadomość weryfikacyjną" #: templates/account/email.html:36 templates/socialaccount/connections.html:35 msgid "Remove" msgstr "Usuń" #: templates/account/email.html:43 msgid "Warning:" msgstr "Uwaga:" #: templates/account/email.html:43 msgid "" "You currently do not have any e-mail address set up. You should really add " "an e-mail address so you can receive notifications, reset your password, etc." msgstr "" "Aktualnie nie posiadasz przypisanych do twojego konta adresów e-mail. Warto " "dodać taki adres, aby otrzymywać informacje administracyjne, wiadomości o " "zmianie hasła, itd." #: templates/account/email.html:48 msgid "Add E-mail Address" msgstr "Dodaj adres e-mail" #: templates/account/email.html:53 msgid "Add E-mail" msgstr "Dodaj e-mail" #: templates/account/email.html:63 msgid "Do you really want to remove the selected e-mail address?" msgstr "Czy naprawdę chcesz usunąć wybrany adres e-mail?" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "Witamy z %(site_name)s!" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "Dziękujemy za korzystanie z %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, python-format msgid "" "You're receiving this e-mail because user %(user_display)s has given your e-" "mail address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "Otrzymujesz ten e-mail, ponieważ użytkownik %(user_display)s podał niniejszy " "adres e-mail, aby powiązać go z swoim kontem w serwisie %(site_domain)s.\n" "\n" "Aby potwierdzić powiązanie, kliknij w link %(activate_url)s" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your E-mail Address" msgstr "Proszę potwierdź adres e-mail" #: templates/account/email/password_reset_key_message.txt:4 msgid "" "You're receiving this e-mail because you or someone else has requested a " "password for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Otrzymujesz tę wiadomość, ponieważ Ty lub ktoś inny poprosił o zresetowanie " "hasła do Twojego konta.\n" "Niniejszą wiadomość możesz spokojnie zignorować, jeżeli prośba nie " "pochodziła od Ciebie. Kliknij w link poniżej, aby zresetować hasło." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "" "Na wszelki wypadek przypominamy, że Twoja nazwa użytkownika to %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 msgid "Password Reset E-mail" msgstr "E-mail z łączem do zmiany hasła" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm E-mail Address" msgstr "Potwierdź adres e-mail" #: templates/account/email_confirm.html:16 #, python-format msgid "" "Please confirm that %(email)s is an e-mail " "address for user %(user_display)s." msgstr "" "Proszę potwierdź, że adres %(email)s jest " "adresem e-mail dla użytkownika %(user_display)s." #: templates/account/email_confirm.html:20 msgid "Confirm" msgstr "Potwierdź" #: templates/account/email_confirm.html:27 #, python-format msgid "" "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgstr "" "Łącze z adresem do zresetowania hasła wygasło lub jest niepoprawne. wygenerować nowe łącze dla Twojego adresu. ." #: templates/account/login.html:6 templates/account/login.html:10 #: templates/account/login.html:43 msgid "Sign In" msgstr "Zaloguj" #: templates/account/login.html:15 #, python-format msgid "" "Please sign in with one\n" "of your existing third party accounts. Or, sign " "up\n" "for a %(site_name)s account and sign in below:" msgstr "" "Proszę zaloguj się jednym\n" "z Twoich zewnętrznych kont. Lub zarejestruj się \n" "w %(site_name)s i zaloguj poniżej:" #: templates/account/login.html:25 msgid "or" msgstr "lub" #: templates/account/login.html:32 #, python-format msgid "" "If you have not created an account yet, then please\n" "sign up first." msgstr "" "Jeżeli nie masz jeszcze konta, to proszę zarejestruj się." #: templates/account/login.html:42 templates/account/password_change.html:14 msgid "Forgot Password?" msgstr "Nie pamiętasz hasła?" #: templates/account/logout.html:5 templates/account/logout.html:8 #: templates/account/logout.html:17 msgid "Sign Out" msgstr "Wyloguj się" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Czy na pewno chcesz się wylogować ?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary e-mail address (%(email)s)." msgstr "Nie możesz usunąć podstawowego adresu e-mail (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation e-mail sent to %(email)s." msgstr "E-mail z potwierdzeniem został wysłany na adres %(email)s." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "Adres %(email)s został potwierdzony." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed e-mail address %(email)s." msgstr "Adres e-mail %(email)s został usunięty." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Zalogowano jako %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Wylogowano." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Hasło zostało zmienione." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Hasło zostało ustawione." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary e-mail address set." msgstr "Podstawowy adres e-mail został ustawiony." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary e-mail address must be verified." msgstr "Twój podstawowy adres e-mail musi być zweryfikowany." #: templates/account/password_change.html:5 #: templates/account/password_change.html:8 #: templates/account/password_change.html:13 #: templates/account/password_reset_from_key.html:4 #: templates/account/password_reset_from_key.html:7 #: templates/account/password_reset_from_key_done.html:4 #: templates/account/password_reset_from_key_done.html:7 msgid "Change Password" msgstr "Zmień hasło" #: templates/account/password_reset.html:6 #: templates/account/password_reset.html:10 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:9 msgid "Password Reset" msgstr "Resetowanie hasła" #: templates/account/password_reset.html:15 msgid "" "Forgotten your password? Enter your e-mail address below, and we'll send you " "an e-mail allowing you to reset it." msgstr "" "Nie pamiętasz swojego hasła? Wpisz swój adres e-mail poniżej, a my wyślemy " "Ci wiadomość, dzięki której dokonasz jego zmiany." #: templates/account/password_reset.html:20 msgid "Reset My Password" msgstr "Zresetuj moje hasło" #: templates/account/password_reset.html:23 msgid "Please contact us if you have any trouble resetting your password." msgstr "" "Skontaktuj się z nami, jeśli masz problem ze zresetowaniem swojego hasła." #: templates/account/password_reset_done.html:15 msgid "" "We have sent you an e-mail. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Wysłaliśmy Ci e-mail. Proszę skontaktuj się z nami, jeśli go nie otrzymasz w " "ciągu paru minut." #: templates/account/password_reset_from_key.html:7 msgid "Bad Token" msgstr "Nieprawidłowy klucz" #: templates/account/password_reset_from_key.html:11 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Łącze resetujące hasło jest niepoprawne, prawdopodobnie zostało już użyte. " "Zresetuj hasło jeszcze raz." #: templates/account/password_reset_from_key.html:17 msgid "change password" msgstr "zmień hasło" #: templates/account/password_reset_from_key.html:20 #: templates/account/password_reset_from_key_done.html:8 msgid "Your password is now changed." msgstr "Twoje hasło zostało zmienione." #: templates/account/password_set.html:5 templates/account/password_set.html:8 #: templates/account/password_set.html:13 msgid "Set Password" msgstr "Ustaw hasło" #: templates/account/signup.html:5 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Zarejestruj się" #: templates/account/signup.html:8 templates/account/signup.html:18 #: templates/socialaccount/signup.html:8 templates/socialaccount/signup.html:19 msgid "Sign Up" msgstr "Zarejestruj się" #: templates/account/signup.html:10 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "" "Masz już konto? Jeżeli tak, to zaloguj się." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:8 msgid "Sign Up Closed" msgstr "Rejestracja zamknięta" #: templates/account/signup_closed.html:10 msgid "We are sorry, but the sign up is currently closed." msgstr "Przepraszamy, ale w tej chwili rejestracja jest zamknięta." #: templates/account/snippets/already_logged_in.html:5 msgid "Note" msgstr "Uwaga" #: templates/account/snippets/already_logged_in.html:5 #, python-format msgid "you are already logged in as %(user_display)s." msgstr "jesteś już zalogowany/-a jako %(user_display)s." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:8 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:8 msgid "Verify Your E-mail Address" msgstr "Zweryfikuj swój adres e-mail" #: templates/account/verification_sent.html:10 msgid "" "We have sent an e-mail to you for verification. Follow the link provided to " "finalize the signup process. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Przesłaliśmy weryfikacyjny e-mail na twój adres. Kliknij w łącze w " "wiadomości, aby zakończyć proces rejestracji. Skontaktuj się z nami, jeśli " "nie otrzymasz jej w ciągu kilku minut." #: templates/account/verified_email_required.html:12 msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your e-mail address. " msgstr "" "Ta część strony wymaga weryfikacji tego, kim jesteś. Dlatego wymagamy " "weryfikacji Twojego adresu e-mail. " #: templates/account/verified_email_required.html:16 msgid "" "We have sent an e-mail to you for\n" "verification. Please click on the link inside this e-mail. Please\n" "contact us if you do not receive it within a few minutes." msgstr "" "Wysłaliśmy Ci wiadomość e-mail.\n" "W celu weryfikacji musisz kliknąć w łącze zawarte w wiadomości. Proszę " "skontaktuj się z nami, jeśli nie dotarła do Ciebie w ciągu kilku minut." #: templates/account/verified_email_required.html:20 #, python-format msgid "" "Note: you can still change your e-" "mail address." msgstr "" "Uwaga: możesz ciągle zmienić Twój " "adres e-mail." #: templates/openid/login.html:9 msgid "OpenID Sign In" msgstr "Zaloguj przez OpenID" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:8 msgid "Social Network Login Failure" msgstr "Błędne logowanie z konta społecznościowego" #: templates/socialaccount/authentication_error.html:10 msgid "" "An error occurred while attempting to login via your social network account." msgstr "" "Wystąpił błąd podczas próby logowania za pomocą konta społecznościowego." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:8 msgid "Account Connections" msgstr "Połączone konta" #: templates/socialaccount/connections.html:11 msgid "" "You can sign in to your account using any of the following third party " "accounts:" msgstr "" "Możesz zalogować się do swojego konta używając dowolnego z poniższych kont " "zewnętrznych:" #: templates/socialaccount/connections.html:43 msgid "" "You currently have no social network accounts connected to this account." msgstr "" "Nie masz obecnie żadnych kont społecznościowych połączonych z tym kontem." #: templates/socialaccount/connections.html:46 msgid "Add a 3rd Party Account" msgstr "Dodaj konto zewnętrzne" #: templates/socialaccount/login.html:6 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:8 #, python-format msgid "You are about to connect a new third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:10 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:12 #, python-format msgid "You are about to sign in using a third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Logowanie anulowane" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Wybrano anulowanie logowania przez jedno z istniejących kont. Jeżeli to była " "pomyłka, proszę przejdź do zaloguj." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "Konto społecznościowe zostało połączone." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "To konto społecznościowe jest już połączone z innym kontem." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Konto społecznościowe zostało rozłączone." #: templates/socialaccount/signup.html:10 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Masz zamiar użyć konta %(provider_name)s do zalogowania się w \n" "%(site_name)s. Jako ostatni krok, proszę wypełnij formularz:" #~ msgid "Account" #~ msgstr "Konto" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "Login i/lub hasło, które podałeś, są niepoprawne." #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "" #~ "Nazwa użytkownika może zawierać tylko litery, cyfry oraz znaki @/./+/-/_." #~ msgid "This username is already taken. Please choose another." #~ msgstr "Nazwa użytkownika jest już w użyciu. Proszę wybierz inną." #, fuzzy #~| msgid "Sign In" #~ msgid "Shopify Sign In" #~ msgstr "Zaloguj" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "Potwierdziłeś, że adres %(email)s jest " #~ "adresem e-mail użytkownika %(user_display)s." #~ msgid "Thanks for using our site!" #~ msgstr "Dziękujemy za używanie naszej strony!" #~ msgid "Socialaccount" #~ msgstr "Konta społecznościowe" #~ msgid "Key (Stack Exchange only)" #~ msgstr "Klucz (tylko dla Stack Exchange)" #~ msgid "Confirmation e-mail sent to %(email)s" #~ msgstr "Wiadomość z potwierdzeniem została wysłana na adres %(email)s" #~ msgid "Delete Password" #~ msgstr "Skasuj hasło" #~ msgid "" #~ "You may delete your password since you are currently logged in using " #~ "OpenID." #~ msgstr "Możesz skasować swoje hasło jeśli używasz OpenID." #~ msgid "delete my password" #~ msgstr "skasuj moje hasło" #~ msgid "Password Deleted" #~ msgstr "Hasło Skasowane" #~ msgid "Your password has been deleted." #~ msgstr "Twoje hasło zostało skasowane." django-allauth-0.47.0/allauth/locale/pt_BR/000077500000000000000000000000001415442050100203675ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/pt_BR/LC_MESSAGES/000077500000000000000000000000001415442050100221545ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/pt_BR/LC_MESSAGES/django.po000066400000000000000000000637721415442050100237750ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # cacarrara , 2014 # Fábio C. Barrionuevo da Luz , 2013-2014 # Rodrigo , 2013 # Rodrigo , 2013-2014 msgid "" msgstr "" "Project-Id-Version: django-allauth\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-12-09 08:41-0600\n" "PO-Revision-Date: 2014-12-01 01:20+0000\n" "Last-Translator: cacarrara \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/" "django-allauth/language/pt_BR/)\n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: account/adapter.py:45 msgid "Username can not be used. Please use other username." msgstr "O nome de usuário não pode ser usado. Escolha outro." #: account/adapter.py:51 msgid "Too many failed login attempts. Try again later." msgstr "Muitas tentativas de acesso sem sucesso. Tente novamente mais tarde." #: account/adapter.py:53 msgid "A user is already registered with this e-mail address." msgstr "Um usuário já foi registrado com este endereço de e-mail." #: account/adapter.py:300 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "A senha deve ter no mínimo {0} caracteres." #: account/apps.py:7 msgid "Accounts" msgstr "Contas" #: account/forms.py:59 account/forms.py:413 msgid "You must type the same password each time." msgstr "A mesma senha deve ser escrita em ambos os campos." #: account/forms.py:92 account/forms.py:381 account/forms.py:498 msgid "Password" msgstr "Senha" #: account/forms.py:93 msgid "Remember Me" msgstr "Lembrar-me" #: account/forms.py:97 msgid "This account is currently inactive." msgstr "Esta conta está desativada no momento." #: account/forms.py:99 msgid "The e-mail address and/or password you specified are not correct." msgstr "O endereço de e-mail e/ou senha especificados não estão corretos." #: account/forms.py:102 msgid "The username and/or password you specified are not correct." msgstr "O nome de usuário e/ou senha especificados não estão corretos." #: account/forms.py:113 account/forms.py:279 account/forms.py:439 #: account/forms.py:517 msgid "E-mail address" msgstr "Endereço de e-mail" #: account/forms.py:117 account/forms.py:316 account/forms.py:436 #: account/forms.py:512 msgid "E-mail" msgstr "E-mail" #: account/forms.py:120 account/forms.py:123 account/forms.py:269 #: account/forms.py:272 msgid "Username" msgstr "Nome de usuário" #: account/forms.py:133 msgid "Username or e-mail" msgstr "Nome de usuário ou e-mail" #: account/forms.py:136 msgctxt "field label" msgid "Login" msgstr "Login" #: account/forms.py:307 #, fuzzy #| msgid "E-mail (optional)" msgid "E-mail (again)" msgstr "E-mail (opcional)" #: account/forms.py:311 #, fuzzy #| msgid "email confirmation" msgid "E-mail address confirmation" msgstr "confirmação de e-mail" #: account/forms.py:319 msgid "E-mail (optional)" msgstr "E-mail (opcional)" #: account/forms.py:359 #, fuzzy #| msgid "You must type the same password each time." msgid "You must type the same email each time." msgstr "A mesma senha deve ser escrita em ambos os campos." #: account/forms.py:384 account/forms.py:499 msgid "Password (again)" msgstr "Senha (novamente)" #: account/forms.py:448 msgid "This e-mail address is already associated with this account." msgstr "Este endereço de e-mail já foi associado com esta conta." #: account/forms.py:451 msgid "This e-mail address is already associated with another account." msgstr "Este endereço de e-mail já foi associado com outra conta." #: account/forms.py:453 #, fuzzy, python-format #| msgid "Your account has no verified e-mail address." msgid "You cannot add more than %d e-mail addresses." msgstr "A sua conta não tem um endereço de e-mail verificado." #: account/forms.py:478 msgid "Current Password" msgstr "Senha Atual" #: account/forms.py:480 account/forms.py:570 msgid "New Password" msgstr "Nova Senha" #: account/forms.py:481 account/forms.py:571 msgid "New Password (again)" msgstr "Nova Senha (novamente)" #: account/forms.py:489 msgid "Please type your current password." msgstr "Por favor insira a sua senha atual." #: account/forms.py:529 msgid "The e-mail address is not assigned to any user account" msgstr "O endereço de e-mail não está associado a nenhuma conta de usuário" #: account/forms.py:592 msgid "The password reset token was invalid." msgstr "O token de redefinição de senha era inválido" #: account/models.py:22 msgid "user" msgstr "usuário" #: account/models.py:28 account/models.py:83 msgid "e-mail address" msgstr "endereço de e-mail" #: account/models.py:30 msgid "verified" msgstr "verificado" #: account/models.py:31 msgid "primary" msgstr "primário" #: account/models.py:36 msgid "email address" msgstr "endereço de e-mail" #: account/models.py:37 msgid "email addresses" msgstr "endereços de e-mail" #: account/models.py:86 msgid "created" msgstr "criado" #: account/models.py:87 msgid "sent" msgstr "enviado" #: account/models.py:88 socialaccount/models.py:58 msgid "key" msgstr "chave" #: account/models.py:93 msgid "email confirmation" msgstr "confirmação de e-mail" #: account/models.py:94 msgid "email confirmations" msgstr "confirmações de e-mail" #: socialaccount/adapter.py:26 #, python-format msgid "" "An account already exists with this e-mail address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Já existe uma conta com esse endereço de e-mail. Por favor, faça login na " "conta existente e, em seguida, conecte com %s." #: socialaccount/adapter.py:131 msgid "Your account has no password set up." msgstr "A sua conta não tem senha definida." #: socialaccount/adapter.py:138 msgid "Your account has no verified e-mail address." msgstr "A sua conta não tem um endereço de e-mail verificado." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Contas Sociais" #: socialaccount/models.py:41 socialaccount/models.py:84 msgid "provider" msgstr "provedor" #: socialaccount/models.py:45 msgid "name" msgstr "nome" #: socialaccount/models.py:47 msgid "client id" msgstr "id do cliente" #: socialaccount/models.py:49 msgid "App ID, or consumer key" msgstr "App ID ou chave de consumidor" #: socialaccount/models.py:52 msgid "secret key" msgstr "Chave secreta" #: socialaccount/models.py:55 msgid "API secret, client secret, or consumer secret" msgstr "Segredo de API, segredo de cliente ou segredo de consumidor" #: socialaccount/models.py:58 msgid "Key" msgstr "Chave" #: socialaccount/models.py:74 msgid "social application" msgstr "aplicativo social" #: socialaccount/models.py:75 msgid "social applications" msgstr "aplicativos sociais" #: socialaccount/models.py:105 msgid "uid" msgstr "uid" #: socialaccount/models.py:107 msgid "last login" msgstr "último acesso" #: socialaccount/models.py:108 msgid "date joined" msgstr "data de adesão" #: socialaccount/models.py:109 msgid "extra data" msgstr "dados extras" #: socialaccount/models.py:113 msgid "social account" msgstr "conta social" #: socialaccount/models.py:114 msgid "social accounts" msgstr "contas sociais" #: socialaccount/models.py:139 msgid "token" msgstr "" #: socialaccount/models.py:140 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "\"oauth_token\" (OAuth1) ou token de acesso (OAuth2)" #: socialaccount/models.py:144 msgid "token secret" msgstr "token secreto" #: socialaccount/models.py:145 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "\"oauth_token_secret\" (OAuth1) ou token de atualização (OAuth2)" #: socialaccount/models.py:148 msgid "expires at" msgstr "expira em" #: socialaccount/models.py:153 msgid "social application token" msgstr "token de aplicativo social" #: socialaccount/models.py:154 msgid "social application tokens" msgstr "tokens de aplicativo social" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "" #: socialaccount/providers/oauth/client.py:85 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Resposta inválida ao obter token de permissão de \"%s\"." #: socialaccount/providers/oauth/client.py:117 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Resposta inválida ao obter token de acesso de \"%s\"." #: socialaccount/providers/oauth/client.py:138 #, python-format msgid "No request token saved for \"%s\"." msgstr "Nenhum token de permissão gravado para \"%s\"." #: socialaccount/providers/oauth/client.py:189 #, python-format msgid "No access token saved for \"%s\"." msgstr "Nenhum token de acesso gravado para \"%s\"." #: socialaccount/providers/oauth/client.py:210 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Sem acesso a recursos privados de \"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:8 msgid "Account Inactive" msgstr "Conta Inativa" #: templates/account/account_inactive.html:10 msgid "This account is inactive." msgstr "A sua conta está inativa." #: templates/account/email.html:5 templates/account/email.html:8 msgid "E-mail Addresses" msgstr "Endereços de E-mail" #: templates/account/email.html:10 msgid "The following e-mail addresses are associated with your account:" msgstr "Os endereços de e-mail seguintes estão associados com a sua conta:" #: templates/account/email.html:24 msgid "Verified" msgstr "Verificado" #: templates/account/email.html:26 msgid "Unverified" msgstr "Não verificado" #: templates/account/email.html:28 msgid "Primary" msgstr "Primário" #: templates/account/email.html:34 msgid "Make Primary" msgstr "Definir como primário" #: templates/account/email.html:35 msgid "Re-send Verification" msgstr "Re-enviar Verificação" #: templates/account/email.html:36 templates/socialaccount/connections.html:35 msgid "Remove" msgstr "Remover" #: templates/account/email.html:43 msgid "Warning:" msgstr "Aviso:" #: templates/account/email.html:43 msgid "" "You currently do not have any e-mail address set up. You should really add " "an e-mail address so you can receive notifications, reset your password, etc." msgstr "" "Neste momento não há um endereço de e-mail definido. Você deve adicionar um " "endereço de e-mail para que possa receber notificações, redefinir a sua " "senha, etc." #: templates/account/email.html:48 msgid "Add E-mail Address" msgstr "Adicionar endereço de e-mail" #: templates/account/email.html:53 msgid "Add E-mail" msgstr "Adicionar e-mail" #: templates/account/email.html:63 msgid "Do you really want to remove the selected e-mail address?" msgstr "Deseja mesmo remover o endereço de e-mail seleccionado?" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "User %(user_display)s at %(site_name)s has given this as an email " #| "address.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s\n" msgid "" "You're receiving this e-mail because user %(user_display)s has given your e-" "mail address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "O usuário %(user_display)s do %(site_name)s informou este endereço de e-" "mail.\n" "\n" "Para confirmar que isso está correto, vá até %(activate_url)s\n" #: templates/account/email/email_confirmation_subject.txt:3 #, fuzzy #| msgid "Confirm E-mail Address" msgid "Please Confirm Your E-mail Address" msgstr "Confirmar Endereço de E-mail" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account at %(site_domain)s.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this e-mail because you or someone else has requested a " "password for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Você está recebendo esse e-mail porque você ou alguém tentou requisitar uma " "senha para sua conta de usuário em %(site_domain)s.\n" "Essa mensagem pode ser ignorada sem preocupações se você mesmo fez a " "requisição. Clique no link abaixo para redefinir sua senha. " #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "Caso tenha esquecido, seu nome de usuário é %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 msgid "Password Reset E-mail" msgstr "E-mail de Redefinição de Senha" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm E-mail Address" msgstr "Confirmar Endereço de E-mail" #: templates/account/email_confirm.html:16 #, python-format msgid "" "Please confirm that %(email)s is an e-mail " "address for user %(user_display)s." msgstr "" "Por favor confirme que %(email)s é um " "endereço de e-mail do usuário %(user_display)s." #: templates/account/email_confirm.html:20 msgid "Confirm" msgstr "Confirmar" #: templates/account/email_confirm.html:27 #, python-format msgid "" "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgstr "" "Este link de verificação de e-mail expirou ou é inválido. Por favor peça uma nova verificação de e-mail.." #: templates/account/login.html:6 templates/account/login.html:10 #: templates/account/login.html:43 msgid "Sign In" msgstr "Entrar" #: templates/account/login.html:15 #, python-format msgid "" "Please sign in with one\n" "of your existing third party accounts. Or, sign " "up\n" "for a %(site_name)s account and sign in below:" msgstr "" "Por favor, entre com uma\n" "de suas contas externas. Ou, Cadastre-se\n" "em uma nova conta %(site_name)s e entre a seguir:" #: templates/account/login.html:25 msgid "or" msgstr "ou" #: templates/account/login.html:32 #, python-format msgid "" "If you have not created an account yet, then please\n" "sign up first." msgstr "" "Se você não tiver criado uma conta ainda, então, por favor\n" "Cadastre-se primeiro." #: templates/account/login.html:42 templates/account/password_change.html:14 msgid "Forgot Password?" msgstr "Esqueceu a sua senha?" #: templates/account/logout.html:5 templates/account/logout.html:8 #: templates/account/logout.html:17 msgid "Sign Out" msgstr "Sair" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Você tem certeza que deseja sair?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary e-mail address (%(email)s)." msgstr "Você não pode remover o seu endereço principal de e-mail (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation e-mail sent to %(email)s." msgstr "E-mail de confirmação enviado para %(email)s." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "Confirmou %(email)s" #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed e-mail address %(email)s." msgstr "%(email)s endereços de e-mail removidos." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Login realizado com sucesso como usuário %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Você saiu do sistema." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Senha alterada com sucesso." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Senha definida com sucesso." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary e-mail address set." msgstr "Endereço primário de e-mail configurado." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary e-mail address must be verified." msgstr "Seu endereço de e-mail principal precisa ser confirmado." #: templates/account/password_change.html:5 #: templates/account/password_change.html:8 #: templates/account/password_change.html:13 #: templates/account/password_reset_from_key.html:4 #: templates/account/password_reset_from_key.html:7 #: templates/account/password_reset_from_key_done.html:4 #: templates/account/password_reset_from_key_done.html:7 msgid "Change Password" msgstr "Alterar senha" #: templates/account/password_reset.html:6 #: templates/account/password_reset.html:10 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:9 msgid "Password Reset" msgstr "Redefinição da senha" #: templates/account/password_reset.html:15 msgid "" "Forgotten your password? Enter your e-mail address below, and we'll send you " "an e-mail allowing you to reset it." msgstr "" "Esqueceu a sua senha? Insira o seu endereço de e-mail abaixo, e lhe " "enviaremos um e-mail permitindo que a redefina." #: templates/account/password_reset.html:20 msgid "Reset My Password" msgstr "Redefinir a minha senha" #: templates/account/password_reset.html:23 msgid "Please contact us if you have any trouble resetting your password." msgstr "" "Por favor, contacte-nos se tiver qualquer problema para redefinir a sua " "senha." #: templates/account/password_reset_done.html:15 msgid "" "We have sent you an e-mail. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Um e-mail foi enviado. Por favor contacte-nos se não o receber nos próximos " "minutos." #: templates/account/password_reset_from_key.html:7 msgid "Bad Token" msgstr "Problema no Token" #: templates/account/password_reset_from_key.html:11 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "O link para redefinição da senha era inválido, provavelmente por já ter sido " "usado. Por favor peça uma nova redefinição " "da senha." #: templates/account/password_reset_from_key.html:17 msgid "change password" msgstr "alterar a senha" #: templates/account/password_reset_from_key.html:20 #: templates/account/password_reset_from_key_done.html:8 msgid "Your password is now changed." msgstr "A sua senha foi alterada." #: templates/account/password_set.html:5 templates/account/password_set.html:8 #: templates/account/password_set.html:13 msgid "Set Password" msgstr "Definir senha" #: templates/account/signup.html:5 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Cadastre-se" #: templates/account/signup.html:8 templates/account/signup.html:18 #: templates/socialaccount/signup.html:8 templates/socialaccount/signup.html:19 msgid "Sign Up" msgstr "Cadastro" #: templates/account/signup.html:10 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "Já tem uma conta? Por favor entre." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:8 msgid "Sign Up Closed" msgstr "Novos cadastros suspensos" #: templates/account/signup_closed.html:10 msgid "We are sorry, but the sign up is currently closed." msgstr "Infelizmente novos cadastros não podem ser feitos no momento." #: templates/account/snippets/already_logged_in.html:5 msgid "Note" msgstr "Nota" #: templates/account/snippets/already_logged_in.html:5 #, python-format msgid "you are already logged in as %(user_display)s." msgstr "você já entrou como %(user_display)s." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:8 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:8 msgid "Verify Your E-mail Address" msgstr "Verifique o seu endereço de e-mail" #: templates/account/verification_sent.html:10 msgid "" "We have sent an e-mail to you for verification. Follow the link provided to " "finalize the signup process. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Enviamos um e-mail para você para verificação. Clique no link fornecido para " "finalizar o processo de inscrição. Entre em contato conosco se você não " "recebê-lo dentro de alguns minutos." #: templates/account/verified_email_required.html:12 msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your e-mail address. " msgstr "" "Esta parte do site requer que verifiquemos\n" "que você é quem diz que é. Para esse fim, pedimos que verifique que\n" "é dono do seu endereço de e-mail. " #: templates/account/verified_email_required.html:16 msgid "" "We have sent an e-mail to you for\n" "verification. Please click on the link inside this e-mail. Please\n" "contact us if you do not receive it within a few minutes." msgstr "" "Nós enviamos um um e-mail de verificação\n" "para você. Por favor clique no link dentro deste e-mail. Contacte-nos\n" "se não recebê-lo dentro dos próximos minutos." #: templates/account/verified_email_required.html:20 #, python-format msgid "" "Note: you can still change your e-" "mail address." msgstr "" "Nota: você ainda pode alterar o " "seu endereço de e-mail." #: templates/openid/login.html:9 msgid "OpenID Sign In" msgstr "Entrar com OpenID" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:8 msgid "Social Network Login Failure" msgstr "Falha ao Entrar com Rede Social" #: templates/socialaccount/authentication_error.html:10 msgid "" "An error occurred while attempting to login via your social network account." msgstr "" "Um erro foi encontrado ao tentar entrar com a sua conta de rede social." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:8 msgid "Account Connections" msgstr "Conexões da Conta" #: templates/socialaccount/connections.html:11 msgid "" "You can sign in to your account using any of the following third party " "accounts:" msgstr "Pode entrar usando uma das seguintes contas externas:" #: templates/socialaccount/connections.html:43 msgid "" "You currently have no social network accounts connected to this account." msgstr "" "No momento não tem nenhuma conta de rede social conectada a esta conta." #: templates/socialaccount/connections.html:46 msgid "Add a 3rd Party Account" msgstr "Adicionar uma Conta Externa" #: templates/socialaccount/login.html:6 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:8 #, python-format msgid "You are about to connect a new third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:10 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:12 #, python-format msgid "You are about to sign in using a third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Entrada Cancelada" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Você decidiu cancelar a entrada no nosso site usando uma das seguintes " "contas. Se isto foi um erro, clique para entrar." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "A conta social foi conectada." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "A conta social já está conectada a outra conta." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "A conta social foi desconectada." #: templates/socialaccount/signup.html:10 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Você está prestes a usar sua conta do %(provider_name)s para acessar o\n" "%(site_name)s. Como etapa final, por favor preencha o seguinte formulário:" #~ msgid "Account" #~ msgstr "Conta" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "O nome de usuário e/ou senha especificados não estão corretos." #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "Nomes de usuários podem conter apenas letras, dígitos e @/./+/-/_." #~ msgid "This username is already taken. Please choose another." #~ msgstr "Este nome de usuário já está em uso. Por favor escolha outro." #, fuzzy #~| msgid "Sign In" #~ msgid "Shopify Sign In" #~ msgstr "Entrar" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "Você confirmou que %(email)s é um " #~ "endereço de e-mail do usuário %(user_display)s." #~ msgid "Thanks for using our site!" #~ msgstr "Obrigado por utilizar nosso site!" django-allauth-0.47.0/allauth/locale/pt_PT/000077500000000000000000000000001415442050100204075ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/pt_PT/LC_MESSAGES/000077500000000000000000000000001415442050100221745ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/pt_PT/LC_MESSAGES/django.po000066400000000000000000000646121415442050100240070ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: django-allauth\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-12-09 08:41-0600\n" "PO-Revision-Date: 2019-02-26 19:48+0100\n" "Last-Translator: Jannis Š\n" "Language-Team: Portuguese (Portugal) (http://www.transifex.com/projects/p/" "django-allauth/language/pt_PT/)\n" "Language: pt_PT\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: account/adapter.py:45 msgid "Username can not be used. Please use other username." msgstr "Nome de utilizador não pode ser utilizado. Por favor, use outro nome." #: account/adapter.py:51 msgid "Too many failed login attempts. Try again later." msgstr "Demasiadas tentativas para entrar. Tente novamente mais tarde." #: account/adapter.py:53 msgid "A user is already registered with this e-mail address." msgstr "Um utilizador já foi registado com este endereço de e-mail." #: account/adapter.py:300 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "A palavra-passe deve ter no mínimo {0} caracteres." #: account/apps.py:7 msgid "Accounts" msgstr "Contas" #: account/forms.py:59 account/forms.py:413 msgid "You must type the same password each time." msgstr "Deve escrever a mesma palavra-passe em ambos os campos." #: account/forms.py:92 account/forms.py:381 account/forms.py:498 msgid "Password" msgstr "Palavra-passe" #: account/forms.py:93 msgid "Remember Me" msgstr "Lembrar-me" #: account/forms.py:97 msgid "This account is currently inactive." msgstr "Esta conta está de momento desactivada" #: account/forms.py:99 msgid "The e-mail address and/or password you specified are not correct." msgstr "" "O endereço de e-mail e/ou palavra-passe que especificou não estão corretos." #: account/forms.py:102 msgid "The username and/or password you specified are not correct." msgstr "" "O nome de utilizador e/ou palavra-passe que especificou não estão corretos." #: account/forms.py:113 account/forms.py:279 account/forms.py:439 #: account/forms.py:517 msgid "E-mail address" msgstr "Endereço de e-mail" #: account/forms.py:117 account/forms.py:316 account/forms.py:436 #: account/forms.py:512 msgid "E-mail" msgstr "E-mail" #: account/forms.py:120 account/forms.py:123 account/forms.py:269 #: account/forms.py:272 msgid "Username" msgstr "Nome de utilizador" #: account/forms.py:133 msgid "Username or e-mail" msgstr "Nome de utilizador ou e-mail" #: account/forms.py:136 msgctxt "field label" msgid "Login" msgstr "Entrar" #: account/forms.py:307 msgid "E-mail (again)" msgstr "E-mail (novamente)" #: account/forms.py:311 msgid "E-mail address confirmation" msgstr "Confirmação de endereço de e-mail" #: account/forms.py:319 msgid "E-mail (optional)" msgstr "E-mail (opcional)" #: account/forms.py:359 msgid "You must type the same email each time." msgstr "Deve escrever o mesmo e-mail em ambos os campos." #: account/forms.py:384 account/forms.py:499 msgid "Password (again)" msgstr "Palavra-passe (novamente)" #: account/forms.py:448 msgid "This e-mail address is already associated with this account." msgstr "Este endereço de e-mail já foi associado com esta conta." #: account/forms.py:451 msgid "This e-mail address is already associated with another account." msgstr "Este endereço de e-mail já foi associado com outra conta." #: account/forms.py:453 #, fuzzy, python-format #| msgid "Your account has no verified e-mail address." msgid "You cannot add more than %d e-mail addresses." msgstr "A sua conta não tem um endereço de e-mail verificado." #: account/forms.py:478 msgid "Current Password" msgstr "Palavra-passe atual" #: account/forms.py:480 account/forms.py:570 msgid "New Password" msgstr "Nova Palavra-passe" #: account/forms.py:481 account/forms.py:571 msgid "New Password (again)" msgstr "Nova Palavra-passe (novamente)" #: account/forms.py:489 msgid "Please type your current password." msgstr "Por favor insira a sua palavra-passe atual." #: account/forms.py:529 msgid "The e-mail address is not assigned to any user account" msgstr "O endereço de e-mail não está associado a nenhuma conta de utilizador" #: account/forms.py:592 msgid "The password reset token was invalid." msgstr "O token para redefinir a palavra-passe está inválido." #: account/models.py:22 msgid "user" msgstr "utilizador" #: account/models.py:28 account/models.py:83 msgid "e-mail address" msgstr "endereço de e-mail" #: account/models.py:30 msgid "verified" msgstr "verificado" #: account/models.py:31 msgid "primary" msgstr "primário" #: account/models.py:36 msgid "email address" msgstr "endereço de e-mail" #: account/models.py:37 msgid "email addresses" msgstr "endereços de e-mail" #: account/models.py:86 msgid "created" msgstr "criado" #: account/models.py:87 msgid "sent" msgstr "enviado" #: account/models.py:88 socialaccount/models.py:58 msgid "key" msgstr "chave" #: account/models.py:93 msgid "email confirmation" msgstr "confirmação de e-mail" #: account/models.py:94 msgid "email confirmations" msgstr "confirmações de e-mail" #: socialaccount/adapter.py:26 #, python-format msgid "" "An account already exists with this e-mail address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Já existe uma conta com este endereço de e-mail. Por favor entre com essa " "conta e depois associe a sua conta %s." #: socialaccount/adapter.py:131 msgid "Your account has no password set up." msgstr "A sua conta não tem palavra-passe definida." #: socialaccount/adapter.py:138 msgid "Your account has no verified e-mail address." msgstr "A sua conta não tem um endereço de e-mail verificado." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Contas de redes sociais" #: socialaccount/models.py:41 socialaccount/models.py:84 msgid "provider" msgstr "fornecedor" #: socialaccount/models.py:45 msgid "name" msgstr "nome" #: socialaccount/models.py:47 msgid "client id" msgstr "" #: socialaccount/models.py:49 msgid "App ID, or consumer key" msgstr "" #: socialaccount/models.py:52 msgid "secret key" msgstr "" #: socialaccount/models.py:55 msgid "API secret, client secret, or consumer secret" msgstr "" #: socialaccount/models.py:58 msgid "Key" msgstr "Chave" #: socialaccount/models.py:74 msgid "social application" msgstr "aplicação social" #: socialaccount/models.py:75 msgid "social applications" msgstr "aplicações sociais" #: socialaccount/models.py:105 msgid "uid" msgstr "" #: socialaccount/models.py:107 msgid "last login" msgstr "último login" #: socialaccount/models.py:108 msgid "date joined" msgstr "data de registo" #: socialaccount/models.py:109 msgid "extra data" msgstr "dados extra" #: socialaccount/models.py:113 msgid "social account" msgstr "conta social" #: socialaccount/models.py:114 msgid "social accounts" msgstr "contas sociais" #: socialaccount/models.py:139 msgid "token" msgstr "" #: socialaccount/models.py:140 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "" #: socialaccount/models.py:144 msgid "token secret" msgstr "" #: socialaccount/models.py:145 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "" #: socialaccount/models.py:148 msgid "expires at" msgstr "expira a" #: socialaccount/models.py:153 msgid "social application token" msgstr "token da aplicação social" #: socialaccount/models.py:154 msgid "social application tokens" msgstr "tokens das aplicações sociais" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "Dados de perfil inválidos" #: socialaccount/providers/oauth/client.py:85 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Resposta inválida ao obter token de permissão de \"%s\"." #: socialaccount/providers/oauth/client.py:117 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Resposta inválida ao obter token de acesso de \"%s\"." #: socialaccount/providers/oauth/client.py:138 #, python-format msgid "No request token saved for \"%s\"." msgstr "Nenhum token de permissão gravado para \"%s\"." #: socialaccount/providers/oauth/client.py:189 #, python-format msgid "No access token saved for \"%s\"." msgstr "Nenhum token de acesso gravado para \"%s\"." #: socialaccount/providers/oauth/client.py:210 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Sem acesso a recursos privados de \"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:8 msgid "Account Inactive" msgstr "Conta Desactivada" #: templates/account/account_inactive.html:10 msgid "This account is inactive." msgstr "A sua conta foi desactivada." #: templates/account/email.html:5 templates/account/email.html:8 msgid "E-mail Addresses" msgstr "Endereços de E-mail" #: templates/account/email.html:10 msgid "The following e-mail addresses are associated with your account:" msgstr "Os endereços de e-mail seguintes estão associados com a sua conta:" #: templates/account/email.html:24 msgid "Verified" msgstr "Verificado" #: templates/account/email.html:26 msgid "Unverified" msgstr "Não verificado" #: templates/account/email.html:28 msgid "Primary" msgstr "Primário" #: templates/account/email.html:34 msgid "Make Primary" msgstr "Definir como primário" #: templates/account/email.html:35 msgid "Re-send Verification" msgstr "Re-enviar Verificação" #: templates/account/email.html:36 templates/socialaccount/connections.html:35 msgid "Remove" msgstr "Remover" #: templates/account/email.html:43 msgid "Warning:" msgstr "Aviso:" #: templates/account/email.html:43 msgid "" "You currently do not have any e-mail address set up. You should really add " "an e-mail address so you can receive notifications, reset your password, etc." msgstr "" "Neste momento não tem um endereço de e-mail definido. Devia mesmo adicionar " "um endereço de e-mail para que possa receber notificações, redefinir a sua " "palavra-passe, etc." #: templates/account/email.html:48 msgid "Add E-mail Address" msgstr "Adicionar endereço de e-mail" #: templates/account/email.html:53 msgid "Add E-mail" msgstr "Adicionar e-mail" #: templates/account/email.html:63 msgid "Do you really want to remove the selected e-mail address?" msgstr "Deseja mesmo remover o endereço de e-mail seleccionado?" #: templates/account/email/base_message.txt:1 #, fuzzy, python-format #| msgid "" #| "Thank you from %(site_name)s!\n" #| "%(site_domain)s" msgid "Hello from %(site_name)s!" msgstr "" "Obrigado de %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "Obrigado por utilizar %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because user %(user_display)s has given " #| "yours as an e-mail address to connect their account.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s\n" msgid "" "You're receiving this e-mail because user %(user_display)s has given your e-" "mail address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "Ola de %(site_name)s!\n" "\n" "Está a receber este e-mail porque o utilizador %(user_display)s deu o seu " "endereço de email para conectar à sua conta.\n" "\n" "Para confirmar que isto está correto, vá a %(activate_url)s\n" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your E-mail Address" msgstr "Confirme o Endereço de E-mail" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this e-mail because you or someone else has requested a " "password for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Olá de %(site_name)s!\n" "\n" "Está a receber este e-mail porque você ou outra pessoa pediu uma nova " "palavra-passe para a sua conta.\n" "Pode ignorar este e-mail caso não tenha pedido uma redefinição de palavra-" "passe. Clique no link abaixo para redefinir a sua password." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "Caso se tenha esquecido, o seu nome de utilizador é %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 msgid "Password Reset E-mail" msgstr "E-mail de Redefinição de Password" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm E-mail Address" msgstr "Confirmar Endereço de E-mail" #: templates/account/email_confirm.html:16 #, python-format msgid "" "Please confirm that %(email)s is an e-mail " "address for user %(user_display)s." msgstr "" "Por favor confirme que %(email)s é um " "endereço de e-mail do utilizador %(user_display)s." #: templates/account/email_confirm.html:20 msgid "Confirm" msgstr "Confirmar" #: templates/account/email_confirm.html:27 #, python-format msgid "" "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgstr "" "Este link de verificação de e-mail expirou ou é inválido. Por favor peça uma nova verificação de e-mail.." #: templates/account/login.html:6 templates/account/login.html:10 #: templates/account/login.html:43 msgid "Sign In" msgstr "Entrar" #: templates/account/login.html:15 #, python-format msgid "" "Please sign in with one\n" "of your existing third party accounts. Or, sign " "up\n" "for a %(site_name)s account and sign in below:" msgstr "" "Por favor entre com uma\n" "das suas contas externas. Ou, registe-se\n" "para uma conta em %(site_name)s e entre:" #: templates/account/login.html:25 msgid "or" msgstr "ou" #: templates/account/login.html:32 #, python-format msgid "" "If you have not created an account yet, then please\n" "sign up first." msgstr "Se já criou uma conta, por favor entre." #: templates/account/login.html:42 templates/account/password_change.html:14 msgid "Forgot Password?" msgstr "Esqueceu-se da sua palavra-passe?" #: templates/account/logout.html:5 templates/account/logout.html:8 #: templates/account/logout.html:17 msgid "Sign Out" msgstr "Sair" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Tem certeza de que deseja sair?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary e-mail address (%(email)s)." msgstr "Não pode remover o seu endereço de e-mail primário (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation e-mail sent to %(email)s." msgstr "E-mail de confirmação enviado para %(email)s." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "Confirmou %(email)s" #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed e-mail address %(email)s." msgstr "Endereço de e-mail removido %(email)s." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Entrou com sucesso como %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Terminou sessão." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Palavra-passe alterada com sucesso." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Palavra-passe definida com sucesso." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary e-mail address set." msgstr "Endereço de e-mail primário definido." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary e-mail address must be verified." msgstr "O seu endereço de e-mail primário tem de ser verificado." #: templates/account/password_change.html:5 #: templates/account/password_change.html:8 #: templates/account/password_change.html:13 #: templates/account/password_reset_from_key.html:4 #: templates/account/password_reset_from_key.html:7 #: templates/account/password_reset_from_key_done.html:4 #: templates/account/password_reset_from_key_done.html:7 msgid "Change Password" msgstr "Alterar palavra-passe" #: templates/account/password_reset.html:6 #: templates/account/password_reset.html:10 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:9 msgid "Password Reset" msgstr "Redefinição da palavra-passe" #: templates/account/password_reset.html:15 msgid "" "Forgotten your password? Enter your e-mail address below, and we'll send you " "an e-mail allowing you to reset it." msgstr "" "Esqueceu-se da sua palavra-passe? Insira o seu endereço de e-mail abaixo, e " "enviar-lhe-emos um e-mail permitindo que a redefina." #: templates/account/password_reset.html:20 msgid "Reset My Password" msgstr "Redefinir a minha palavra-passe" #: templates/account/password_reset.html:23 msgid "Please contact us if you have any trouble resetting your password." msgstr "" "Por favor contacte-nos se tiver quaisquer problemas a redefinir a sua " "palavra-passe." #: templates/account/password_reset_done.html:15 msgid "" "We have sent you an e-mail. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Enviámos-lhe um e-mail. Por favor contacte-nos se não o receber nos próximos " "minutos." #: templates/account/password_reset_from_key.html:7 msgid "Bad Token" msgstr "Problema no Token" #: templates/account/password_reset_from_key.html:11 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "O link para redefinição da palavra-passe era inválido, provávelmente por já " "ter sido usado. Por favor peça uma nova " "redefinição da palavra-passe." #: templates/account/password_reset_from_key.html:17 msgid "change password" msgstr "alterar a palavra-passe" #: templates/account/password_reset_from_key.html:20 #: templates/account/password_reset_from_key_done.html:8 msgid "Your password is now changed." msgstr "A sua palavra-passe foi alterada." #: templates/account/password_set.html:5 templates/account/password_set.html:8 #: templates/account/password_set.html:13 msgid "Set Password" msgstr "Definir palavra-passe" #: templates/account/signup.html:5 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Registo" #: templates/account/signup.html:8 templates/account/signup.html:18 #: templates/socialaccount/signup.html:8 templates/socialaccount/signup.html:19 msgid "Sign Up" msgstr "Registo" #: templates/account/signup.html:10 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "Já tem uma conta? Por favor entre." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:8 msgid "Sign Up Closed" msgstr "Resgitos fechados" #: templates/account/signup_closed.html:10 msgid "We are sorry, but the sign up is currently closed." msgstr "Pedimos desculpa, mas os registos estão fechados." #: templates/account/snippets/already_logged_in.html:5 msgid "Note" msgstr "Nota" #: templates/account/snippets/already_logged_in.html:5 #, python-format msgid "you are already logged in as %(user_display)s." msgstr "você já entrou como %(user_display)s." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:8 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:8 msgid "Verify Your E-mail Address" msgstr "Verifique o seu endereço de e-mail" #: templates/account/verification_sent.html:10 msgid "" "We have sent an e-mail to you for verification. Follow the link provided to " "finalize the signup process. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Enviámos-lhe um e-mail para para verificação. Siga o link no mesmo para " "finalizar o registo. Por favor contacte-nos se não o receber nos próximos " "minutos." #: templates/account/verified_email_required.html:12 msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your e-mail address. " msgstr "" "Esta parte do site requer que verifiquemos que é quem diz que é. Para esse " "fim, pedimos que verifique que é dono do seu endereço de e-mail. " #: templates/account/verified_email_required.html:16 msgid "" "We have sent an e-mail to you for\n" "verification. Please click on the link inside this e-mail. Please\n" "contact us if you do not receive it within a few minutes." msgstr "" "Enviámos-lhe um e-mail para verificação. Por favor clique no link dentro " "deste e-mail. Por favor contacte-nos se não o receber dentro dos próximos " "minutos." #: templates/account/verified_email_required.html:20 #, python-format msgid "" "Note: you can still change your e-" "mail address." msgstr "" "Nota: ainda pode alterar o seu " "endereço de e-mail." #: templates/openid/login.html:9 msgid "OpenID Sign In" msgstr "Entrar com OpenID" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:8 msgid "Social Network Login Failure" msgstr "Falha ao Entrar com Rede Social" #: templates/socialaccount/authentication_error.html:10 msgid "" "An error occurred while attempting to login via your social network account." msgstr "" "Um erro foi encontrado ao tentar entrar com a sua conta de rede social." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:8 msgid "Account Connections" msgstr "Ligações da Conta" #: templates/socialaccount/connections.html:11 msgid "" "You can sign in to your account using any of the following third party " "accounts:" msgstr "Pode entrar usando uma das seguintes contas externas:" #: templates/socialaccount/connections.html:43 msgid "" "You currently have no social network accounts connected to this account." msgstr "De momento não tem nenhuma conta de rede social ligada a esta conta." #: templates/socialaccount/connections.html:46 msgid "Add a 3rd Party Account" msgstr "Adicionar uma Conta Externa" #: templates/socialaccount/login.html:6 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:8 #, python-format msgid "You are about to connect a new third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:10 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:12 #, python-format msgid "You are about to sign in using a third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Entrada Cancelada" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Decidiu cancelar a entrada no nosso site usando uma das seguintes contas. Se " "isto foi um erro, entre." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "A conta social foi conectada." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "A conta social já está conectada a outra conta." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "A conta social foi disconectada." #: templates/socialaccount/signup.html:10 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Está prestes a usar a sua conta no %(provider_name)s para entrar no " "%(site_name)s. Como um passo final, por favor complete o seguinte formulário:" #~ msgid "Account" #~ msgstr "Conta" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "O login e/ou password que especificou não estão corretos" #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "" #~ "Nomes de utilizador podem apenas conter letras, dígitos, e @/./+/-/_." #~ msgid "This username is already taken. Please choose another." #~ msgstr "Este nome de utilizador já está em uso. Por favor escolha outro." #, fuzzy #~| msgid "Sign In" #~ msgid "Shopify Sign In" #~ msgstr "Entrar" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "Confirmou que %(email)s é um endereço de " #~ "e-mail do utilizador %(user_display)s." #~ msgid "Thanks for using our site!" #~ msgstr "Obrigado por usar o nosso site!" #~ msgid "Confirmation e-mail sent to %(email)s" #~ msgstr "E-mail de confirmação enviado para %(email)s" #~ msgid "Delete Password" #~ msgstr "Remover palavra-passe" #~ msgid "" #~ "You may delete your password since you are currently logged in using " #~ "OpenID." #~ msgstr "Pode eliminar a sua palavra-passe já que entrou com OpenID." #~ msgid "delete my password" #~ msgstr "dliminar a minha palavra-passe" #~ msgid "Password Deleted" #~ msgstr "Palavra-passe eliminada" #~ msgid "Your password has been deleted." #~ msgstr "A sua palavra-passe foi eliminada." django-allauth-0.47.0/allauth/locale/ru/000077500000000000000000000000001415442050100200075ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/ru/LC_MESSAGES/000077500000000000000000000000001415442050100215745ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/ru/LC_MESSAGES/django.po000066400000000000000000000745261415442050100234140ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-12-09 08:41-0600\n" "PO-Revision-Date: 2017-04-05 22:48+0300\n" "Last-Translator: \n" "Language-Team: \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n" "%100>=11 && n%100<=14)? 2 : 3);\n" "X-Generator: Poedit 1.8.7.1\n" #: account/adapter.py:45 msgid "Username can not be used. Please use other username." msgstr "Такое имя пользователя не может быть использовано, выберите другое." #: account/adapter.py:51 msgid "Too many failed login attempts. Try again later." msgstr "Слишком много попыток входа в систему, попробуйте позже." #: account/adapter.py:53 msgid "A user is already registered with this e-mail address." msgstr "Пользователь с таким e-mail адресом уже зарегистрирован." #: account/adapter.py:300 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Минимальное количество символов в пароле: {0}." #: account/apps.py:7 msgid "Accounts" msgstr "Аккаунты" #: account/forms.py:59 account/forms.py:413 msgid "You must type the same password each time." msgstr "Вы должны ввести одинаковый пароль дважды." #: account/forms.py:92 account/forms.py:381 account/forms.py:498 msgid "Password" msgstr "Пароль" #: account/forms.py:93 msgid "Remember Me" msgstr "Запомнить меня" #: account/forms.py:97 msgid "This account is currently inactive." msgstr "Учетная запись неактивна." #: account/forms.py:99 msgid "The e-mail address and/or password you specified are not correct." msgstr "E-mail адрес и/или пароль не верны." #: account/forms.py:102 msgid "The username and/or password you specified are not correct." msgstr "Имя пользователя и/или пароль не верны." #: account/forms.py:113 account/forms.py:279 account/forms.py:439 #: account/forms.py:517 msgid "E-mail address" msgstr "E-mail адрес" #: account/forms.py:117 account/forms.py:316 account/forms.py:436 #: account/forms.py:512 msgid "E-mail" msgstr "E-mail" #: account/forms.py:120 account/forms.py:123 account/forms.py:269 #: account/forms.py:272 msgid "Username" msgstr "Имя пользователя" #: account/forms.py:133 msgid "Username or e-mail" msgstr "Имя пользователя или e-mail" #: account/forms.py:136 msgctxt "field label" msgid "Login" msgstr "Войти" #: account/forms.py:307 msgid "E-mail (again)" msgstr "E-mail (ещё раз)" #: account/forms.py:311 msgid "E-mail address confirmation" msgstr "Подтверждение email адреса" #: account/forms.py:319 msgid "E-mail (optional)" msgstr "E-mail (опционально)" #: account/forms.py:359 msgid "You must type the same email each time." msgstr "Вы должны ввести одинаковый e-mail дважды." #: account/forms.py:384 account/forms.py:499 msgid "Password (again)" msgstr "Пароль (ещё раз)" #: account/forms.py:448 msgid "This e-mail address is already associated with this account." msgstr "Указанный e-mail уже прикреплен к этому аккаунту." #: account/forms.py:451 msgid "This e-mail address is already associated with another account." msgstr "Указанный e-mail прикреплен к другому пользователю." #: account/forms.py:453 #, fuzzy, python-format #| msgid "Your account has no verified e-mail address." msgid "You cannot add more than %d e-mail addresses." msgstr "Нет подтвержденных e-mail адресов для вашего аккаунта." #: account/forms.py:478 msgid "Current Password" msgstr "Текущий пароль" #: account/forms.py:480 account/forms.py:570 msgid "New Password" msgstr "Новый пароль" #: account/forms.py:481 account/forms.py:571 msgid "New Password (again)" msgstr "Новый пароль (ещё раз)" #: account/forms.py:489 msgid "Please type your current password." msgstr "Пожалуйста, введите свой текущий пароль." #: account/forms.py:529 msgid "The e-mail address is not assigned to any user account" msgstr "Нет пользователя с таким e-mail" #: account/forms.py:592 msgid "The password reset token was invalid." msgstr "Неправильный код для сброса пароля." #: account/models.py:22 msgid "user" msgstr "пользователь" #: account/models.py:28 account/models.py:83 msgid "e-mail address" msgstr "e-mail адрес" #: account/models.py:30 msgid "verified" msgstr "подтвержден" #: account/models.py:31 msgid "primary" msgstr "основной" #: account/models.py:36 msgid "email address" msgstr "email адрес" #: account/models.py:37 msgid "email addresses" msgstr "email адреса" #: account/models.py:86 msgid "created" msgstr "создано" #: account/models.py:87 msgid "sent" msgstr "отправлено" #: account/models.py:88 socialaccount/models.py:58 msgid "key" msgstr "ключ" #: account/models.py:93 msgid "email confirmation" msgstr "подтверждение email адреса" #: account/models.py:94 msgid "email confirmations" msgstr "подтверждения email адресов" #: socialaccount/adapter.py:26 #, python-format msgid "" "An account already exists with this e-mail address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Пользователь с таким e-mail уже зарегистрирован. Чтобы подключить свой %s " "аккаунт, пожалуйста, авторизуйтесь." #: socialaccount/adapter.py:131 msgid "Your account has no password set up." msgstr "Для вашего аккаунта не установлен пароль." #: socialaccount/adapter.py:138 msgid "Your account has no verified e-mail address." msgstr "Нет подтвержденных e-mail адресов для вашего аккаунта." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Социальные аккаунты" #: socialaccount/models.py:41 socialaccount/models.py:84 msgid "provider" msgstr "провайдер" #: socialaccount/models.py:45 msgid "name" msgstr "имя" #: socialaccount/models.py:47 msgid "client id" msgstr "id клиента" #: socialaccount/models.py:49 msgid "App ID, or consumer key" msgstr "ID приложения или ключ потребителя" #: socialaccount/models.py:52 msgid "secret key" msgstr "секретный ключ" #: socialaccount/models.py:55 msgid "API secret, client secret, or consumer secret" msgstr "Секретный ключ API, клиента или потребителя" #: socialaccount/models.py:58 msgid "Key" msgstr "Ключ" #: socialaccount/models.py:74 msgid "social application" msgstr "социальное приложение" #: socialaccount/models.py:75 msgid "social applications" msgstr "социальные приложения" #: socialaccount/models.py:105 msgid "uid" msgstr "UID пользователя" #: socialaccount/models.py:107 msgid "last login" msgstr "дата последнего входа в систему" #: socialaccount/models.py:108 msgid "date joined" msgstr "дата регистрации" #: socialaccount/models.py:109 msgid "extra data" msgstr "дополнительные данные" #: socialaccount/models.py:113 msgid "social account" msgstr "аккаунт социальной сети" #: socialaccount/models.py:114 msgid "social accounts" msgstr "аккаунты социальных сетей" #: socialaccount/models.py:139 msgid "token" msgstr "токен" #: socialaccount/models.py:140 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "\"oauth_token\" (OAuth1) или access token (OAuth2)" #: socialaccount/models.py:144 msgid "token secret" msgstr "секретный токен" #: socialaccount/models.py:145 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "\"oauth_token_secret\" (OAuth1) или refresh token (OAuth2)" #: socialaccount/models.py:148 msgid "expires at" msgstr "истекает" #: socialaccount/models.py:153 msgid "social application token" msgstr "токен социального приложения" #: socialaccount/models.py:154 msgid "social application tokens" msgstr "токены социальных приложений" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "Неверные данные профиля" #: socialaccount/providers/oauth/client.py:85 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Неверный ответ во время получения запроса от \"%s\"." #: socialaccount/providers/oauth/client.py:117 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Неверный ответ при получении токена доступа от \"%s\"." #: socialaccount/providers/oauth/client.py:138 #, python-format msgid "No request token saved for \"%s\"." msgstr "Нет сохраненного ключа запроса для \"%s\"." #: socialaccount/providers/oauth/client.py:189 #, python-format msgid "No access token saved for \"%s\"." msgstr "Нет сохраненного ключа доступа для \"%s\"." #: socialaccount/providers/oauth/client.py:210 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Доступ к ресурсам закрыт \"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:8 msgid "Account Inactive" msgstr "Аккаунт неактивен" #: templates/account/account_inactive.html:10 msgid "This account is inactive." msgstr "Этот аккаунт неактивен." #: templates/account/email.html:5 templates/account/email.html:8 msgid "E-mail Addresses" msgstr "E-mail адреса" #: templates/account/email.html:10 msgid "The following e-mail addresses are associated with your account:" msgstr "Следующие e-mail адреса прикреплены к вашему аккаунту:" #: templates/account/email.html:24 msgid "Verified" msgstr "Подтвержден" #: templates/account/email.html:26 msgid "Unverified" msgstr "Не подтвержден" #: templates/account/email.html:28 msgid "Primary" msgstr "Основной" #: templates/account/email.html:34 msgid "Make Primary" msgstr "Сделать основным" #: templates/account/email.html:35 msgid "Re-send Verification" msgstr "Отправить подтверждение ещё раз" #: templates/account/email.html:36 templates/socialaccount/connections.html:35 msgid "Remove" msgstr "Удалить" #: templates/account/email.html:43 msgid "Warning:" msgstr "Внимание:" #: templates/account/email.html:43 msgid "" "You currently do not have any e-mail address set up. You should really add " "an e-mail address so you can receive notifications, reset your password, etc." msgstr "" "Сейчас у вас нет прикрепленного e-mail адреса. Рекомендуем добавить, чтобы " "начать получать уведомления, сброс пароля и прочее." #: templates/account/email.html:48 msgid "Add E-mail Address" msgstr "Добавить e-mail адрес" #: templates/account/email.html:53 msgid "Add E-mail" msgstr "Добавить e-mail" #: templates/account/email.html:63 msgid "Do you really want to remove the selected e-mail address?" msgstr "Вы действительно хотите удалить этот e-mail адрес?" #: templates/account/email/base_message.txt:1 #, fuzzy, python-format #| msgid "" #| "Thank you from %(site_name)s!\n" #| "%(site_domain)s" msgid "Hello from %(site_name)s!" msgstr "" "Спасибо от сайта «%(site_name)s!»\n" "%(site_domain)s" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "Благодарим вас за использование сайта «%(site_name)s!»\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because user %(user_display)s has given " #| "yours as an e-mail address to connect their account.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s\n" msgid "" "You're receiving this e-mail because user %(user_display)s has given your e-" "mail address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "Вас приветствует %(site_name)s!\n" "\n" "Вы получили это письмо, потому что пользователь %(user_display)s указал ваш " "e-mail для подключения к своему аккаунту.\n" "\n" "Чтобы подтвердить, перейдите по ссылке %(activate_url)s\n" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your E-mail Address" msgstr "Пожалуйста подтвердите ваш e-mail адрес" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this e-mail because you or someone else has requested a " "password for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Вас приветствует %(site_name)s!\n" "\n" "Вы получили это письмо потому, что вы или кто-то иной запросили смену пароля " "для своего аккаунта.\n" "Если это были не вы, просто проигнорируйте это письмо. Иначе перейдите по " "ссылке для смены пароля." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "Если вы вдруг забыли, ваше имя пользователя: %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 msgid "Password Reset E-mail" msgstr "Письмо для сброса пароля" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm E-mail Address" msgstr "Подтвердите e-mail адрес." #: templates/account/email_confirm.html:16 #, python-format msgid "" "Please confirm that %(email)s is an e-mail " "address for user %(user_display)s." msgstr "" "Пожалуйста, подтвердите %(email)s для " "пользователя %(user_display)s." #: templates/account/email_confirm.html:20 msgid "Confirm" msgstr "Подтвердить" #: templates/account/email_confirm.html:27 #, python-format msgid "" "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgstr "" "Ссылка некорректна или срок её действия истек. Пожалуйста, запросите подтверждение e-mail заново." #: templates/account/login.html:6 templates/account/login.html:10 #: templates/account/login.html:43 msgid "Sign In" msgstr "Войти" #: templates/account/login.html:15 #, python-format msgid "" "Please sign in with one\n" "of your existing third party accounts. Or, sign " "up\n" "for a %(site_name)s account and sign in below:" msgstr "" "Пожалуйста, войдите с одним\n" "из ваших внешних аккаунтов. Или зарегистрируйтесь\n" "и авторизуйтесь на сайте %(site_name)s:" #: templates/account/login.html:25 msgid "or" msgstr "или" #: templates/account/login.html:32 #, python-format msgid "" "If you have not created an account yet, then please\n" "sign up first." msgstr "" "Если у вас ещё нет учётной записи, пожалуйста, сначала зарегистрируйтесь." #: templates/account/login.html:42 templates/account/password_change.html:14 msgid "Forgot Password?" msgstr "Забыли пароль?" #: templates/account/logout.html:5 templates/account/logout.html:8 #: templates/account/logout.html:17 msgid "Sign Out" msgstr "Выйти" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Вы уверены, что хотите выйти?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary e-mail address (%(email)s)." msgstr "Вы не можете удалить ваш основной e-mail (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation e-mail sent to %(email)s." msgstr "Подтверждение e-mail адреса отправлено на %(email)s." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "Адрес %(email)s подтверждён." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed e-mail address %(email)s." msgstr "E-mail адрес %(email)s удален." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Вы вошли как %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Вы вышли." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Пароль успешно изменён." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Пароль успешно указан." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary e-mail address set." msgstr "Выбран основной e-mail адрес." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary e-mail address must be verified." msgstr "Ваш основной e-mail должен быть подтвержден." #: templates/account/password_change.html:5 #: templates/account/password_change.html:8 #: templates/account/password_change.html:13 #: templates/account/password_reset_from_key.html:4 #: templates/account/password_reset_from_key.html:7 #: templates/account/password_reset_from_key_done.html:4 #: templates/account/password_reset_from_key_done.html:7 msgid "Change Password" msgstr "Сменить пароль" #: templates/account/password_reset.html:6 #: templates/account/password_reset.html:10 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:9 msgid "Password Reset" msgstr "Сброс пароля" #: templates/account/password_reset.html:15 msgid "" "Forgotten your password? Enter your e-mail address below, and we'll send you " "an e-mail allowing you to reset it." msgstr "" "Забыли пароль? Введите свой e-mail адрес ниже, и мы вышлем вам письмо для " "сброса пароля." #: templates/account/password_reset.html:20 msgid "Reset My Password" msgstr "Сбросить мой пароль" #: templates/account/password_reset.html:23 msgid "Please contact us if you have any trouble resetting your password." msgstr "Свяжитесь с нами, если у вас возникли сложности со сменой пароля." #: templates/account/password_reset_done.html:15 msgid "" "We have sent you an e-mail. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Мы отправили вам письмо. Пожалуйста, свяжитесь с нами, если не получили его " "в течение нескольких минут." #: templates/account/password_reset_from_key.html:7 msgid "Bad Token" msgstr "Неправильный ключ" #: templates/account/password_reset_from_key.html:11 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Ссылка на сброс пароля неверна, вероятно, она уже была использована. Для " "нового сброса пароля перейдите по ссылке." #: templates/account/password_reset_from_key.html:17 msgid "change password" msgstr "изменить пароль" #: templates/account/password_reset_from_key.html:20 #: templates/account/password_reset_from_key_done.html:8 msgid "Your password is now changed." msgstr "Ваш пароль изменён." #: templates/account/password_set.html:5 templates/account/password_set.html:8 #: templates/account/password_set.html:13 msgid "Set Password" msgstr "Установить пароль" #: templates/account/signup.html:5 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Регистрация" #: templates/account/signup.html:8 templates/account/signup.html:18 #: templates/socialaccount/signup.html:8 templates/socialaccount/signup.html:19 msgid "Sign Up" msgstr "Регистрация" #: templates/account/signup.html:10 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "Уже зарегистрированы? Войдите." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:8 msgid "Sign Up Closed" msgstr "Регистрация закрыта" #: templates/account/signup_closed.html:10 msgid "We are sorry, but the sign up is currently closed." msgstr "Извините, но регистрация в настоящий момент закрыта." #: templates/account/snippets/already_logged_in.html:5 msgid "Note" msgstr "Заметка" #: templates/account/snippets/already_logged_in.html:5 #, python-format msgid "you are already logged in as %(user_display)s." msgstr "вы уже вошли как %(user_display)s." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:8 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:8 msgid "Verify Your E-mail Address" msgstr "Подтвердите ваш e-mail" #: templates/account/verification_sent.html:10 msgid "" "We have sent an e-mail to you for verification. Follow the link provided to " "finalize the signup process. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Мы отправили вам e-mail с подтверждением. Для завершения процесса " "регистрации перейдите по указанной ссылке. Если вы не получили наше " "сообщение в течение нескольких минут, пожалуйста, свяжитесь с нами." #: templates/account/verified_email_required.html:12 msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your e-mail address. " msgstr "Эта часть сайта требует подтверждения e-mail адреса." #: templates/account/verified_email_required.html:16 msgid "" "We have sent an e-mail to you for\n" "verification. Please click on the link inside this e-mail. Please\n" "contact us if you do not receive it within a few minutes." msgstr "" "Мы отправили вам письмо\n" "с подтверждением. Пожалуйста, перейдите по ссылке.\n" "Свяжитесь с нами, если вы не получили письмо в течение нескольких минут." #: templates/account/verified_email_required.html:20 #, python-format msgid "" "Note: you can still change your e-" "mail address." msgstr "" "Заметка: вы можете сменить свой e-" "mail адрес." #: templates/openid/login.html:9 msgid "OpenID Sign In" msgstr "Войти с OpenID" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:8 msgid "Social Network Login Failure" msgstr "Ошибка авторизации через социальную сеть" #: templates/socialaccount/authentication_error.html:10 msgid "" "An error occurred while attempting to login via your social network account." msgstr "Произошла ошибка во время авторизации через социальную сеть." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:8 msgid "Account Connections" msgstr "Прикрепленные аккаунты" #: templates/socialaccount/connections.html:11 msgid "" "You can sign in to your account using any of the following third party " "accounts:" msgstr "Вы можете авторизоваться, используя следующие сервисы:" #: templates/socialaccount/connections.html:43 msgid "" "You currently have no social network accounts connected to this account." msgstr "Нет прикрепленных аккаунтов социальных сетей." #: templates/socialaccount/connections.html:46 msgid "Add a 3rd Party Account" msgstr "Добавить внешний аккаунт" #: templates/socialaccount/login.html:6 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:8 #, python-format msgid "You are about to connect a new third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:10 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:12 #, python-format msgid "You are about to sign in using a third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Авторизация отменена" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Вы прервали авторизацию, используя один из ваших аккаутов. Если это было " "ошибкой, перейдите к авторизации. " #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "Аккаунт социальной сети был прикреплён." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "Аккаунт социальной сети уже прикреплен к другому пользователю." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Акакаунт социальной сети был откреплен." #: templates/socialaccount/signup.html:10 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Вы используете %(provider_name)s для авторизации на \n" "%(site_name)s. Чтобы завершить, заполните следующую форму:" #~ msgid "Account" #~ msgstr "Аккаунт" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "Логин и/или пароль не верны." #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "Имя пользователя может включать буквы, цифры и @/./+/-/_." #~ msgid "This username is already taken. Please choose another." #~ msgstr "" #~ "Такое имя пользователя уже используется на сайте. Пожалуйста выберите " #~ "другое." #, fuzzy #~| msgid "Sign In" #~ msgid "Shopify Sign In" #~ msgstr "Войти" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "Вы подтвердили адрес %(email)s для " #~ "пользователя %(user_display)s." #~ msgid "Thanks for using our site!" #~ msgstr "Спасибо за использование нашего сайта!" #~ msgid "Confirmation e-mail sent to %(email)s" #~ msgstr "Подтверждение выслано на %(email)s" #~ msgid "Delete Password" #~ msgstr "Удалить пароль" #~ msgid "" #~ "You may delete your password since you are currently logged in using " #~ "OpenID." #~ msgstr "Вы можете удалить свой пароль, при использовании OpenID." #~ msgid "delete my password" #~ msgstr "удалите мой парль" #~ msgid "Password Deleted" #~ msgstr "Пароль удалён" #~ msgid "Your password has been deleted." #~ msgstr "Ваш пароль был удален." django-allauth-0.47.0/allauth/locale/sk/000077500000000000000000000000001415442050100177765ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/sk/LC_MESSAGES/000077500000000000000000000000001415442050100215635ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/sk/LC_MESSAGES/django.po000066400000000000000000000603571415442050100234000ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-12-09 08:41-0600\n" "PO-Revision-Date: 2021-05-26 16:13+0058\n" "Last-Translator: b'Erik Telepovsky '\n" "Language-Team: \n" "Language: sk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n " ">= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n" "X-Translated-Using: django-rosetta 0.9.4\n" #: account/adapter.py:45 msgid "Username can not be used. Please use other username." msgstr "Užívateľské meno nemôže byť použité. Prosím, použite iné meno." #: account/adapter.py:51 msgid "Too many failed login attempts. Try again later." msgstr "Príliš veľa neúspešných pokusov o prihlásenie. Skúste neskôr." #: account/adapter.py:53 msgid "A user is already registered with this e-mail address." msgstr "Používateľ s touto e-mailovou adresou už existuje." #: account/adapter.py:300 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Heslo musí mať aspoň {0} znakov." #: account/apps.py:7 msgid "Accounts" msgstr "Účty" #: account/forms.py:59 account/forms.py:413 msgid "You must type the same password each time." msgstr "Heslá sa nezhodujú." #: account/forms.py:92 account/forms.py:381 account/forms.py:498 msgid "Password" msgstr "Heslo" #: account/forms.py:93 msgid "Remember Me" msgstr "Zapamätať si ma" #: account/forms.py:97 msgid "This account is currently inactive." msgstr "Tento účet nie je momentálne aktívny." #: account/forms.py:99 msgid "The e-mail address and/or password you specified are not correct." msgstr "Uvedený e-mail alebo heslo nie je správne." #: account/forms.py:102 msgid "The username and/or password you specified are not correct." msgstr "Uvedené užívateľské meno alebo heslo nie je správne." #: account/forms.py:113 account/forms.py:279 account/forms.py:439 #: account/forms.py:517 msgid "E-mail address" msgstr "E-mailová adresa" #: account/forms.py:117 account/forms.py:316 account/forms.py:436 #: account/forms.py:512 msgid "E-mail" msgstr "E-mail" #: account/forms.py:120 account/forms.py:123 account/forms.py:269 #: account/forms.py:272 msgid "Username" msgstr "Užívateľské meno" #: account/forms.py:133 msgid "Username or e-mail" msgstr "Užívateľské meno alebo e-mail" #: account/forms.py:136 msgctxt "field label" msgid "Login" msgstr "Login" #: account/forms.py:307 msgid "E-mail (again)" msgstr "E-mail (znova)" #: account/forms.py:311 msgid "E-mail address confirmation" msgstr "Potvrdenie e-mailu" #: account/forms.py:319 msgid "E-mail (optional)" msgstr "E-mail (nepovinné)" #: account/forms.py:359 msgid "You must type the same email each time." msgstr "E-maily sa nezhodujú." #: account/forms.py:384 account/forms.py:499 msgid "Password (again)" msgstr "Heslo (znovu)" #: account/forms.py:448 msgid "This e-mail address is already associated with this account." msgstr "Táto e-mailová adresa je už spojená s týmto účtom." #: account/forms.py:451 msgid "This e-mail address is already associated with another account." msgstr "Táto e-mailová adresa je už spojená s iným účtom." #: account/forms.py:453 #, python-format msgid "You cannot add more than %d e-mail addresses." msgstr "Nemôžte pridať viac než %d e-mailových adries." #: account/forms.py:478 msgid "Current Password" msgstr "Súčasné heslo" #: account/forms.py:480 account/forms.py:570 msgid "New Password" msgstr "Nové heslo" #: account/forms.py:481 account/forms.py:571 msgid "New Password (again)" msgstr "Nové heslo (znovu)" #: account/forms.py:489 msgid "Please type your current password." msgstr "Prosím, napíšte svoje súčasné heslo." #: account/forms.py:529 msgid "The e-mail address is not assigned to any user account" msgstr "" "Táto e-mailová adresa nie je pridelená k žiadnemu používateľskému kontu" #: account/forms.py:592 msgid "The password reset token was invalid." msgstr "Token na obnovu hesla bol nesprávny." #: account/models.py:22 msgid "user" msgstr "používateľ" #: account/models.py:28 account/models.py:83 msgid "e-mail address" msgstr "e-mailová adresa" #: account/models.py:30 msgid "verified" msgstr "overený" #: account/models.py:31 msgid "primary" msgstr "primárny" #: account/models.py:36 msgid "email address" msgstr "e-mailová adresa" #: account/models.py:37 msgid "email addresses" msgstr "e-mailové adresy" #: account/models.py:86 msgid "created" msgstr "vytvorený" #: account/models.py:87 msgid "sent" msgstr "odoslané" #: account/models.py:88 socialaccount/models.py:58 msgid "key" msgstr "kľúč" #: account/models.py:93 msgid "email confirmation" msgstr "potvrdenie e-mailu" #: account/models.py:94 msgid "email confirmations" msgstr "potvrdenia e-mailu" #: socialaccount/adapter.py:26 #, python-format msgid "" "An account already exists with this e-mail address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Účet s touto e-mailovou adresou už existuje. Prosím, prihláste sa najprv na " "tento účet a potom pripojte svoj %s účet." #: socialaccount/adapter.py:131 msgid "Your account has no password set up." msgstr "Váš účet nemá nastavené heslo." #: socialaccount/adapter.py:138 msgid "Your account has no verified e-mail address." msgstr "Váš účet nemá overenú e-mailovú adresu." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Účty na sociálnych sieťach" #: socialaccount/models.py:41 socialaccount/models.py:84 msgid "provider" msgstr "poskytovateľ" #: socialaccount/models.py:45 msgid "name" msgstr "meno" #: socialaccount/models.py:47 msgid "client id" msgstr "identifikátor klienta" #: socialaccount/models.py:49 msgid "App ID, or consumer key" msgstr "ID aplikácie alebo zákaznícky kľúč" #: socialaccount/models.py:52 msgid "secret key" msgstr "tajný kľúč" #: socialaccount/models.py:55 msgid "API secret, client secret, or consumer secret" msgstr "Kľúč API, klienta alebo zákazníka" #: socialaccount/models.py:58 msgid "Key" msgstr "Kľúč" #: socialaccount/models.py:74 msgid "social application" msgstr "sociálna aplikácia" #: socialaccount/models.py:75 msgid "social applications" msgstr "sociálne aplikácie" #: socialaccount/models.py:105 msgid "uid" msgstr "uid" #: socialaccount/models.py:107 msgid "last login" msgstr "posledné prihlásenie" #: socialaccount/models.py:108 msgid "date joined" msgstr "dáum pripojenia" #: socialaccount/models.py:109 msgid "extra data" msgstr "ďalšie údaje" #: socialaccount/models.py:113 msgid "social account" msgstr "sociálny účet" #: socialaccount/models.py:114 msgid "social accounts" msgstr "sociálne účty" #: socialaccount/models.py:139 msgid "token" msgstr "token" #: socialaccount/models.py:140 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "" "\"Oauth_token\" (Podpora protokolu OAuth1) alebo prístup tokenu (OAuth2)" #: socialaccount/models.py:144 msgid "token secret" msgstr "heslo prístupového tokenu" #: socialaccount/models.py:145 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "" "\"Oauth_token_secret\" (Podpora protokolu OAuth1) alebo token obnovenie " "(OAuth2)" #: socialaccount/models.py:148 msgid "expires at" msgstr "vyexpiruje" #: socialaccount/models.py:153 msgid "social application token" msgstr "token sociálnej aplikácie" #: socialaccount/models.py:154 msgid "social application tokens" msgstr "tokeny sociálnej aplikácie" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "Nesprávne profilové údaje" #: socialaccount/providers/oauth/client.py:85 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Neplatná odozva pri získavaní požiadavky tokenu z \"%s\"." #: socialaccount/providers/oauth/client.py:117 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Neplatná odozva pri získavaní prístupu tokenu z \"%s\"." #: socialaccount/providers/oauth/client.py:138 #, python-format msgid "No request token saved for \"%s\"." msgstr "Žiadna uložená požiadavka tokenu pre \"%s\"." #: socialaccount/providers/oauth/client.py:189 #, python-format msgid "No access token saved for \"%s\"." msgstr "Žiadny uložený prístupový token pre \"%s\"." #: socialaccount/providers/oauth/client.py:210 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Žiadny prístup do privátneho úložiska na \"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:8 msgid "Account Inactive" msgstr "Účet neaktívny" #: templates/account/account_inactive.html:10 msgid "This account is inactive." msgstr "Tento účet je neaktívny." #: templates/account/email.html:5 templates/account/email.html:8 msgid "E-mail Addresses" msgstr "E-mailová adresa" #: templates/account/email.html:10 msgid "The following e-mail addresses are associated with your account:" msgstr "Nasledujúce e-mailové adresy sú prepojené s vašim účtom:" #: templates/account/email.html:24 msgid "Verified" msgstr "Overený" #: templates/account/email.html:26 msgid "Unverified" msgstr "Neoverený" #: templates/account/email.html:28 msgid "Primary" msgstr "Primárny" #: templates/account/email.html:34 msgid "Make Primary" msgstr "Vytvoriť primárny" #: templates/account/email.html:35 msgid "Re-send Verification" msgstr "Preposlať overenie" #: templates/account/email.html:36 templates/socialaccount/connections.html:35 msgid "Remove" msgstr "Odstrániť" #: templates/account/email.html:43 msgid "Warning:" msgstr "Varovanie:" #: templates/account/email.html:43 msgid "" "You currently do not have any e-mail address set up. You should really add " "an e-mail address so you can receive notifications, reset your password, etc." msgstr "" "Momentálne nemáte nastavený žiaden e-mail, kvôli čomu nemôžete dostávať " "upozornenia, obnovovať heslo, atď." #: templates/account/email.html:48 msgid "Add E-mail Address" msgstr "Pridať e-mailovú adresu" #: templates/account/email.html:53 msgid "Add E-mail" msgstr "Pridať e-mail" #: templates/account/email.html:63 msgid "Do you really want to remove the selected e-mail address?" msgstr "Naozaj chcete odstrániť vybranú e-mailovú adresu?" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "Dobrý deň z %(site_name)s!" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "Ďakujeme za využitie %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, python-format msgid "" "You're receiving this e-mail because user %(user_display)s has given your e-" "mail address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "Tento e-mail ste dostali, pretože používateľ %(user_display)s na " "%(site_domain)s zadal túto e-mailovú adresu na prepojenie s jeho účtom.\n" "\n" "Pre potvrdenie nasledujte %(activate_url)s" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your E-mail Address" msgstr "Potvrďte prosím svoju e-mailovú adresu" #: templates/account/email/password_reset_key_message.txt:4 msgid "" "You're receiving this e-mail because you or someone else has requested a " "password for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Tento e-mail ste dostali, pretože niekto požiadal o heslo k Vášmu " "používateľskému účtu. Ak ste to neboli Vy, správu môžete pokojne ignorovať. " "Odkaz nižšie obnoví heslo." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "Ak ste náhodou zabudli, vaše používateľské meno je %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 msgid "Password Reset E-mail" msgstr "E-mail pre obnovu hesla" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm E-mail Address" msgstr "Potvrdiť e-mailovú adresu" #: templates/account/email_confirm.html:16 #, python-format msgid "" "Please confirm that %(email)s is an e-mail " "address for user %(user_display)s." msgstr "" "Prosím potvrďte, že %(email)s je e-mailová " "adresa pre používateľa %(user_display)s." #: templates/account/email_confirm.html:20 msgid "Confirm" msgstr "Potvrdiť" #: templates/account/email_confirm.html:27 #, python-format msgid "" "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgstr "" "Odkaz na potvrdenie e-mailu je neplatný alebo vypršal. Zaslať novú žiadosť o overovací e-mail." #: templates/account/login.html:6 templates/account/login.html:10 #: templates/account/login.html:43 msgid "Sign In" msgstr "Prihlásiť sa" #: templates/account/login.html:15 #, python-format msgid "" "Please sign in with one\n" "of your existing third party accounts. Or, sign " "up\n" "for a %(site_name)s account and sign in below:" msgstr "" "Prosím prihláste sa s jedným\n" "z vašich existujúcich účtov iných služieb. Alebo sa zaregistrujte\n" "na %(site_name)s a prihláste sa nižšie:" #: templates/account/login.html:25 msgid "or" msgstr "alebo" #: templates/account/login.html:32 #, python-format msgid "" "If you have not created an account yet, then please\n" "sign up first." msgstr "" "Ak ešte nemáte vytvorený účet, tak potom sa prosím\n" "najprv zaregistrujte." #: templates/account/login.html:42 templates/account/password_change.html:14 msgid "Forgot Password?" msgstr "Zabudnuté heslo?" #: templates/account/logout.html:5 templates/account/logout.html:8 #: templates/account/logout.html:17 msgid "Sign Out" msgstr "Odhlásiť" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Ste si istý, že sa chcete odhlásiť?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary e-mail address (%(email)s)." msgstr "Primárna e-mailová adresa sa nedá odstrániť (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation e-mail sent to %(email)s." msgstr "Overovací e-mail poslaný na %(email)s." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "%(email)s potvrdené." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed e-mail address %(email)s." msgstr "E-mailová adresa %(email)s úpešne odstránená." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Úspešne ste sa prihlásili ako %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Odhlásili ste sa." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Zmena hesla prebehla úspešne." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr ")Nastavenie hesla bolo úspešné." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary e-mail address set." msgstr "Primárna e-mailová adresa bola úspešne zadaná." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary e-mail address must be verified." msgstr "Primárna e-mailová adresa musí byť overená." #: templates/account/password_change.html:5 #: templates/account/password_change.html:8 #: templates/account/password_change.html:13 #: templates/account/password_reset_from_key.html:4 #: templates/account/password_reset_from_key.html:7 #: templates/account/password_reset_from_key_done.html:4 #: templates/account/password_reset_from_key_done.html:7 msgid "Change Password" msgstr "Zmeniť heslo" #: templates/account/password_reset.html:6 #: templates/account/password_reset.html:10 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:9 msgid "Password Reset" msgstr "Obnoviť heslo" #: templates/account/password_reset.html:15 msgid "" "Forgotten your password? Enter your e-mail address below, and we'll send you " "an e-mail allowing you to reset it." msgstr "" "Zabudli ste heslo? Vložte nižšie svoju e-mailovú adresu a čoskoro vám " "pošleme e-mail na obnovenie hesla." #: templates/account/password_reset.html:20 msgid "Reset My Password" msgstr "Obnov moje heslo" #: templates/account/password_reset.html:23 msgid "Please contact us if you have any trouble resetting your password." msgstr "" "Prosím, kontaktujte nás, ak máte nejaký problém s obnovením svojho hesla." #: templates/account/password_reset_done.html:15 msgid "" "We have sent you an e-mail. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Odoslali sme vám e-mail. Prosím kontaktujte nás ak ste ho nedostali do pár " "minút." #: templates/account/password_reset_from_key.html:7 msgid "Bad Token" msgstr "Zlý token" #: templates/account/password_reset_from_key.html:11 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Odkaz na obnovu heslo je neplatný, pravdepodobne už bol použitý. Nové obnovenie hesla." #: templates/account/password_reset_from_key.html:17 msgid "change password" msgstr "zmeniť heslo" #: templates/account/password_reset_from_key.html:20 #: templates/account/password_reset_from_key_done.html:8 msgid "Your password is now changed." msgstr "Tvoje heslo bolo zmenené." #: templates/account/password_set.html:5 templates/account/password_set.html:8 #: templates/account/password_set.html:13 msgid "Set Password" msgstr "Nastaviť heslo" #: templates/account/signup.html:5 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Registrácia" #: templates/account/signup.html:8 templates/account/signup.html:18 #: templates/socialaccount/signup.html:8 templates/socialaccount/signup.html:19 msgid "Sign Up" msgstr "Zaregistrovať" #: templates/account/signup.html:10 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "" "Už ste sa zaregistrovali? Tak sa prihláste." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:8 msgid "Sign Up Closed" msgstr "Registrácia uzavretá" #: templates/account/signup_closed.html:10 msgid "We are sorry, but the sign up is currently closed." msgstr "Ospravedlňujeme sa, ale registrácia je momentálne uzavretá." #: templates/account/snippets/already_logged_in.html:5 msgid "Note" msgstr "Poznámka" #: templates/account/snippets/already_logged_in.html:5 #, python-format msgid "you are already logged in as %(user_display)s." msgstr "už ste prihlásený ako %(user_display)s." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:8 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:8 msgid "Verify Your E-mail Address" msgstr "Potvrďte e-mailovú adresu" #: templates/account/verification_sent.html:10 msgid "" "We have sent an e-mail to you for verification. Follow the link provided to " "finalize the signup process. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Bol vám zaslaný overovací e-mail. Pre dokončenie registrácie použite " "overovací odkaz. Ak ste v priebehu pár minút žiaden neobdržali, kontaktujte " "nás." #: templates/account/verified_email_required.html:12 msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your e-mail address. " msgstr "" "Na prezeranie nasledujúceho obsahu je potrebné overenie vašej e-mailovej " "adresy. " #: templates/account/verified_email_required.html:16 msgid "" "We have sent an e-mail to you for\n" "verification. Please click on the link inside this e-mail. Please\n" "contact us if you do not receive it within a few minutes." msgstr "" "Bol vám zaslaný e-mail s overovacím odkazom. Ak ste v priebehu pár minút " "žiaden neobdržali, kontaktujte nás." #: templates/account/verified_email_required.html:20 #, python-format msgid "" "Note: you can still change your e-" "mail address." msgstr "" "Poznámka: stále môžete zmeniť " "svoju e-mailovú adresu." #: templates/openid/login.html:9 msgid "OpenID Sign In" msgstr "Prihlásiť pomocou OpenID" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:8 msgid "Social Network Login Failure" msgstr "Prihlasovanie pomocou sociálnej siete neúspešné" #: templates/socialaccount/authentication_error.html:10 msgid "" "An error occurred while attempting to login via your social network account." msgstr "Pri prihlasovaní pomocou sociálnej siete sa vyskytla chyba." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:8 msgid "Account Connections" msgstr "Pripojenia účtu" #: templates/socialaccount/connections.html:11 msgid "" "You can sign in to your account using any of the following third party " "accounts:" msgstr "Môžete sa prihlásiť pomocou niektorého z nasledujúcich účtov:" #: templates/socialaccount/connections.html:43 msgid "" "You currently have no social network accounts connected to this account." msgstr "Momentálne nemáte pripojený žiaden sociálny účet." #: templates/socialaccount/connections.html:46 msgid "Add a 3rd Party Account" msgstr "Pridaj účet" #: templates/socialaccount/login.html:6 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:8 #, python-format msgid "You are about to connect a new third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:10 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:12 #, python-format msgid "You are about to sign in using a third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Prihlásenie zrušené" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Rozhodli ste sa zrušiť prihlasovanie sa na našu stránku použitím jedného z " "vašich existujúcich účtov. Ak se chceli vykonať inú operáciu, pokračujte na " "prihlásiť sa." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "Sociálny účet bol pripojený." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "Tento sociálny účet už bol pripojený k inému používateľovi." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Sociálny účet bol odpojený." #: templates/socialaccount/signup.html:10 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Chystáte sa použiť váš %(provider_name)s účet na prihlásenie do " "%(site_name)s. Ako posledný krok vyplňte nasledujúci formulár:" django-allauth-0.47.0/allauth/locale/sl/000077500000000000000000000000001415442050100177775ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/sl/LC_MESSAGES/000077500000000000000000000000001415442050100215645ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/sl/LC_MESSAGES/django.po000066400000000000000000000622211415442050100233710ustar00rootroot00000000000000# Slovenian translations for Django-allauth. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Lev Predan Kowarski , 2020-06-27 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-12-09 08:41-0600\n" "PO-Revision-Date: 2020-06-27 12:21+0122\n" "Last-Translator: Lev Predan Kowarski \n" "Language-Team: Bojan Mihelac , Lev Predan Kowarski " "\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" "%100==4 ? 2 : 3);\n" "X-Translated-Using: django-rosetta 0.7.4\n" #: account/adapter.py:45 msgid "Username can not be used. Please use other username." msgstr "" "Uporabniško ime je neveljavno. Prosimo uporabite drugo uporabniško ime." #: account/adapter.py:51 msgid "Too many failed login attempts. Try again later." msgstr "Preveliko število neuspelih prijav. Poskusite znova kasneje." #: account/adapter.py:53 msgid "A user is already registered with this e-mail address." msgstr "Za ta e-naslov že obstaja registriran uporabnik." #: account/adapter.py:300 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Geslo mora vsebovati najmanj {0} znakov. " #: account/apps.py:7 msgid "Accounts" msgstr "Računi" #: account/forms.py:59 account/forms.py:413 msgid "You must type the same password each time." msgstr "Vnesti je potrebno isto geslo." #: account/forms.py:92 account/forms.py:381 account/forms.py:498 msgid "Password" msgstr "Geslo" #: account/forms.py:93 msgid "Remember Me" msgstr "Zapomni si me" #: account/forms.py:97 msgid "This account is currently inactive." msgstr "Račun trenutno ni aktiven." #: account/forms.py:99 msgid "The e-mail address and/or password you specified are not correct." msgstr "E-poštni naslov in/ali geslo nista pravilna." #: account/forms.py:102 msgid "The username and/or password you specified are not correct." msgstr "Uporabniško ime in/ali geslo nista pravilna." #: account/forms.py:113 account/forms.py:279 account/forms.py:439 #: account/forms.py:517 msgid "E-mail address" msgstr "E-poštni naslov" #: account/forms.py:117 account/forms.py:316 account/forms.py:436 #: account/forms.py:512 msgid "E-mail" msgstr "E-poštni naslov" #: account/forms.py:120 account/forms.py:123 account/forms.py:269 #: account/forms.py:272 msgid "Username" msgstr "Uporabniško ime" #: account/forms.py:133 msgid "Username or e-mail" msgstr "Uporabniško ime ali e-poštni naslov" #: account/forms.py:136 msgctxt "field label" msgid "Login" msgstr "Prijava" #: account/forms.py:307 msgid "E-mail (again)" msgstr "E-pooštni naslov (ponovno)" #: account/forms.py:311 msgid "E-mail address confirmation" msgstr "Potrditev e-poštni naslova" #: account/forms.py:319 msgid "E-mail (optional)" msgstr "E-poštni naslov (neobvezno)" #: account/forms.py:359 msgid "You must type the same email each time." msgstr "Vnesti je potrebno isti e-poštni naslov." #: account/forms.py:384 account/forms.py:499 msgid "Password (again)" msgstr "Geslo (ponovno)" #: account/forms.py:448 msgid "This e-mail address is already associated with this account." msgstr "E-poštni naslov že pripada vašemu uporabniškemu računu." #: account/forms.py:451 msgid "This e-mail address is already associated with another account." msgstr "E-poštni naslov že pripada drugemu uporabniškemu računu." #: account/forms.py:453 #, fuzzy, python-format #| msgid "Your account has no verified e-mail address." msgid "You cannot add more than %d e-mail addresses." msgstr "Vaš uporabniški račun nima preverjenega e-poštnega naslova." #: account/forms.py:478 msgid "Current Password" msgstr "Trenutno geslo" #: account/forms.py:480 account/forms.py:570 msgid "New Password" msgstr "Novo geslo" #: account/forms.py:481 account/forms.py:571 msgid "New Password (again)" msgstr "Novo geslo (ponovno)" #: account/forms.py:489 msgid "Please type your current password." msgstr "Prosimo vpišite trenutno geslo." #: account/forms.py:529 msgid "The e-mail address is not assigned to any user account" msgstr "E-poštni naslov ne pripada nobenemu uporabniškemu računu." #: account/forms.py:592 msgid "The password reset token was invalid." msgstr "Žeton za ponastavitev gesla je bil neveljaven." #: account/models.py:22 msgid "user" msgstr "uporabnik" #: account/models.py:28 account/models.py:83 #, fuzzy #| msgid "E-mail address" msgid "e-mail address" msgstr "E-poštni naslov" #: account/models.py:30 msgid "verified" msgstr "preverjeno" #: account/models.py:31 msgid "primary" msgstr "Primarni" #: account/models.py:36 msgid "email address" msgstr "E-poštni naslov" #: account/models.py:37 msgid "email addresses" msgstr "E-poštni naslovi" #: account/models.py:86 msgid "created" msgstr "ustvarjeno" #: account/models.py:87 msgid "sent" msgstr "poslano" #: account/models.py:88 socialaccount/models.py:58 msgid "key" msgstr "ključ" #: account/models.py:93 msgid "email confirmation" msgstr "E-poštna potrditev" #: account/models.py:94 msgid "email confirmations" msgstr "E-poštne potrditve" #: socialaccount/adapter.py:26 #, python-format msgid "" "An account already exists with this e-mail address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Uporabniški račun s tem e-poštnim naslovom že obstaja. Prosimo vpišite se v " "tobstoječi račun, nato %s račune povežite." #: socialaccount/adapter.py:131 msgid "Your account has no password set up." msgstr "Vaš uporabniški račun nima nastavljenega gesla." #: socialaccount/adapter.py:138 msgid "Your account has no verified e-mail address." msgstr "Vaš uporabniški račun nima preverjenega e-poštnega naslova." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Računi družbenih omrežij." #: socialaccount/models.py:41 socialaccount/models.py:84 msgid "provider" msgstr "ponudnik" #: socialaccount/models.py:45 msgid "name" msgstr "ime" #: socialaccount/models.py:47 msgid "client id" msgstr "id številka" #: socialaccount/models.py:49 msgid "App ID, or consumer key" msgstr "ID aplikacije ali uporoabniški ključ" #: socialaccount/models.py:52 msgid "secret key" msgstr "skrivni ključ" #: socialaccount/models.py:55 msgid "API secret, client secret, or consumer secret" msgstr "API skrivnost, skrivnost klienta ali uporabniška skrivnost" #: socialaccount/models.py:58 msgid "Key" msgstr "Ključ" #: socialaccount/models.py:74 msgid "social application" msgstr "družbena aplikacija" #: socialaccount/models.py:75 msgid "social applications" msgstr "družbene aplikacije" #: socialaccount/models.py:105 msgid "uid" msgstr "uid" #: socialaccount/models.py:107 msgid "last login" msgstr "zadnja prijava" #: socialaccount/models.py:108 msgid "date joined" msgstr "datum pridružitve" #: socialaccount/models.py:109 msgid "extra data" msgstr "dodatni podatki" #: socialaccount/models.py:113 msgid "social account" msgstr "uporabniški račun družbenih omerižij" #: socialaccount/models.py:114 msgid "social accounts" msgstr "uporabniški računi družbenih omerižij" #: socialaccount/models.py:139 msgid "token" msgstr "žeton" #: socialaccount/models.py:140 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "\"oauth_token\" (OAuth1) ali žeton za dostop (OAuth2)" #: socialaccount/models.py:144 msgid "token secret" msgstr "žeton skrivnost" #: socialaccount/models.py:145 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "\"oauth_token_secret\" (OAuth1) ali žeton za osvežitev (OAuth2)" #: socialaccount/models.py:148 msgid "expires at" msgstr "veljavnost poteče" #: socialaccount/models.py:153 msgid "social application token" msgstr "žeton družebnih omrežij" #: socialaccount/models.py:154 msgid "social application tokens" msgstr "žetoni družbenih omrežij" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "Nevelljavni podatki profila" #: socialaccount/providers/oauth/client.py:85 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Neveljaven odgovor ob pridobivanju žetona za zahtevo od \"%s\"." #: socialaccount/providers/oauth/client.py:117 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Neveljaven odgovor ob pridobivanju žetona za dostop od \"%s\"." #: socialaccount/providers/oauth/client.py:138 #, python-format msgid "No request token saved for \"%s\"." msgstr "Za \"%s\" ni shranjenega žetona za zahtevo." #: socialaccount/providers/oauth/client.py:189 #, python-format msgid "No access token saved for \"%s\"." msgstr "Za \"%s\" ni shranjenega žetona za dostop." #: socialaccount/providers/oauth/client.py:210 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Ni dostopa do zasebnega vira na \"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:8 msgid "Account Inactive" msgstr "Neaktiven račun" #: templates/account/account_inactive.html:10 msgid "This account is inactive." msgstr "Račun ni aktiven." #: templates/account/email.html:5 templates/account/email.html:8 msgid "E-mail Addresses" msgstr "E-poštni naslovi" #: templates/account/email.html:10 msgid "The following e-mail addresses are associated with your account:" msgstr "E-poštni naslovi, ki pripadajo vašemu uporabniškemu računu:" #: templates/account/email.html:24 msgid "Verified" msgstr "Preverjeni" #: templates/account/email.html:26 msgid "Unverified" msgstr "Nepreverjeni" #: templates/account/email.html:28 msgid "Primary" msgstr "Primarni" #: templates/account/email.html:34 msgid "Make Primary" msgstr "Spremeni v primarni" #: templates/account/email.html:35 msgid "Re-send Verification" msgstr "Ponovno pošlji verifikacijo" #: templates/account/email.html:36 templates/socialaccount/connections.html:35 msgid "Remove" msgstr "Odstrani" #: templates/account/email.html:43 msgid "Warning:" msgstr "Opozorilo:" #: templates/account/email.html:43 msgid "" "You currently do not have any e-mail address set up. You should really add " "an e-mail address so you can receive notifications, reset your password, etc." msgstr "" "Trenutno nimate natavljlenega e-poštnega naslova. Priporočamo vam, da dodate " "e-poštni naslov, za prejemanje obvestil, zahtevkv za ponastavitev gesla, ipd." #: templates/account/email.html:48 msgid "Add E-mail Address" msgstr "Dodaj e-poštni naslov" #: templates/account/email.html:53 msgid "Add E-mail" msgstr "Dodaj e-pošto" #: templates/account/email.html:63 msgid "Do you really want to remove the selected e-mail address?" msgstr "Želite odstraniti izbran e-poštni nalsov?" #: templates/account/email/base_message.txt:1 #, fuzzy, python-format #| msgid "" #| "Thank you from %(site_name)s!\n" #| "%(site_domain)s" msgid "Hello from %(site_name)s!" msgstr "Najlepša hvala od %(site_name)s, %(site_domain)s" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "Hvala, ker uporabljate %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because user %(user_display)s has given " #| "yours as an e-mail address to connect their account.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s\n" msgid "" "You're receiving this e-mail because user %(user_display)s has given your e-" "mail address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "Pozdravljeni od %(site_name)s!\n" "To sporočilo ste prejeli, ker je uporabnik %(user_display)s povezal vaše-" "poštni naslov s svojim uporabniškim računom.\n" "\n" "Za potrditev sledite povezavi: %(activate_url)s\n" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your E-mail Address" msgstr "Prosimo, potrdite svoj e-poštni naslov." #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this e-mail because you or someone else has requested a " "password for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Pozdravljeni od %(site_name)s!\n" "To sporočilo ste prejeli, ker ste zahtevali ponastavitev gesla na " "%(site_name)s!\n" "To sporočilo lahko zavržete, če niste poslali zahtevka za spremembo gesla. " "Za ponastavitev gelsa, sledie spodnji pvezavi:" #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "V primeru, da ste pozabili, vaše uporabniško ime je: %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 msgid "Password Reset E-mail" msgstr "E-poštni naslov za ponastavitev gesla" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm E-mail Address" msgstr "Potrdite e-poštni naslov" #: templates/account/email_confirm.html:16 #, python-format msgid "" "Please confirm that %(email)s is an e-mail " "address for user %(user_display)s." msgstr "" "Prosimo, potrdite, da je %(email)s e-poštni " "naslov uporabnika %(user_display)s." #: templates/account/email_confirm.html:20 msgid "Confirm" msgstr "Potrdi" #: templates/account/email_confirm.html:27 #, python-format msgid "" "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgstr "" "Povezava za potrditev je neveljavna, ali pa se je iztekla. Prosimo, pošljite nov zahtevek za potrditev.." #: templates/account/login.html:6 templates/account/login.html:10 #: templates/account/login.html:43 msgid "Sign In" msgstr "Prijava" #: templates/account/login.html:15 #, python-format msgid "" "Please sign in with one\n" "of your existing third party accounts. Or, sign " "up\n" "for a %(site_name)s account and sign in below:" msgstr "" "Prosimo, vpišite se z enim od vaših\n" "obstoječih računov, ali pa ustvarite nov račun\n" "na %(site_name)s in se vpišite spodaj:" #: templates/account/login.html:25 msgid "or" msgstr "ali" #: templates/account/login.html:32 #, python-format msgid "" "If you have not created an account yet, then please\n" "sign up first." msgstr "" "Če še nimate uporabniškega računa, ga ustvarite\n" "tukaj." #: templates/account/login.html:42 templates/account/password_change.html:14 msgid "Forgot Password?" msgstr "Ste pozabili geslo?" #: templates/account/logout.html:5 templates/account/logout.html:8 #: templates/account/logout.html:17 msgid "Sign Out" msgstr "Odjava" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Ali ste prepričani, da se želite odjaviti?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary e-mail address (%(email)s)." msgstr "Primarnega e-poštnega naslova (%(email)s) ni mogoče odstraniti." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation e-mail sent to %(email)s." msgstr "Na %(email)s je bilo poslano potrditveno sporočilo." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "%(email)s je potrjen." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed e-mail address %(email)s." msgstr "E-poštni naslov %(email)s je bil odstranjen." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Uspešno ste se prijavili kot %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Odjavili ste se." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Geslo je uspešno zamenjano." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Geslo je uspešno nastavljeno." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary e-mail address set." msgstr "Primarni e-poštni naslov je nastavljen." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary e-mail address must be verified." msgstr "" #: templates/account/password_change.html:5 #: templates/account/password_change.html:8 #: templates/account/password_change.html:13 #: templates/account/password_reset_from_key.html:4 #: templates/account/password_reset_from_key.html:7 #: templates/account/password_reset_from_key_done.html:4 #: templates/account/password_reset_from_key_done.html:7 msgid "Change Password" msgstr "Sprememba gesla" #: templates/account/password_reset.html:6 #: templates/account/password_reset.html:10 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:9 msgid "Password Reset" msgstr "Ponastavitev gesla" #: templates/account/password_reset.html:15 msgid "" "Forgotten your password? Enter your e-mail address below, and we'll send you " "an e-mail allowing you to reset it." msgstr "" "Vnesite vaš e-potni naslov, na katerega boste prejeli povezavo za " "ponastavitev gesla." #: templates/account/password_reset.html:20 msgid "Reset My Password" msgstr "Ponastavi geslo" #: templates/account/password_reset.html:23 msgid "Please contact us if you have any trouble resetting your password." msgstr "V primeru težav pri ponastavljanju gesla, nas kontaktirajte." #: templates/account/password_reset_done.html:15 msgid "" "We have sent you an e-mail. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Povezava za ponastavitev gesla je bila poslana. Če je ne boste prejeli v " "nekaj minutah, nas kontaktirajte." #: templates/account/password_reset_from_key.html:7 msgid "Bad Token" msgstr "Napačni žeton" #: templates/account/password_reset_from_key.html:11 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Povezava za ponastavitev gesla je neveljavna oz. je bila že uporoabljena. " "Prosimo, zahtevajte novo povezavo za " "ponastavitev." #: templates/account/password_reset_from_key.html:17 msgid "change password" msgstr "Sprememba gesla" #: templates/account/password_reset_from_key.html:20 #: templates/account/password_reset_from_key_done.html:8 msgid "Your password is now changed." msgstr "Geslo je spremenjeno." #: templates/account/password_set.html:5 templates/account/password_set.html:8 #: templates/account/password_set.html:13 msgid "Set Password" msgstr "Nastavi geslo" #: templates/account/signup.html:5 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Ustvari račun" #: templates/account/signup.html:8 templates/account/signup.html:18 #: templates/socialaccount/signup.html:8 templates/socialaccount/signup.html:19 msgid "Sign Up" msgstr "Ustvari račun" #: templates/account/signup.html:10 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "" "Že imate uporabniški račun? Prijavite se. " #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:8 msgid "Sign Up Closed" msgstr "Registracija ni mogoča" #: templates/account/signup_closed.html:10 msgid "We are sorry, but the sign up is currently closed." msgstr "Registracija trenutno ni mogoča" #: templates/account/snippets/already_logged_in.html:5 msgid "Note" msgstr "Opomba" #: templates/account/snippets/already_logged_in.html:5 #, python-format msgid "you are already logged in as %(user_display)s." msgstr "Prijavljeni ste kot %(user_display)s." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:8 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:8 msgid "Verify Your E-mail Address" msgstr "Potrdite e-poštni naslov." #: templates/account/verification_sent.html:10 msgid "" "We have sent an e-mail to you for verification. Follow the link provided to " "finalize the signup process. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Na vaš e-poštni naslov je bil poslano sporočilo za potrditev. Skledite " "povezavi za zaključek registracije. Če sporočila ne boste prejeli v nekaj " "minutah, nas kontaktirajte." #: templates/account/verified_email_required.html:12 msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your e-mail address. " msgstr "" "Za dostop morate potrditi svojo identiteto. \n" "Prosimo, da potrdite navedeni e-poštni naslov." #: templates/account/verified_email_required.html:16 msgid "" "We have sent an e-mail to you for\n" "verification. Please click on the link inside this e-mail. Please\n" "contact us if you do not receive it within a few minutes." msgstr "" "Poslali smo vam e-poštno sporočilo s povezavo za \n" "potrditev. Če sporočila ne boste prejeli \n" "v nekaj minutah, nas kontaktirajte." #: templates/account/verified_email_required.html:20 #, python-format msgid "" "Note: you can still change your e-" "mail address." msgstr "" "Opomba: e-poštni naslov lahko " "spremenite." #: templates/openid/login.html:9 msgid "OpenID Sign In" msgstr "Prijava z OpenID" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:8 msgid "Social Network Login Failure" msgstr "Prijava z računom drugega ponudnika ni uspela." #: templates/socialaccount/authentication_error.html:10 msgid "" "An error occurred while attempting to login via your social network account." msgstr "" "Prišo je do napake ob poskusu prijave z vašim obstoječim računom drugega " "ponudnuka." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:8 msgid "Account Connections" msgstr "Povezave računov" #: templates/socialaccount/connections.html:11 msgid "" "You can sign in to your account using any of the following third party " "accounts:" msgstr "Vpišete se lahko s pomčjo vaših obstoječih uoporabniških računov:" #: templates/socialaccount/connections.html:43 msgid "" "You currently have no social network accounts connected to this account." msgstr "" "Trenutno nimate povezanega nobenega uporabniškega računa drugega ponudnika." #: templates/socialaccount/connections.html:46 msgid "Add a 3rd Party Account" msgstr "Dodaj obstoječi račun drugega ponudnika" #: templates/socialaccount/login.html:6 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:8 #, python-format msgid "You are about to connect a new third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:10 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:12 #, python-format msgid "You are about to sign in using a third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Prijava je bila prekinjena" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Odločili ste se za prekinitev prijave v našo storitev s pomočjo obstoječega " "računa. Če gre za napako, se lahko prijavite tukaj." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "Obstoječi račun je povezan." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "Obstoječi račun drugega ponudnika, je povezan z obstoječim računom." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Obstoječi uporabniški račun je razvezan." #: templates/socialaccount/signup.html:10 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Uporabili boste svoj obstoječi %(provider_name)s račun, za vpis v\n" "%(site_name)s. Prosimo izpolnite spodnji obrazec:" django-allauth-0.47.0/allauth/locale/sr/000077500000000000000000000000001415442050100200055ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/sr/LC_MESSAGES/000077500000000000000000000000001415442050100215725ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/sr/LC_MESSAGES/django.po000066400000000000000000000731551415442050100234070ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Nikola Vulovic , 2018. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-12-09 08:41-0600\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Nikola Vulovic \n" "Language-Team: NONE\n" "Language: sr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: account/adapter.py:45 msgid "Username can not be used. Please use other username." msgstr "" "Корисничко име се не може користити. Молимо користите друго корисничко име." #: account/adapter.py:51 msgid "Too many failed login attempts. Try again later." msgstr "Превише неуспелих покушаја пријављивања. Покушајте поново касније." #: account/adapter.py:53 msgid "A user is already registered with this e-mail address." msgstr "Корисник је већ регистрован на овој адреси е-поште." #: account/adapter.py:300 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Лозинка мора бити најмање {0} знакова." #: account/apps.py:7 msgid "Accounts" msgstr "Рачуни" #: account/forms.py:59 account/forms.py:413 msgid "You must type the same password each time." msgstr "Морате унијети исту лозинку сваки пут" #: account/forms.py:92 account/forms.py:381 account/forms.py:498 msgid "Password" msgstr "Лозинка" #: account/forms.py:93 msgid "Remember Me" msgstr "Сети ме се" #: account/forms.py:97 msgid "This account is currently inactive." msgstr "Овај налог је тренутно неактиван." #: account/forms.py:99 msgid "The e-mail address and/or password you specified are not correct." msgstr "Адреса е-поште и/или лозинка коју сте навели нису тачни." #: account/forms.py:102 msgid "The username and/or password you specified are not correct." msgstr "Корисничко име и/или лозинка коју сте навели нису тачни." #: account/forms.py:113 account/forms.py:279 account/forms.py:439 #: account/forms.py:517 msgid "E-mail address" msgstr "Адреса е-поште" #: account/forms.py:117 account/forms.py:316 account/forms.py:436 #: account/forms.py:512 msgid "E-mail" msgstr "Е-пошта" #: account/forms.py:120 account/forms.py:123 account/forms.py:269 #: account/forms.py:272 msgid "Username" msgstr "Корисничко име" #: account/forms.py:133 msgid "Username or e-mail" msgstr "Корисничко име или е-пошта" #: account/forms.py:136 msgctxt "field label" msgid "Login" msgstr "Пријавите се" #: account/forms.py:307 msgid "E-mail (again)" msgstr "Е-пошта (опет)" #: account/forms.py:311 msgid "E-mail address confirmation" msgstr "Потврда адресе е-поште" #: account/forms.py:319 msgid "E-mail (optional)" msgstr "Е-пошта (опционо)" #: account/forms.py:359 msgid "You must type the same email each time." msgstr "Морате унијети исту адресу е-поште сваки пут." #: account/forms.py:384 account/forms.py:499 msgid "Password (again)" msgstr "Лозинка (поново)" #: account/forms.py:448 msgid "This e-mail address is already associated with this account." msgstr "Ова адреса е-поште је већ повезана са овим налогом." #: account/forms.py:451 msgid "This e-mail address is already associated with another account." msgstr "Ова адреса е-поште је већ повезана са другим налогом." #: account/forms.py:453 #, fuzzy, python-format #| msgid "Your account has no verified e-mail address." msgid "You cannot add more than %d e-mail addresses." msgstr "Ваш налог нема потврђену е-маил адресу." #: account/forms.py:478 msgid "Current Password" msgstr "Тренутна лозинка" #: account/forms.py:480 account/forms.py:570 msgid "New Password" msgstr "Нова лозинка" #: account/forms.py:481 account/forms.py:571 msgid "New Password (again)" msgstr "Нова лозинка (поново)" #: account/forms.py:489 msgid "Please type your current password." msgstr "Молимо унесите тренутну лозинку." #: account/forms.py:529 msgid "The e-mail address is not assigned to any user account" msgstr "Адреса е-поште није додељена било ком корисничком налогу" #: account/forms.py:592 msgid "The password reset token was invalid." msgstr "Токен ресетовања лозинке је неважећи." #: account/models.py:22 msgid "user" msgstr "корисник" #: account/models.py:28 account/models.py:83 msgid "e-mail address" msgstr "адреса е-поште" #: account/models.py:30 msgid "verified" msgstr "проверено" #: account/models.py:31 msgid "primary" msgstr "примарна" #: account/models.py:36 msgid "email address" msgstr "адреса е-поште" #: account/models.py:37 msgid "email addresses" msgstr "адресе е-поште" #: account/models.py:86 msgid "created" msgstr "створено" #: account/models.py:87 msgid "sent" msgstr "послат" #: account/models.py:88 socialaccount/models.py:58 msgid "key" msgstr "кључ" #: account/models.py:93 msgid "email confirmation" msgstr "потврда е-поште" #: account/models.py:94 msgid "email confirmations" msgstr "потврде е-поште" #: socialaccount/adapter.py:26 #, python-format msgid "" "An account already exists with this e-mail address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Рачун постоји већ са овом адресом е-поште. Пријавите се на топрви налог, " "затим повежите свој %s налог." #: socialaccount/adapter.py:131 msgid "Your account has no password set up." msgstr "Ваш налог нема подешену лозинку." #: socialaccount/adapter.py:138 msgid "Your account has no verified e-mail address." msgstr "Ваш налог нема потврђену е-маил адресу." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Друштвени рачуни" #: socialaccount/models.py:41 socialaccount/models.py:84 msgid "provider" msgstr "провидер" #: socialaccount/models.py:45 msgid "name" msgstr "име" #: socialaccount/models.py:47 msgid "client id" msgstr "ИД клијента" #: socialaccount/models.py:49 msgid "App ID, or consumer key" msgstr "ИД апликације или потрошачки кључ" #: socialaccount/models.py:52 msgid "secret key" msgstr "тајни кључ" #: socialaccount/models.py:55 msgid "API secret, client secret, or consumer secret" msgstr "Тајна АПИ-ја, тајна клијента или тајна потрошача" #: socialaccount/models.py:58 msgid "Key" msgstr "Кључ" #: socialaccount/models.py:74 msgid "social application" msgstr "друштвена апликација" #: socialaccount/models.py:75 msgid "social applications" msgstr "друштвена апликације" #: socialaccount/models.py:105 msgid "uid" msgstr "уид" #: socialaccount/models.py:107 msgid "last login" msgstr "Последње пријављивање" #: socialaccount/models.py:108 msgid "date joined" msgstr "Датум придружио" #: socialaccount/models.py:109 msgid "extra data" msgstr "додатни подаци" #: socialaccount/models.py:113 msgid "social account" msgstr "друштвени рачун" #: socialaccount/models.py:114 msgid "social accounts" msgstr "друштвени рачуни" #: socialaccount/models.py:139 msgid "token" msgstr "токен" #: socialaccount/models.py:140 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "\"oauth_token\" (OAuth1) или токен приступа (OAuth2)" #: socialaccount/models.py:144 msgid "token secret" msgstr "токен тајна" #: socialaccount/models.py:145 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "\"oauth_token_secret\" (OAuth1) или освежени токен (OAuth2)" #: socialaccount/models.py:148 msgid "expires at" msgstr "истиче у" #: socialaccount/models.py:153 msgid "social application token" msgstr "Токен друштвених апликација" #: socialaccount/models.py:154 msgid "social application tokens" msgstr "токени друштвених апликација" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "Невељавни подаци о профилу" #: socialaccount/providers/oauth/client.py:85 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Неважећи одговор при добијању токена за захтев од \"%s\"." #: socialaccount/providers/oauth/client.py:117 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Неважећи одговор при добијању токена за приступ од \"%s\"." #: socialaccount/providers/oauth/client.py:138 #, python-format msgid "No request token saved for \"%s\"." msgstr "нема сачуваних токена за захтев од \"%s\"." #: socialaccount/providers/oauth/client.py:189 #, python-format msgid "No access token saved for \"%s\"." msgstr "нема сачуваних токена за приступ од \"%s\"." #: socialaccount/providers/oauth/client.py:210 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Нема приступа приватним ресурсима у \"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:8 msgid "Account Inactive" msgstr "Рачун неактиван" #: templates/account/account_inactive.html:10 msgid "This account is inactive." msgstr "Овај налог је неактиван." #: templates/account/email.html:5 templates/account/email.html:8 msgid "E-mail Addresses" msgstr "Адресе е-поште" #: templates/account/email.html:10 msgid "The following e-mail addresses are associated with your account:" msgstr "С вашим налогом су повезане следеће адресе е-пошти:" #: templates/account/email.html:24 msgid "Verified" msgstr "Потврђено" #: templates/account/email.html:26 msgid "Unverified" msgstr "Непотврђени" #: templates/account/email.html:28 msgid "Primary" msgstr "Примарни" #: templates/account/email.html:34 msgid "Make Primary" msgstr "Постави за Примарни" #: templates/account/email.html:35 msgid "Re-send Verification" msgstr "Поновно пошаљи верификацију" #: templates/account/email.html:36 templates/socialaccount/connections.html:35 msgid "Remove" msgstr "Уклони" #: templates/account/email.html:43 msgid "Warning:" msgstr "Упозорење:" #: templates/account/email.html:43 msgid "" "You currently do not have any e-mail address set up. You should really add " "an e-mail address so you can receive notifications, reset your password, etc." msgstr "" "Тренутно немате никакву адресу е-поште. Требали бисте стварно додатиадресу е-" "поште како бисте могли примати обавештења, ресетовати лозинку итд." #: templates/account/email.html:48 msgid "Add E-mail Address" msgstr "Додај адресу е-поште" #: templates/account/email.html:53 msgid "Add E-mail" msgstr "Додај е-пошту" #: templates/account/email.html:63 msgid "Do you really want to remove the selected e-mail address?" msgstr "Да ли стварно желите да уклоните изабрану адресу е-поште?" #: templates/account/email/base_message.txt:1 #, fuzzy, python-format #| msgid "" #| "Thank you from %(site_name)s!\n" #| "%(site_domain)s" msgid "Hello from %(site_name)s!" msgstr "" "Хвала од %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "Хвала вам што користите %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because user %(user_display)s has given " #| "yours as an e-mail address to connect their account.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s\n" msgid "" "You're receiving this e-mail because user %(user_display)s has given your e-" "mail address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "Здраво из %(site_name)s!\n" "\n" "Примате овај е-маил пошто је корисник %(user_display)s дао вашутвојадресу за " "повезиванје са њиховим налогаом.\n" "\n" "Да бисте потврдили ово, идите на %(activate_url)s\n" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your E-mail Address" msgstr "Молим вас потврдите вашу адресу е-поште" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this e-mail because you or someone else has requested a " "password for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Здраво од %(site_name)s!\n" "\n" "Примате ову е-маил поруку јер сте ви или неко други тражилилозинку за ваш " "кориснички налог.\n" "Ова порука се може игнорисати ако нисте затражили ресет лозинке. Кликните на " "линк испод да бисте поништили своју лозинку." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "У случају да сте заборавили, ваше корисничко име је %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 msgid "Password Reset E-mail" msgstr "Поништавање лозинке е-поштом" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm E-mail Address" msgstr "Потврда адресе е-поште" #: templates/account/email_confirm.html:16 #, python-format msgid "" "Please confirm that %(email)s is an e-mail " "address for user %(user_display)s." msgstr "" "Молимо потврдите да је %(email)s је адреса " "е-поште за корисника %(user_display)s." #: templates/account/email_confirm.html:20 msgid "Confirm" msgstr "Потврди" #: templates/account/email_confirm.html:27 #, python-format msgid "" "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgstr "" "Овај линк за потврду е-поште је истекао или је неважећи. Молимо вас да затражите нови захтев за потврду е-поште ." #: templates/account/login.html:6 templates/account/login.html:10 #: templates/account/login.html:43 msgid "Sign In" msgstr "Пријавите се" #: templates/account/login.html:15 #, python-format msgid "" "Please sign in with one\n" "of your existing third party accounts. Or, sign " "up\n" "for a %(site_name)s account and sign in below:" msgstr "" "Молимо Вас да се пријавите са једним од\n" "постојећих рачуна трећих страна. Или, се региструјте\n" "за рачун код %(site_name)s и пријавите се доле:" #: templates/account/login.html:25 msgid "or" msgstr "или" #: templates/account/login.html:32 #, python-format msgid "" "If you have not created an account yet, then please\n" "sign up first." msgstr "" "Ако још нисте створили рачун, онда се прво региструјте." #: templates/account/login.html:42 templates/account/password_change.html:14 msgid "Forgot Password?" msgstr "Заборавили сте лозинку?" #: templates/account/logout.html:5 templates/account/logout.html:8 #: templates/account/logout.html:17 msgid "Sign Out" msgstr "Одјава" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Јесте ли сигурни да желите да се одјавите?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary e-mail address (%(email)s)." msgstr "Не можете да уклоните примарну адресу е-поште (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation e-mail sent to %(email)s." msgstr "Потврдна порука је послата на адресу е-поште %(email)s." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "Потврдили сте %(email)s." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed e-mail address %(email)s." msgstr "Уклоњена адреса e-поште %(email)s." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Успешно сте се пријавили као %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Одјавили сте се." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Лозинка је успешно промењена." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Успешно сте поставили лозинку." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary e-mail address set." msgstr "Примарна адреса е-поште постављена." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary e-mail address must be verified." msgstr "Ваша примарна адреса е-поште мора бити потврђена." #: templates/account/password_change.html:5 #: templates/account/password_change.html:8 #: templates/account/password_change.html:13 #: templates/account/password_reset_from_key.html:4 #: templates/account/password_reset_from_key.html:7 #: templates/account/password_reset_from_key_done.html:4 #: templates/account/password_reset_from_key_done.html:7 msgid "Change Password" msgstr "Промени лозинку" #: templates/account/password_reset.html:6 #: templates/account/password_reset.html:10 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:9 msgid "Password Reset" msgstr "Поништаванје лозинке" #: templates/account/password_reset.html:15 msgid "" "Forgotten your password? Enter your e-mail address below, and we'll send you " "an e-mail allowing you to reset it." msgstr "" "Заборавили сте лозинку? Унесите своју адресу е-поште испод, и послат ћемо " "ваме-пошту који вам омогућава да је поништите." #: templates/account/password_reset.html:20 msgid "Reset My Password" msgstr "Поништи моју лозинку" #: templates/account/password_reset.html:23 msgid "Please contact us if you have any trouble resetting your password." msgstr "" "Молимо вас да нас контактирате ако имате проблема са поништавањем ваше " "лозинке." #: templates/account/password_reset_done.html:15 msgid "" "We have sent you an e-mail. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Послали смо вам е-пошту. Молимо Вас да нас контактирате ако га не примитеза " "неколико минута." #: templates/account/password_reset_from_key.html:7 msgid "Bad Token" msgstr "Лош токен" #: templates/account/password_reset_from_key.html:11 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Веза за поништавање лозинке је неважећа, вероватно зато што је већ " "билаискоришћена. Молимо Вас да затражите ново поништаванје лозинке." #: templates/account/password_reset_from_key.html:17 msgid "change password" msgstr "промени лозинку" #: templates/account/password_reset_from_key.html:20 #: templates/account/password_reset_from_key_done.html:8 msgid "Your password is now changed." msgstr "Ваша лозинка је сада промењена." #: templates/account/password_set.html:5 templates/account/password_set.html:8 #: templates/account/password_set.html:13 msgid "Set Password" msgstr "Постави лозинку" #: templates/account/signup.html:5 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Регистрација" #: templates/account/signup.html:8 templates/account/signup.html:18 #: templates/socialaccount/signup.html:8 templates/socialaccount/signup.html:19 msgid "Sign Up" msgstr "Региструјте се" #: templates/account/signup.html:10 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "" "Већ имате налог? Онда Вас молимо да се пројавите." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:8 msgid "Sign Up Closed" msgstr "Регистрација затворена" #: templates/account/signup_closed.html:10 msgid "We are sorry, but the sign up is currently closed." msgstr "Жао нам је, али регистрација је тренутно затворена." #: templates/account/snippets/already_logged_in.html:5 msgid "Note" msgstr "Напомена" #: templates/account/snippets/already_logged_in.html:5 #, python-format msgid "you are already logged in as %(user_display)s." msgstr "Ви сте већ пријављени као %(user_display)s." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:8 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:8 msgid "Verify Your E-mail Address" msgstr "Потврдите Вашу адресу е-поште" #: templates/account/verification_sent.html:10 msgid "" "We have sent an e-mail to you for verification. Follow the link provided to " "finalize the signup process. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Послали смо вам поруку е-поштом за верификацију. Пратите дату везу који сте " "могли да завршите процес регистрације. Молимо вас да нас контактирате ако га " "не примитеза неколико минута." #: templates/account/verified_email_required.html:12 msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your e-mail address. " msgstr "" "Овај део сајта захтева од Вас да потврдите да\n" "сте Ви заиста за особа која тврдите да сте. У ову сврху захтевамо да\n" "потврдите власништво над вашом адресом е-поште." #: templates/account/verified_email_required.html:16 msgid "" "We have sent an e-mail to you for\n" "verification. Please click on the link inside this e-mail. Please\n" "contact us if you do not receive it within a few minutes." msgstr "" "Послали смо вам поруку е-поштом за\n" "верификацију. Кликните на везу унутар ове е-поруке.\n" "Контактирајте нас ако не примите е-поруку у року од неколико минута." #: templates/account/verified_email_required.html:20 #, python-format msgid "" "Note: you can still change your e-" "mail address." msgstr "" "Напомена: и даље можете да " "промените адресу Вашее-поште." #: templates/openid/login.html:9 msgid "OpenID Sign In" msgstr "ОпенИД Пријава" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:8 msgid "Social Network Login Failure" msgstr "Друштвене мрежа пријава неуспешна" #: templates/socialaccount/authentication_error.html:10 msgid "" "An error occurred while attempting to login via your social network account." msgstr "" "Дошло је до грешке приликом покушаја пријављивања преко налога ваше " "друштвене мреже." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:8 msgid "Account Connections" msgstr "Повезани рачуни" #: templates/socialaccount/connections.html:11 msgid "" "You can sign in to your account using any of the following third party " "accounts:" msgstr "" "Можете се пријавити на свој рачун помоћу било које од следећих рачуна " "трећихстрана:" #: templates/socialaccount/connections.html:43 msgid "" "You currently have no social network accounts connected to this account." msgstr "" "Тренутно немате ниједан рачун друштевених мрежа повезане са овим рачуном." #: templates/socialaccount/connections.html:46 msgid "Add a 3rd Party Account" msgstr "Додајте рачун треће стране" #: templates/socialaccount/login.html:6 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:8 #, python-format msgid "You are about to connect a new third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:10 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:12 #, python-format msgid "You are about to sign in using a third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Пријава је отказана" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Одлучили сте да откажете пријављивање на нашу веб страницу помоћу једног од " "ваших постојећихрачуна. Ако је ово грешка, молимо вас да пређете на и прјавите се." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "Друштвени рачун је повезан." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "Друштвени рачун је већ повезан са другим налогом." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Друштвени рачун више није повезан." #: templates/socialaccount/signup.html:10 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Управо користите свој рачун код %(provider_name)s да бисте се пријавили на\n" "%(site_name)s. Као последњи корак, молимо попуните следећи образац:" #~ msgid "Account" #~ msgstr "Рачун" django-allauth-0.47.0/allauth/locale/sr_Latn/000077500000000000000000000000001415442050100207635ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/sr_Latn/LC_MESSAGES/000077500000000000000000000000001415442050100225505ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/sr_Latn/LC_MESSAGES/django.po000066400000000000000000000623401415442050100243570ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Nikola Vulovic , 2018. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-12-09 08:41-0600\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Nikola Vulovic \n" "Language-Team: NONE\n" "Language: sr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: account/adapter.py:45 msgid "Username can not be used. Please use other username." msgstr "" "Korisničko ime se ne može koristiti. Molimo koristite drugo korisničko ime." #: account/adapter.py:51 msgid "Too many failed login attempts. Try again later." msgstr "Previše neuspelih pokušaja prijavljivanja. Pokušajte ponovo kasnije." #: account/adapter.py:53 msgid "A user is already registered with this e-mail address." msgstr "Korisnik je već registrovan na ovoj adresi e-pošte." #: account/adapter.py:300 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Lozinka mora biti najmanje {0} znakova." #: account/apps.py:7 msgid "Accounts" msgstr "Računi" #: account/forms.py:59 account/forms.py:413 msgid "You must type the same password each time." msgstr "Morate unijeti istu lozinku svaki put" #: account/forms.py:92 account/forms.py:381 account/forms.py:498 msgid "Password" msgstr "Lozinka" #: account/forms.py:93 msgid "Remember Me" msgstr "Seti me se" #: account/forms.py:97 msgid "This account is currently inactive." msgstr "Ovaj nalog je trenutno neaktivan." #: account/forms.py:99 msgid "The e-mail address and/or password you specified are not correct." msgstr "Adresa e-pošte i/ili lozinka koju ste naveli nisu tačni." #: account/forms.py:102 msgid "The username and/or password you specified are not correct." msgstr "Korisničko ime i/ili lozinka koju ste naveli nisu tačni." #: account/forms.py:113 account/forms.py:279 account/forms.py:439 #: account/forms.py:517 msgid "E-mail address" msgstr "Adresa e-pošte" #: account/forms.py:117 account/forms.py:316 account/forms.py:436 #: account/forms.py:512 msgid "E-mail" msgstr "E-pošta" #: account/forms.py:120 account/forms.py:123 account/forms.py:269 #: account/forms.py:272 msgid "Username" msgstr "Korisničko ime" #: account/forms.py:133 msgid "Username or e-mail" msgstr "Korisničko ime ili e-pošta" #: account/forms.py:136 msgctxt "field label" msgid "Login" msgstr "Prijavite se" #: account/forms.py:307 msgid "E-mail (again)" msgstr "E-pošta (opet)" #: account/forms.py:311 msgid "E-mail address confirmation" msgstr "Potvrda adrese e-pošte" #: account/forms.py:319 msgid "E-mail (optional)" msgstr "E-pošta (opciono)" #: account/forms.py:359 msgid "You must type the same email each time." msgstr "Morate unijeti istu adresu e-pošte svaki put." #: account/forms.py:384 account/forms.py:499 msgid "Password (again)" msgstr "Lozinka (ponovo)" #: account/forms.py:448 msgid "This e-mail address is already associated with this account." msgstr "Ova adresa e-pošte je već povezana sa ovim nalogom." #: account/forms.py:451 msgid "This e-mail address is already associated with another account." msgstr "Ova adresa e-pošte je već povezana sa drugim nalogom." #: account/forms.py:453 #, fuzzy, python-format #| msgid "Your account has no verified e-mail address." msgid "You cannot add more than %d e-mail addresses." msgstr "Vaš nalog nema potvrđenu e-mail adresu." #: account/forms.py:478 msgid "Current Password" msgstr "Trenutna lozinka" #: account/forms.py:480 account/forms.py:570 msgid "New Password" msgstr "Nova lozinka" #: account/forms.py:481 account/forms.py:571 msgid "New Password (again)" msgstr "Nova lozinka (ponovo)" #: account/forms.py:489 msgid "Please type your current password." msgstr "Molimo unesite trenutnu lozinku." #: account/forms.py:529 msgid "The e-mail address is not assigned to any user account" msgstr "Adresa e-pošte nije dodeljena bilo kom korisničkom nalogu" #: account/forms.py:592 msgid "The password reset token was invalid." msgstr "Token resetovanja lozinke je nevažeći." #: account/models.py:22 msgid "user" msgstr "korisnik" #: account/models.py:28 account/models.py:83 msgid "e-mail address" msgstr "adresa e-pošte" #: account/models.py:30 msgid "verified" msgstr "provereno" #: account/models.py:31 msgid "primary" msgstr "primarna" #: account/models.py:36 msgid "email address" msgstr "adresa e-pošte" #: account/models.py:37 msgid "email addresses" msgstr "adrese e-pošte" #: account/models.py:86 msgid "created" msgstr "stvoreno" #: account/models.py:87 msgid "sent" msgstr "poslat" #: account/models.py:88 socialaccount/models.py:58 msgid "key" msgstr "ključ" #: account/models.py:93 msgid "email confirmation" msgstr "potvrda e-pošte" #: account/models.py:94 msgid "email confirmations" msgstr "potvrde e-pošte" #: socialaccount/adapter.py:26 #, python-format msgid "" "An account already exists with this e-mail address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Račun postoji već sa ovom adresom e-pošte. Prijavite se na toprvi nalog, " "zatim povežite svoj %s nalog." #: socialaccount/adapter.py:131 msgid "Your account has no password set up." msgstr "Vaš nalog nema podešenu lozinku." #: socialaccount/adapter.py:138 msgid "Your account has no verified e-mail address." msgstr "Vaš nalog nema potvrđenu e-mail adresu." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Društveni računi" #: socialaccount/models.py:41 socialaccount/models.py:84 msgid "provider" msgstr "provider" #: socialaccount/models.py:45 msgid "name" msgstr "ime" #: socialaccount/models.py:47 msgid "client id" msgstr "ID klijenta" #: socialaccount/models.py:49 msgid "App ID, or consumer key" msgstr "ID aplikacije ili potrošački ključ" #: socialaccount/models.py:52 msgid "secret key" msgstr "tajni ključ" #: socialaccount/models.py:55 msgid "API secret, client secret, or consumer secret" msgstr "Tajna API-ja, tajna klijenta ili tajna potrošača" #: socialaccount/models.py:58 msgid "Key" msgstr "Ključ" #: socialaccount/models.py:74 msgid "social application" msgstr "društvena aplikacija" #: socialaccount/models.py:75 msgid "social applications" msgstr "društvena aplikacije" #: socialaccount/models.py:105 msgid "uid" msgstr "uid" #: socialaccount/models.py:107 msgid "last login" msgstr "Poslednje prijavljivanje" #: socialaccount/models.py:108 msgid "date joined" msgstr "Datum pridružio" #: socialaccount/models.py:109 msgid "extra data" msgstr "dodatni podaci" #: socialaccount/models.py:113 msgid "social account" msgstr "društveni račun" #: socialaccount/models.py:114 msgid "social accounts" msgstr "društveni računi" #: socialaccount/models.py:139 msgid "token" msgstr "token" #: socialaccount/models.py:140 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "\"oauth_token\" (OAuth1) ili token pristupa (OAuth2)" #: socialaccount/models.py:144 msgid "token secret" msgstr "token tajna" #: socialaccount/models.py:145 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "\"oauth_token_secret\" (OAuth1) ili osveženi token (OAuth2)" #: socialaccount/models.py:148 msgid "expires at" msgstr "ističe u" #: socialaccount/models.py:153 msgid "social application token" msgstr "Token društvenih aplikacija" #: socialaccount/models.py:154 msgid "social application tokens" msgstr "tokeni društvenih aplikacija" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "Neveljavni podaci o profilu" #: socialaccount/providers/oauth/client.py:85 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Nevažeći odgovor pri dobijanju tokena za zahtev od \"%s\"." #: socialaccount/providers/oauth/client.py:117 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Nevažeći odgovor pri dobijanju tokena za pristup od \"%s\"." #: socialaccount/providers/oauth/client.py:138 #, python-format msgid "No request token saved for \"%s\"." msgstr "nema sačuvanih tokena za zahtev od \"%s\"." #: socialaccount/providers/oauth/client.py:189 #, python-format msgid "No access token saved for \"%s\"." msgstr "nema sačuvanih tokena za pristup od \"%s\"." #: socialaccount/providers/oauth/client.py:210 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Nema pristupa privatnim resursima u \"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:8 msgid "Account Inactive" msgstr "Račun neaktivan" #: templates/account/account_inactive.html:10 msgid "This account is inactive." msgstr "Ovaj nalog je neaktivan." #: templates/account/email.html:5 templates/account/email.html:8 msgid "E-mail Addresses" msgstr "Adrese e-pošte" #: templates/account/email.html:10 msgid "The following e-mail addresses are associated with your account:" msgstr "S vašim nalogom su povezane sledeće adrese e-pošti:" #: templates/account/email.html:24 msgid "Verified" msgstr "Potvrđeno" #: templates/account/email.html:26 msgid "Unverified" msgstr "Nepotvrđeni" #: templates/account/email.html:28 msgid "Primary" msgstr "Primarni" #: templates/account/email.html:34 msgid "Make Primary" msgstr "Postavi za Primarni" #: templates/account/email.html:35 msgid "Re-send Verification" msgstr "Ponovno pošalji verifikaciju" #: templates/account/email.html:36 templates/socialaccount/connections.html:35 msgid "Remove" msgstr "Ukloni" #: templates/account/email.html:43 msgid "Warning:" msgstr "Upozorenje:" #: templates/account/email.html:43 msgid "" "You currently do not have any e-mail address set up. You should really add " "an e-mail address so you can receive notifications, reset your password, etc." msgstr "" "Trenutno nemate nikakvu adresu e-pošte. Trebali biste stvarno dodatiadresu e-" "pošte kako biste mogli primati obaveštenja, resetovati lozinku itd." #: templates/account/email.html:48 msgid "Add E-mail Address" msgstr "Dodaj adresu e-pošte" #: templates/account/email.html:53 msgid "Add E-mail" msgstr "Dodaj e-poštu" #: templates/account/email.html:63 msgid "Do you really want to remove the selected e-mail address?" msgstr "Da li stvarno želite da uklonite izabranu adresu e-pošte?" #: templates/account/email/base_message.txt:1 #, fuzzy, python-format #| msgid "" #| "Thank you from %(site_name)s!\n" #| "%(site_domain)s" msgid "Hello from %(site_name)s!" msgstr "" "Hvala od %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "Hvala vam što koristite %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because user %(user_display)s has given " #| "yours as an e-mail address to connect their account.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s\n" msgid "" "You're receiving this e-mail because user %(user_display)s has given your e-" "mail address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "Zdravo iz %(site_name)s!\n" "\n" "Primate ovaj e-mail pošto je korisnik %(user_display)s dao vašutvojadresu za " "povezivanje sa njihovim nalogaom.\n" "\n" "Da biste potvrdili ovo, idite na %(activate_url)s\n" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your E-mail Address" msgstr "Molim vas potvrdite vašu adresu e-pošte" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this e-mail because you or someone else has requested a " "password for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Zdravo od %(site_name)s!\n" "\n" "Primate ovu e-mail poruku jer ste vi ili neko drugi tražililozinku za vaš " "korisnički nalog.\n" "Ova poruka se može ignorisati ako niste zatražili reset lozinke. Kliknite na " "link ispod da biste poništili svoju lozinku." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "U slučaju da ste zaboravili, vaše korisničko ime je %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 msgid "Password Reset E-mail" msgstr "Poništavanje lozinke e-poštom" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm E-mail Address" msgstr "Potvrda adrese e-pošte" #: templates/account/email_confirm.html:16 #, python-format msgid "" "Please confirm that %(email)s is an e-mail " "address for user %(user_display)s." msgstr "" "Molimo potvrdite da je %(email)s je adresa " "e-pošte za korisnika %(user_display)s." #: templates/account/email_confirm.html:20 msgid "Confirm" msgstr "Potvrdi" #: templates/account/email_confirm.html:27 #, python-format msgid "" "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgstr "" "Ovaj link za potvrdu e-pošte je istekao ili je nevažeći. Molimo vas da zatražite novi zahtev za potvrdu e-pošte ." #: templates/account/login.html:6 templates/account/login.html:10 #: templates/account/login.html:43 msgid "Sign In" msgstr "Prijavite se" #: templates/account/login.html:15 #, python-format msgid "" "Please sign in with one\n" "of your existing third party accounts. Or, sign " "up\n" "for a %(site_name)s account and sign in below:" msgstr "" "Molimo Vas da se prijavite sa jednim od\n" "postojećih računa trećih strana. Ili, se registrujte\n" "za račun kod %(site_name)s i prijavite se dole:" #: templates/account/login.html:25 msgid "or" msgstr "ili" #: templates/account/login.html:32 #, python-format msgid "" "If you have not created an account yet, then please\n" "sign up first." msgstr "" "Ako još niste stvorili račun, onda se prvo registrujte." #: templates/account/login.html:42 templates/account/password_change.html:14 msgid "Forgot Password?" msgstr "Zaboravili ste lozinku?" #: templates/account/logout.html:5 templates/account/logout.html:8 #: templates/account/logout.html:17 msgid "Sign Out" msgstr "Odjava" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Jeste li sigurni da želite da se odjavite?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary e-mail address (%(email)s)." msgstr "Ne možete da uklonite primarnu adresu e-pošte (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation e-mail sent to %(email)s." msgstr "Potvrdna poruka je poslata na adresu e-pošte %(email)s." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "Potvrdili ste %(email)s." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed e-mail address %(email)s." msgstr "Uklonjena adresa e-pošte %(email)s." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Uspešno ste se prijavili kao %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Odjavili ste se." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Lozinka je uspešno promenjena." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Uspešno ste postavili lozinku." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary e-mail address set." msgstr "Primarna adresa e-pošte postavljena." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary e-mail address must be verified." msgstr "Vaša primarna adresa e-pošte mora biti potvrđena." #: templates/account/password_change.html:5 #: templates/account/password_change.html:8 #: templates/account/password_change.html:13 #: templates/account/password_reset_from_key.html:4 #: templates/account/password_reset_from_key.html:7 #: templates/account/password_reset_from_key_done.html:4 #: templates/account/password_reset_from_key_done.html:7 msgid "Change Password" msgstr "Promeni lozinku" #: templates/account/password_reset.html:6 #: templates/account/password_reset.html:10 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:9 msgid "Password Reset" msgstr "Poništavanje lozinke" #: templates/account/password_reset.html:15 msgid "" "Forgotten your password? Enter your e-mail address below, and we'll send you " "an e-mail allowing you to reset it." msgstr "" "Zaboravili ste lozinku? Unesite svoju adresu e-pošte ispod, i poslat ćemo " "vame-poštu koji vam omogućava da je poništite." #: templates/account/password_reset.html:20 msgid "Reset My Password" msgstr "Poništi moju lozinku" #: templates/account/password_reset.html:23 msgid "Please contact us if you have any trouble resetting your password." msgstr "" "Molimo vas da nas kontaktirate ako imate problema sa poništavanjem vaše " "lozinke." #: templates/account/password_reset_done.html:15 msgid "" "We have sent you an e-mail. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Poslali smo vam e-poštu. Molimo Vas da nas kontaktirate ako ga ne primiteza " "nekoliko minuta." #: templates/account/password_reset_from_key.html:7 msgid "Bad Token" msgstr "Loš token" #: templates/account/password_reset_from_key.html:11 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Veza za poništavanje lozinke je nevažeća, verovatno zato što je već " "bilaiskorišćena. Molimo Vas da zatražite novo poništavanje lozinke." #: templates/account/password_reset_from_key.html:17 msgid "change password" msgstr "promeni lozinku" #: templates/account/password_reset_from_key.html:20 #: templates/account/password_reset_from_key_done.html:8 msgid "Your password is now changed." msgstr "Vaša lozinka je sada promenjena." #: templates/account/password_set.html:5 templates/account/password_set.html:8 #: templates/account/password_set.html:13 msgid "Set Password" msgstr "Postavi lozinku" #: templates/account/signup.html:5 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Registracija" #: templates/account/signup.html:8 templates/account/signup.html:18 #: templates/socialaccount/signup.html:8 templates/socialaccount/signup.html:19 msgid "Sign Up" msgstr "Registrujte se" #: templates/account/signup.html:10 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "" "Već imate nalog? Onda Vas molimo da se projavite." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:8 msgid "Sign Up Closed" msgstr "Registracija zatvorena" #: templates/account/signup_closed.html:10 msgid "We are sorry, but the sign up is currently closed." msgstr "Žao nam je, ali registracija je trenutno zatvorena." #: templates/account/snippets/already_logged_in.html:5 msgid "Note" msgstr "Napomena" #: templates/account/snippets/already_logged_in.html:5 #, python-format msgid "you are already logged in as %(user_display)s." msgstr "Vi ste već prijavljeni kao %(user_display)s." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:8 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:8 msgid "Verify Your E-mail Address" msgstr "Potvrdite Vašu adresu e-pošte" #: templates/account/verification_sent.html:10 msgid "" "We have sent an e-mail to you for verification. Follow the link provided to " "finalize the signup process. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Poslali smo vam poruku e-poštom za verifikaciju. Pratite datu vezu koji ste " "mogli da završite proces registracije. Molimo vas da nas kontaktirate ako ga " "ne primiteza nekoliko minuta." #: templates/account/verified_email_required.html:12 msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your e-mail address. " msgstr "" "Ovaj deo sajta zahteva od Vas da potvrdite da\n" "ste Vi zaista za osoba koja tvrdite da ste. U ovu svrhu zahtevamo da\n" "potvrdite vlasništvo nad vašom adresom e-pošte." #: templates/account/verified_email_required.html:16 msgid "" "We have sent an e-mail to you for\n" "verification. Please click on the link inside this e-mail. Please\n" "contact us if you do not receive it within a few minutes." msgstr "" "Poslali smo vam poruku e-poštom za\n" "verifikaciju. Kliknite na vezu unutar ove e-poruke.\n" "Kontaktirajte nas ako ne primite e-poruku u roku od nekoliko minuta." #: templates/account/verified_email_required.html:20 #, python-format msgid "" "Note: you can still change your e-" "mail address." msgstr "" "Napomena: i dalje možete da " "promenite adresu Vašee-pošte." #: templates/openid/login.html:9 msgid "OpenID Sign In" msgstr "OpenID Prijava" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:8 msgid "Social Network Login Failure" msgstr "Društvene mreža prijava neuspešna" #: templates/socialaccount/authentication_error.html:10 msgid "" "An error occurred while attempting to login via your social network account." msgstr "" "Došlo je do greške prilikom pokušaja prijavljivanja preko naloga vaše " "društvene mreže." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:8 msgid "Account Connections" msgstr "Povezani računi" #: templates/socialaccount/connections.html:11 msgid "" "You can sign in to your account using any of the following third party " "accounts:" msgstr "" "Možete se prijaviti na svoj račun pomoću bilo koje od sledećih računa " "trećihstrana:" #: templates/socialaccount/connections.html:43 msgid "" "You currently have no social network accounts connected to this account." msgstr "" "Trenutno nemate nijedan račun društevenih mreža povezane sa ovim računom." #: templates/socialaccount/connections.html:46 msgid "Add a 3rd Party Account" msgstr "Dodajte račun treće strane" #: templates/socialaccount/login.html:6 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:8 #, python-format msgid "You are about to connect a new third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:10 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:12 #, python-format msgid "You are about to sign in using a third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Prijava je otkazana" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Odlučili ste da otkažete prijavljivanje na našu veb stranicu pomoću jednog " "od vaših postojećihračuna. Ako je ovo greška, molimo vas da pređete na i prjavite se." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "Društveni račun je povezan." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "Društveni račun je već povezan sa drugim nalogom." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Društveni račun više nije povezan." #: templates/socialaccount/signup.html:10 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Upravo koristite svoj račun kod %(provider_name)s da biste se prijavili na\n" "%(site_name)s. Kao poslednji korak, molimo popunite sledeći obrazac:" #~ msgid "Account" #~ msgstr "Račun" django-allauth-0.47.0/allauth/locale/sv/000077500000000000000000000000001415442050100200115ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/sv/LC_MESSAGES/000077500000000000000000000000001415442050100215765ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/sv/LC_MESSAGES/django.po000066400000000000000000000625421415442050100234110ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: django-allauth\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-12-09 08:41-0600\n" "PO-Revision-Date: 2014-08-12 00:35+0200\n" "Last-Translator: Jannis Š\n" "Language-Team: Swedish (http://www.transifex.com/projects/p/django-allauth/" "language/sv/)\n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: account/adapter.py:45 msgid "Username can not be used. Please use other username." msgstr "Användarnamnet kan ej användas. Välj ett annat användarnamn." #: account/adapter.py:51 msgid "Too many failed login attempts. Try again later." msgstr "" #: account/adapter.py:53 msgid "A user is already registered with this e-mail address." msgstr "En användare är redan registrerad med den här epost-adressen" #: account/adapter.py:300 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Lösenordet måste vara minst {0} tecken långt" #: account/apps.py:7 #, fuzzy msgid "Accounts" msgstr "Konto" #: account/forms.py:59 account/forms.py:413 msgid "You must type the same password each time." msgstr "Du måste ange samma lösenord" #: account/forms.py:92 account/forms.py:381 account/forms.py:498 msgid "Password" msgstr "Lösenord" #: account/forms.py:93 msgid "Remember Me" msgstr "Kom ihåg mig" #: account/forms.py:97 msgid "This account is currently inactive." msgstr "Detta konto är inaktivt." #: account/forms.py:99 msgid "The e-mail address and/or password you specified are not correct." msgstr "Epost-adressen och/eller lösenordet är felaktigt." #: account/forms.py:102 msgid "The username and/or password you specified are not correct." msgstr "Användarnamnet och/eller lösenordet är felaktigt." #: account/forms.py:113 account/forms.py:279 account/forms.py:439 #: account/forms.py:517 msgid "E-mail address" msgstr "Epost-adress" #: account/forms.py:117 account/forms.py:316 account/forms.py:436 #: account/forms.py:512 msgid "E-mail" msgstr "Epost" #: account/forms.py:120 account/forms.py:123 account/forms.py:269 #: account/forms.py:272 msgid "Username" msgstr "Användarnamn" #: account/forms.py:133 msgid "Username or e-mail" msgstr "Användarnamn eller epost-adress" #: account/forms.py:136 msgctxt "field label" msgid "Login" msgstr "Logga in" #: account/forms.py:307 #, fuzzy #| msgid "E-mail (optional)" msgid "E-mail (again)" msgstr "Epost (valfritt)" #: account/forms.py:311 #, fuzzy #| msgid "email confirmation" msgid "E-mail address confirmation" msgstr "epost-bekräftelse" #: account/forms.py:319 msgid "E-mail (optional)" msgstr "Epost (valfritt)" #: account/forms.py:359 #, fuzzy #| msgid "You must type the same password each time." msgid "You must type the same email each time." msgstr "Du måste ange samma lösenord" #: account/forms.py:384 account/forms.py:499 msgid "Password (again)" msgstr "Lösenord (igen)" #: account/forms.py:448 msgid "This e-mail address is already associated with this account." msgstr "Denna epost-adress är redan knuten till detta konto" #: account/forms.py:451 msgid "This e-mail address is already associated with another account." msgstr "Denna epost-adress är redan knuten till ett annat konto" #: account/forms.py:453 #, fuzzy, python-format #| msgid "Your account has no verified e-mail address." msgid "You cannot add more than %d e-mail addresses." msgstr "Ditt konto har ingen verifierad epost-adress." #: account/forms.py:478 msgid "Current Password" msgstr "Nuvarande lösenord" #: account/forms.py:480 account/forms.py:570 msgid "New Password" msgstr "Nytt lösenord" #: account/forms.py:481 account/forms.py:571 msgid "New Password (again)" msgstr "Nytt lösenord (igen)" #: account/forms.py:489 msgid "Please type your current password." msgstr "Skriv in ditt nuvarande lösenord." #: account/forms.py:529 msgid "The e-mail address is not assigned to any user account" msgstr "Epost-adressen är inte knuten till något konto" #: account/forms.py:592 msgid "The password reset token was invalid." msgstr "" #: account/models.py:22 msgid "user" msgstr "" #: account/models.py:28 account/models.py:83 #, fuzzy msgid "e-mail address" msgstr "epost-adress" #: account/models.py:30 #, fuzzy msgid "verified" msgstr "Ej verifierad" #: account/models.py:31 #, fuzzy msgid "primary" msgstr "Primär" #: account/models.py:36 msgid "email address" msgstr "epost-adress" #: account/models.py:37 msgid "email addresses" msgstr "epost-adresser" #: account/models.py:86 msgid "created" msgstr "" #: account/models.py:87 msgid "sent" msgstr "" #: account/models.py:88 socialaccount/models.py:58 msgid "key" msgstr "" #: account/models.py:93 msgid "email confirmation" msgstr "epost-bekräftelse" #: account/models.py:94 msgid "email confirmations" msgstr "epost-bekräftelser" #: socialaccount/adapter.py:26 #, python-format msgid "" "An account already exists with this e-mail address. Please sign in to that " "account first, then connect your %s account." msgstr "" #: socialaccount/adapter.py:131 msgid "Your account has no password set up." msgstr "Ditt konto har inget lösenord." #: socialaccount/adapter.py:138 msgid "Your account has no verified e-mail address." msgstr "Ditt konto har ingen verifierad epost-adress." #: socialaccount/apps.py:7 #, fuzzy msgid "Social Accounts" msgstr "Konto" #: socialaccount/models.py:41 socialaccount/models.py:84 msgid "provider" msgstr "" #: socialaccount/models.py:45 #, fuzzy msgid "name" msgstr "Användarnamn" #: socialaccount/models.py:47 msgid "client id" msgstr "" #: socialaccount/models.py:49 msgid "App ID, or consumer key" msgstr "" #: socialaccount/models.py:52 msgid "secret key" msgstr "" #: socialaccount/models.py:55 msgid "API secret, client secret, or consumer secret" msgstr "" #: socialaccount/models.py:58 msgid "Key" msgstr "" #: socialaccount/models.py:74 msgid "social application" msgstr "" #: socialaccount/models.py:75 msgid "social applications" msgstr "" #: socialaccount/models.py:105 msgid "uid" msgstr "" #: socialaccount/models.py:107 msgid "last login" msgstr "" #: socialaccount/models.py:108 msgid "date joined" msgstr "" #: socialaccount/models.py:109 msgid "extra data" msgstr "" #: socialaccount/models.py:113 msgid "social account" msgstr "" #: socialaccount/models.py:114 msgid "social accounts" msgstr "" #: socialaccount/models.py:139 msgid "token" msgstr "" #: socialaccount/models.py:140 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "" #: socialaccount/models.py:144 msgid "token secret" msgstr "" #: socialaccount/models.py:145 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "" #: socialaccount/models.py:148 msgid "expires at" msgstr "" #: socialaccount/models.py:153 msgid "social application token" msgstr "" #: socialaccount/models.py:154 msgid "social application tokens" msgstr "" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "" #: socialaccount/providers/oauth/client.py:85 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Felaktigt svar vid hämtning av fråge-nyckel från \"%s\"." #: socialaccount/providers/oauth/client.py:117 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Felaktigt svar vid hämtning av access-nyckel från \"%s\"." #: socialaccount/providers/oauth/client.py:138 #, python-format msgid "No request token saved for \"%s\"." msgstr "Ingen fråge-nyckel sparad för \"%s\"." #: socialaccount/providers/oauth/client.py:189 #, python-format msgid "No access token saved for \"%s\"." msgstr "Ingen access-nyckel sparad för \"%s\"." #: socialaccount/providers/oauth/client.py:210 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Ingen access till privata resurser hos \"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:8 msgid "Account Inactive" msgstr "Kontot inaktivt" #: templates/account/account_inactive.html:10 msgid "This account is inactive." msgstr "Detta konto är inaktivt." #: templates/account/email.html:5 templates/account/email.html:8 msgid "E-mail Addresses" msgstr "Epost-adresser" #: templates/account/email.html:10 msgid "The following e-mail addresses are associated with your account:" msgstr "Följande epost-adresser är knutna till ditt konto:" #: templates/account/email.html:24 msgid "Verified" msgstr "Verifierad" #: templates/account/email.html:26 msgid "Unverified" msgstr "Ej verifierad" #: templates/account/email.html:28 msgid "Primary" msgstr "Primär" #: templates/account/email.html:34 msgid "Make Primary" msgstr "Gör primär" #: templates/account/email.html:35 msgid "Re-send Verification" msgstr "Sänd verifiering igen" #: templates/account/email.html:36 templates/socialaccount/connections.html:35 msgid "Remove" msgstr "Ta bort" #: templates/account/email.html:43 msgid "Warning:" msgstr "Varning:" #: templates/account/email.html:43 msgid "" "You currently do not have any e-mail address set up. You should really add " "an e-mail address so you can receive notifications, reset your password, etc." msgstr "" "Du har inte angett någon epost-adress. Du borde lägga till en epost-adress " "så du kan få meddelanden, återställa ditt lösenord och liknande." #: templates/account/email.html:48 msgid "Add E-mail Address" msgstr "Lägg till epost-adress" #: templates/account/email.html:53 msgid "Add E-mail" msgstr "Lägg till epost" #: templates/account/email.html:63 msgid "Do you really want to remove the selected e-mail address?" msgstr "Vill du verkligen ta bort den valda epost-adressen?" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "User %(user_display)s at %(site_name)s has given this as an email " #| "address.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s\n" msgid "" "You're receiving this e-mail because user %(user_display)s has given your e-" "mail address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "Användare %(user_display)s på %(site_name)s har angivit detta som sin epost-" "adress.\n" "\n" "Klicka på följande adress för att bekräfta att detta stämmer: " "%(activate_url)s\n" #: templates/account/email/email_confirmation_subject.txt:3 #, fuzzy #| msgid "Confirm E-mail Address" msgid "Please Confirm Your E-mail Address" msgstr "Verifiera epost-adress" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account at %(site_domain)s.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this e-mail because you or someone else has requested a " "password for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Du har fått detta mail för att du eller någon annan har begärt en " "återställning av ditt lösenord på %(site_domain)s.\n" "Du kan bortse från detta mail om du inte begärt en återställning. Klicka på " "länken nedan för att återställa ditt lösenord." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "Ditt användarnamn är %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 msgid "Password Reset E-mail" msgstr "Återställning av lösenord" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm E-mail Address" msgstr "Verifiera epost-adress" #: templates/account/email_confirm.html:16 #, python-format msgid "" "Please confirm that %(email)s is an e-mail " "address for user %(user_display)s." msgstr "" "Verifiera att %(email)s är en epost-adress " "för %(user_display)s." #: templates/account/email_confirm.html:20 msgid "Confirm" msgstr "Verifiera" #: templates/account/email_confirm.html:27 #, python-format msgid "" "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgstr "" "Länken för att verifiera epost-adressen har förfallit eller är ogiltig. Skapa en ny epost-verification." #: templates/account/login.html:6 templates/account/login.html:10 #: templates/account/login.html:43 msgid "Sign In" msgstr "Logga in" #: templates/account/login.html:15 #, fuzzy, python-format msgid "" "Please sign in with one\n" "of your existing third party accounts. Or, sign " "up\n" "for a %(site_name)s account and sign in below:" msgstr "" "Logga in med ett\n" "av dina befintliga tredjeparts-konton eller skapa " "ett konto \n" "för %(site_name)s och logga in nedan:" #: templates/account/login.html:25 msgid "or" msgstr "eller" #: templates/account/login.html:32 #, fuzzy, python-format msgid "" "If you have not created an account yet, then please\n" "sign up first." msgstr "" "Har du redan ett konto? Då kan du logga in." #: templates/account/login.html:42 templates/account/password_change.html:14 msgid "Forgot Password?" msgstr "Glömt lösenordet?" #: templates/account/logout.html:5 templates/account/logout.html:8 #: templates/account/logout.html:17 msgid "Sign Out" msgstr "Logga ut" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Är du säker att du vill logga ut?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary e-mail address (%(email)s)." msgstr "Du kan inte ta bort din primära epost-adress (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation e-mail sent to %(email)s." msgstr "Verifierings-mail skickat till %(email)s." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "Du har verifierat %(email)s." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed e-mail address %(email)s." msgstr "Ta bort epost-adress %(email)s." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Du har loggat in som %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Du har loggat ut." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Lösenordet ändrat." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Lösenord skapat." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary e-mail address set." msgstr "Primär epost-adress satt." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary e-mail address must be verified." msgstr "Din primära epost-adress måste verifieras." #: templates/account/password_change.html:5 #: templates/account/password_change.html:8 #: templates/account/password_change.html:13 #: templates/account/password_reset_from_key.html:4 #: templates/account/password_reset_from_key.html:7 #: templates/account/password_reset_from_key_done.html:4 #: templates/account/password_reset_from_key_done.html:7 msgid "Change Password" msgstr "Ändra lösenord" #: templates/account/password_reset.html:6 #: templates/account/password_reset.html:10 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:9 msgid "Password Reset" msgstr "Återställning av lösenord" #: templates/account/password_reset.html:15 msgid "" "Forgotten your password? Enter your e-mail address below, and we'll send you " "an e-mail allowing you to reset it." msgstr "" "Glömt ditt lösenord? Ange din epost-adress nedan så skickar vi ett mail med " "instruktioner för att återställa det." #: templates/account/password_reset.html:20 msgid "Reset My Password" msgstr "Återställ mitt lösenord" #: templates/account/password_reset.html:23 msgid "Please contact us if you have any trouble resetting your password." msgstr "" "Vänligen kontakta oss om du har problem med att återställa ditt lösenord." #: templates/account/password_reset_done.html:15 msgid "" "We have sent you an e-mail. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Ett mail har nu skickats. Kontakta oss om det inte dyker upp inom ett par " "minuter." #: templates/account/password_reset_from_key.html:7 msgid "Bad Token" msgstr "Felaktig nyckel" #: templates/account/password_reset_from_key.html:11 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Länken för att återställa lösenordet var ogiltig, möjligtvis för att den " "redan har använts. Begär en ny lösenords-" "återställning." #: templates/account/password_reset_from_key.html:17 msgid "change password" msgstr "ändra lösenord" #: templates/account/password_reset_from_key.html:20 #: templates/account/password_reset_from_key_done.html:8 msgid "Your password is now changed." msgstr "Ditt lösenord är nu ändrat." #: templates/account/password_set.html:5 templates/account/password_set.html:8 #: templates/account/password_set.html:13 msgid "Set Password" msgstr "Skapa lösenord" #: templates/account/signup.html:5 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Skapa konto" #: templates/account/signup.html:8 templates/account/signup.html:18 #: templates/socialaccount/signup.html:8 templates/socialaccount/signup.html:19 msgid "Sign Up" msgstr "Skapa konto" #: templates/account/signup.html:10 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "" "Har du redan ett konto? Då kan du logga in." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:8 msgid "Sign Up Closed" msgstr "Anmälan stängd" #: templates/account/signup_closed.html:10 msgid "We are sorry, but the sign up is currently closed." msgstr "Tyvärr är anmälan stängd för närvarande." #: templates/account/snippets/already_logged_in.html:5 msgid "Note" msgstr "Information" #: templates/account/snippets/already_logged_in.html:5 #, python-format msgid "you are already logged in as %(user_display)s." msgstr "du är inloggad som %(user_display)s." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:8 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:8 msgid "Verify Your E-mail Address" msgstr "Verifiera din epost-adress" #: templates/account/verification_sent.html:10 #, fuzzy msgid "" "We have sent an e-mail to you for verification. Follow the link provided to " "finalize the signup process. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Ett mail för verifiering har skickats till " "%(email)s. Klicka på länken i mailet för att slutföra anmälan. Kontakta " "oss om det inte dyker upp inom ett par minuter." #: templates/account/verified_email_required.html:12 msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your e-mail address. " msgstr "" "För att få tillgång till denna avdelning måste du verifiera att\n" "du är den du säger att du är. Du måste därför bevisa att du\n" "angett rätt epost-adress. " #: templates/account/verified_email_required.html:16 msgid "" "We have sent an e-mail to you for\n" "verification. Please click on the link inside this e-mail. Please\n" "contact us if you do not receive it within a few minutes." msgstr "" "Vi har skickat ett mail till dig för\n" "verifiering. Klicka på länken inne i detta mail. Kontakta\n" "oss om det inte dyker upp inom ett par minuter." #: templates/account/verified_email_required.html:20 #, python-format msgid "" "Note: you can still change your e-" "mail address." msgstr "" "Information: du kan fortfarande ändra din epost-adress." #: templates/openid/login.html:9 msgid "OpenID Sign In" msgstr "Inloggning via OpenID" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:8 msgid "Social Network Login Failure" msgstr "Fel vid tredjeparts-inloggning" #: templates/socialaccount/authentication_error.html:10 msgid "" "An error occurred while attempting to login via your social network account." msgstr "Ett fel inträffade vid inloggning via tredjeparts-konto." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:8 msgid "Account Connections" msgstr "Anslutna tredjeparts-konton" #: templates/socialaccount/connections.html:11 msgid "" "You can sign in to your account using any of the following third party " "accounts:" msgstr "" "Du kan logga in på ditt konto via något av följande tredjeparts-konton:" #: templates/socialaccount/connections.html:43 msgid "" "You currently have no social network accounts connected to this account." msgstr "Du har för närvarande inga tredjeparts-konton knutna till ditt konto." #: templates/socialaccount/connections.html:46 msgid "Add a 3rd Party Account" msgstr "Lägg till tredjeparts-konto" #: templates/socialaccount/login.html:6 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:8 #, python-format msgid "You are about to connect a new third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:10 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:12 #, python-format msgid "You are about to sign in using a third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Inloggning avbruten" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Du valde att avbryta inloggningen via ett av dina tredjeparts-konton. Om " "detta var ett misstag kan du logga in igen." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "Tredjeparts-kontot har knutits till ditt kontot." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "Tredjeparts-kontot är redan knutet till ett annat konto." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Tredjeparts-kontot har tagits bort." #: templates/socialaccount/signup.html:10 #, fuzzy, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Du håller på att logga in via ditt konto på %(provider_name)s på \n" "%(site_name)s. Fyll i följande formulär för att slutföra inloggningen:" #~ msgid "Account" #~ msgstr "Konto" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "Inloggningen och/eller lösenordet är felaktigt." #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "" #~ "Användarnamn kan endast innehålla bokstäver, siffror samt @/./+/-/_." #~ msgid "This username is already taken. Please choose another." #~ msgstr "Användarnamnet är upptaget. Välj ett annat." #, fuzzy #~| msgid "Sign In" #~ msgid "Shopify Sign In" #~ msgstr "Logga in" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "Du har verifierat att %(email)s är en " #~ "epost-adress för %(user_display)s." #~ msgid "Thanks for using our site!" #~ msgstr "Tack för att du använder vår hemsida!" #~ msgid "Confirmation e-mail sent to %(email)s" #~ msgstr "Epost-bekräftelse skickad till %(email)s" #~ msgid "Delete Password" #~ msgstr "Ta bort lösenordet" #~ msgid "" #~ "You may delete your password since you are currently logged in using " #~ "OpenID." #~ msgstr "Du kan ta bort ditt lösenord eftersom du är inloggad via OpenID." #~ msgid "delete my password" #~ msgstr "ta bort mitt lösenord" #~ msgid "Password Deleted" #~ msgstr "Lösenordet borttaget" #~ msgid "Your password has been deleted." #~ msgstr "Ditt lösenord har tagits bort." django-allauth-0.47.0/allauth/locale/th/000077500000000000000000000000001415442050100177745ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/th/LC_MESSAGES/000077500000000000000000000000001415442050100215615ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/th/LC_MESSAGES/django.po000066400000000000000000001012211415442050100233600ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Nattaphoom Chaipreecha, 2015 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: django-allauth\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-12-09 08:41-0600\n" "PO-Revision-Date: 2015-06-26 13:09+0700\n" "Last-Translator: Nattaphoom Chaipreecha \n" "Language-Team: Thai \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" #: account/adapter.py:45 msgid "Username can not be used. Please use other username." msgstr "ไม่สามารถใช้ชื่อผู้ใช้นี้ได้ กรุณาใช้ชื่อผู้ใช้อื่น" #: account/adapter.py:51 msgid "Too many failed login attempts. Try again later." msgstr "" #: account/adapter.py:53 msgid "A user is already registered with this e-mail address." msgstr "ชื่อผู้ใช้ได้ถูกลงทะเบียนด้วยอีเมลนี้แล้ว" #: account/adapter.py:300 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "รหัสผ่านต้องมีอย่างน้อย {0} ตัวอักษร" #: account/apps.py:7 msgid "Accounts" msgstr "บัญชี" #: account/forms.py:59 account/forms.py:413 msgid "You must type the same password each time." msgstr "ต้องพิมพ์รหัสผ่านเดิมซ้ำอีกครั้ง" #: account/forms.py:92 account/forms.py:381 account/forms.py:498 msgid "Password" msgstr "รหัสผ่าน" #: account/forms.py:93 msgid "Remember Me" msgstr "จดจำการเข้าใช้" #: account/forms.py:97 msgid "This account is currently inactive." msgstr "บัญชีนี้อยู่ในสถานะที่ใช้งานไม่ได้่" #: account/forms.py:99 msgid "The e-mail address and/or password you specified are not correct." msgstr "อีเมลและ/หรือรหัสผ่านที่ระบุมาไม่ถูกต้อง" #: account/forms.py:102 msgid "The username and/or password you specified are not correct." msgstr "ชื่อผู้ใช้และ/หรือรหัสผ่านที่ระบุมาไม่ถูกต้อง" #: account/forms.py:113 account/forms.py:279 account/forms.py:439 #: account/forms.py:517 msgid "E-mail address" msgstr "อีเมล" #: account/forms.py:117 account/forms.py:316 account/forms.py:436 #: account/forms.py:512 msgid "E-mail" msgstr "อีเมล" #: account/forms.py:120 account/forms.py:123 account/forms.py:269 #: account/forms.py:272 msgid "Username" msgstr "ชื่อผู้ใช้" #: account/forms.py:133 msgid "Username or e-mail" msgstr "ชื่อผู้ใช้ หรือ อีเมล" #: account/forms.py:136 msgctxt "field label" msgid "Login" msgstr "ลงชื่อเข้าใช้" #: account/forms.py:307 #, fuzzy #| msgid "E-mail (optional)" msgid "E-mail (again)" msgstr "อีเมล (ไม่จำเป็น)" #: account/forms.py:311 #, fuzzy #| msgid "email confirmation" msgid "E-mail address confirmation" msgstr "การยืนยันอีเมล" #: account/forms.py:319 msgid "E-mail (optional)" msgstr "อีเมล (ไม่จำเป็น)" #: account/forms.py:359 #, fuzzy #| msgid "You must type the same password each time." msgid "You must type the same email each time." msgstr "ต้องพิมพ์รหัสผ่านเดิมซ้ำอีกครั้ง" #: account/forms.py:384 account/forms.py:499 msgid "Password (again)" msgstr "รหัสผ่าน (อีกครั้ง)" #: account/forms.py:448 msgid "This e-mail address is already associated with this account." msgstr "อีเมลนี้ได้ถูกเชื่อมกับบัญชีนี้แล้ว" #: account/forms.py:451 msgid "This e-mail address is already associated with another account." msgstr "อีเมลนี้ได้ถูกเชื่อมกับบัญชีอื่นแล้ว" #: account/forms.py:453 #, fuzzy, python-format #| msgid "Your account has no verified e-mail address." msgid "You cannot add more than %d e-mail addresses." msgstr "บัญชีของคุณไม่มีอีเมลที่ยืนยันแล้ว" #: account/forms.py:478 msgid "Current Password" msgstr "รหัสผ่านปัจจุบัน" #: account/forms.py:480 account/forms.py:570 msgid "New Password" msgstr "รหัสผ่านใหม่" #: account/forms.py:481 account/forms.py:571 msgid "New Password (again)" msgstr "รหัสผ่านใหม่ (อีกครั้ง)" #: account/forms.py:489 msgid "Please type your current password." msgstr "โปรดใส่รหัสผ่านปัจจุบัน" #: account/forms.py:529 msgid "The e-mail address is not assigned to any user account" msgstr "อีเมลนี้ไม่ได้เชื่อมกับบัญชีใดเลย" #: account/forms.py:592 msgid "The password reset token was invalid." msgstr "token ที่ใช้รีเซ็ทรหัสผ่านไม่ถูกต้อง" #: account/models.py:22 msgid "user" msgstr "ผู้ใช้" #: account/models.py:28 account/models.py:83 msgid "e-mail address" msgstr "อีเมล" #: account/models.py:30 msgid "verified" msgstr "ยืนยันแล้ว" #: account/models.py:31 msgid "primary" msgstr "หลัก" #: account/models.py:36 msgid "email address" msgstr "อีเมล" #: account/models.py:37 msgid "email addresses" msgstr "อีเมล" #: account/models.py:86 msgid "created" msgstr "สร้างแล้ว" #: account/models.py:87 msgid "sent" msgstr "ส่งแล้ว" #: account/models.py:88 socialaccount/models.py:58 msgid "key" msgstr "คีย์" #: account/models.py:93 msgid "email confirmation" msgstr "การยืนยันอีเมล" #: account/models.py:94 msgid "email confirmations" msgstr "การยืนยันอีเมล" #: socialaccount/adapter.py:26 #, python-format msgid "" "An account already exists with this e-mail address. Please sign in to that " "account first, then connect your %s account." msgstr "มีบัญชีที่ใช้อีเมลนี้แล้ว โปรดลงชื่อเข้าใช้ก่อนแล้วค่อยเชื่อมต่อกับบัญชี %s ของคุณ" #: socialaccount/adapter.py:131 msgid "Your account has no password set up." msgstr "บัญชีของคุณไม่ได้ตั้งรหัสผ่านไว้" #: socialaccount/adapter.py:138 msgid "Your account has no verified e-mail address." msgstr "บัญชีของคุณไม่มีอีเมลที่ยืนยันแล้ว" #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "บัญชีโซเชียล" #: socialaccount/models.py:41 socialaccount/models.py:84 msgid "provider" msgstr "ผู้ให้บริการ" #: socialaccount/models.py:45 msgid "name" msgstr "ชื่อ" #: socialaccount/models.py:47 msgid "client id" msgstr "" #: socialaccount/models.py:49 msgid "App ID, or consumer key" msgstr "" #: socialaccount/models.py:52 msgid "secret key" msgstr "" #: socialaccount/models.py:55 msgid "API secret, client secret, or consumer secret" msgstr "" #: socialaccount/models.py:58 msgid "Key" msgstr "คีย์" #: socialaccount/models.py:74 msgid "social application" msgstr "" #: socialaccount/models.py:75 msgid "social applications" msgstr "" #: socialaccount/models.py:105 msgid "uid" msgstr "" #: socialaccount/models.py:107 msgid "last login" msgstr "" #: socialaccount/models.py:108 msgid "date joined" msgstr "" #: socialaccount/models.py:109 msgid "extra data" msgstr "" #: socialaccount/models.py:113 msgid "social account" msgstr "" #: socialaccount/models.py:114 msgid "social accounts" msgstr "" #: socialaccount/models.py:139 msgid "token" msgstr "token" #: socialaccount/models.py:140 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "" #: socialaccount/models.py:144 msgid "token secret" msgstr "" #: socialaccount/models.py:145 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "" #: socialaccount/models.py:148 msgid "expires at" msgstr "" #: socialaccount/models.py:153 msgid "social application token" msgstr "" #: socialaccount/models.py:154 msgid "social application tokens" msgstr "" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "" #: socialaccount/providers/oauth/client.py:85 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "การตอบสนองผิดพลาดขณะที่กำลังได้รับ request token จาก \"%s\"" #: socialaccount/providers/oauth/client.py:117 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "การตอบสนองผิดพลาดขณะที่กำลังได้รับ access token จาก \"%s\"" #: socialaccount/providers/oauth/client.py:138 #, python-format msgid "No request token saved for \"%s\"." msgstr "ไม่มีการบันทึก request token ของ \"%s\"" #: socialaccount/providers/oauth/client.py:189 #, python-format msgid "No access token saved for \"%s\"." msgstr "ไม่มีการบันทึก access token ของ \"%s\"" #: socialaccount/providers/oauth/client.py:210 #, python-format msgid "No access to private resources at \"%s\"." msgstr "ไม่มีสิทธิ์การเข้าใช้ทรัพยากรส่วนตัว ที่ \"%s\"" #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:8 msgid "Account Inactive" msgstr "บัญชีไม่มีการใช้งาน" #: templates/account/account_inactive.html:10 msgid "This account is inactive." msgstr "บัญชีนี้ไม่มีการใช้งาน" #: templates/account/email.html:5 templates/account/email.html:8 msgid "E-mail Addresses" msgstr "อีเมล" #: templates/account/email.html:10 msgid "The following e-mail addresses are associated with your account:" msgstr "อีเมลต่อไปนี้ได้เชื่อมกับบัญชีของคุณ" #: templates/account/email.html:24 msgid "Verified" msgstr "ยืนยันแล้ว" #: templates/account/email.html:26 msgid "Unverified" msgstr "ยังไม่ได้ยืนยัน" #: templates/account/email.html:28 msgid "Primary" msgstr "หลัก" #: templates/account/email.html:34 msgid "Make Primary" msgstr "ทำให้เป็นอันหลัก" #: templates/account/email.html:35 msgid "Re-send Verification" msgstr "ส่งการยืนยันอีกครั้ง" #: templates/account/email.html:36 templates/socialaccount/connections.html:35 msgid "Remove" msgstr "ลบ" #: templates/account/email.html:43 msgid "Warning:" msgstr "คำเตือน:" #: templates/account/email.html:43 msgid "" "You currently do not have any e-mail address set up. You should really add " "an e-mail address so you can receive notifications, reset your password, etc." msgstr "" "คุณยังไม่มีอีเมลในระบบ คุณควรเพิ่มอีเมลเพื่อที่จะสามารถรับ การแจ้งเตือน รีเซ็ทรหัสผ่าน และอื่นๆ" #: templates/account/email.html:48 msgid "Add E-mail Address" msgstr "เพิ่มอีเมล" #: templates/account/email.html:53 msgid "Add E-mail" msgstr "เพิ่มอีเมล" #: templates/account/email.html:63 msgid "Do you really want to remove the selected e-mail address?" msgstr "คุณต้องการที่จะลบอีเมลนี้จริงหรอ" #: templates/account/email/base_message.txt:1 #, fuzzy, python-format #| msgid "" #| "Thank you from %(site_name)s!\n" #| "%(site_domain)s" msgid "Hello from %(site_name)s!" msgstr "" "ขอบคุณจาก %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "ขอบคุณที่ใช้บริการของ %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because user %(user_display)s at " #| "%(site_domain)s has given yours as an e-mail address to connect their " #| "account.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s\n" msgid "" "You're receiving this e-mail because user %(user_display)s has given your e-" "mail address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "สวัสดีจาก %(site_name)s!\n" "\n" "คุณได้รับอีเมลนี้เพราะว่า ผู้ใช้ %(user_display)s จาก%(site_domain)s " "ได้ใช้อีเมลนี้ในการเชื่อมต่อกับบัญชี\n" "\n" "เพื่อยืนยันว่าการลงทะเบียนนี้ถูกต้อง ไปที่ %(activate_url)s\n" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your E-mail Address" msgstr "กรุณายืนยันอีเมลของคุณ" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account at %(site_domain)s.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this e-mail because you or someone else has requested a " "password for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "สวัสดีจาก %(site_name)s!\n" "\n" "You're receiving this e-mail because you or someone else has requested a " "คุณได้รับอีเมลนี้เพราะว่า คุณหรือใครบางคนได้ทำการร้องขอรหัสผ่านของบัญชีนี้ที่ %(site_domain)s.\n" "It can be safely ignored if you did not request a password reset. Click the " "คุณสามารถมองข้ามและลบอีเมลนี้ทิ้งได้เลยหากคุณไม่ได้ทำการร้องขอการรีเซ็ทรหัสผ่านคลิกที่ลิงค์ข้างล่างนี้เพื่อรีเซ็ทรหัสผ่านของคุณ" #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "ในกรณีเผื่อคุณลืม ชื่อผู้ใช้ของคุณคือ %(username)s" #: templates/account/email/password_reset_key_subject.txt:3 msgid "Password Reset E-mail" msgstr "อีเมลในการรีเซ็ทรหัสผ่าน" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm E-mail Address" msgstr "ยืนยันอีเมล" #: templates/account/email_confirm.html:16 #, python-format msgid "" "Please confirm that %(email)s is an e-mail " "address for user %(user_display)s." msgstr "" "กรุณายืนยันว่า %(email)s เป็นอีเมลของชื่อผู้ใช้ " "%(user_display)s." #: templates/account/email_confirm.html:20 msgid "Confirm" msgstr "ยืนยัน" #: templates/account/email_confirm.html:27 #, python-format msgid "" "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgstr "" "ลิงค์ที่ใช้ในการยืนยันอีเมลนี้ หมดอายุหรือมีข้อผิดพลาด กรุณาใช้อีเมล ติดต่อการร้องขอการยืนยันอีเมล." #: templates/account/login.html:6 templates/account/login.html:10 #: templates/account/login.html:43 msgid "Sign In" msgstr "ลงชื่อเข้าใช้" #: templates/account/login.html:15 #, python-format msgid "" "Please sign in with one\n" "of your existing third party accounts. Or, sign " "up\n" "for a %(site_name)s account and sign in below:" msgstr "" "กรุณาลงชื่อเข้าใช้ด้วยบัญชีภายนอกของคุณ\n" "หรือ Or, ลงทะเบียน \n" "สำหรับบัญชีของ %(site_name)s และลงชื่อเข้าใช้ด้านล่าง:" #: templates/account/login.html:25 msgid "or" msgstr "sinv" #: templates/account/login.html:32 #, python-format msgid "" "If you have not created an account yet, then please\n" "sign up first." msgstr "" "ถ้าหากคุณยังไม่มีบัญชี, กรุณา\n" "ลงทะเบียนก่อน." #: templates/account/login.html:42 templates/account/password_change.html:14 msgid "Forgot Password?" msgstr "ลืมรหัสผ่าน?" #: templates/account/logout.html:5 templates/account/logout.html:8 #: templates/account/logout.html:17 msgid "Sign Out" msgstr "ลงชื่อออก" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "คุณแน่ใจหรือว่าต้องการจะลงชื่อออก" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary e-mail address (%(email)s)." msgstr "คุณไม่สามารถลบอีเมลของคุณได้ (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation e-mail sent to %(email)s." msgstr "อีเมลยืนยันได้ถูกส่งไปที่ %(email)s" #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "คุณได้ทำการยืนยัน %(email)s" #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed e-mail address %(email)s." msgstr "ลบอีเมล %(email)s แล้ว" #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "%(name)s ลงชื่อเข้าใช้สำเร็จ" #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "คุณได้ออกจากระบบแล้ว" #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "เปลี่ยนรหัสผ่านสำเร็จ" #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "ตั้งรหัสผ่านสำเร็จ" #: templates/account/messages/primary_email_set.txt:2 msgid "Primary e-mail address set." msgstr "ตั้งอีเมลหลักสำเร็จ" #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary e-mail address must be verified." msgstr "อีเมลหลักของคุณต้องได้การยืนยัน" #: templates/account/password_change.html:5 #: templates/account/password_change.html:8 #: templates/account/password_change.html:13 #: templates/account/password_reset_from_key.html:4 #: templates/account/password_reset_from_key.html:7 #: templates/account/password_reset_from_key_done.html:4 #: templates/account/password_reset_from_key_done.html:7 msgid "Change Password" msgstr "เปลี่ยนรหัสผ่าน" #: templates/account/password_reset.html:6 #: templates/account/password_reset.html:10 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:9 msgid "Password Reset" msgstr "รีเซ็ทรหัสผ่าน" #: templates/account/password_reset.html:15 msgid "" "Forgotten your password? Enter your e-mail address below, and we'll send you " "an e-mail allowing you to reset it." msgstr "" "ลืมรหัสผ่านของคุณ? ใส่อีเมลของคุณข้างล่างนี้ ทางเราจะทำการส่งอีเมลที่ใช้ในการรีเซ็ทรหัสผ่านไปให้คุณ" #: templates/account/password_reset.html:20 msgid "Reset My Password" msgstr "รีเซ็ทรหัสผ่านของฉัน" #: templates/account/password_reset.html:23 msgid "Please contact us if you have any trouble resetting your password." msgstr "กรุณาติดต่อเราหากคุณพบปัญหาในการรีเซ็ทรหัสผ่าน" #: templates/account/password_reset_done.html:15 msgid "" "We have sent you an e-mail. Please contact us if you do not receive it " "within a few minutes." msgstr "เราได้ส่งอีเมลให้คุณแล้ว. กรุณาติดต่อเราหากคุณไม่ได้รับอีเมลภายในเวลาไม่กี่นาทีนี้" #: templates/account/password_reset_from_key.html:7 msgid "Bad Token" msgstr "Token เสีย" #: templates/account/password_reset_from_key.html:11 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "ลิงค์ที่ใช้ในการรีเซ็ทรหัสผ่านไม่ถูกต้อง อาจเป็นไปได้ว่ามันได้ถูกใช้ไปแล้วกรุณาร้องขอ การรีเซ็ทรหัสผ่านใหม่" #: templates/account/password_reset_from_key.html:17 msgid "change password" msgstr "เปลี่ยนรหัสผ่าน" #: templates/account/password_reset_from_key.html:20 #: templates/account/password_reset_from_key_done.html:8 msgid "Your password is now changed." msgstr "รหัสผ่านของคุณได้เปลี่ยนแล้ว" #: templates/account/password_set.html:5 templates/account/password_set.html:8 #: templates/account/password_set.html:13 msgid "Set Password" msgstr "ตั้งรหัสผ่าน" #: templates/account/signup.html:5 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "ลงทะเบียน" #: templates/account/signup.html:8 templates/account/signup.html:18 #: templates/socialaccount/signup.html:8 templates/socialaccount/signup.html:19 msgid "Sign Up" msgstr "ลงทะเบียน" #: templates/account/signup.html:10 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "มีบัญชีอยู่แล้ว? กรุณาลงชื่อเข้าใช้" #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:8 msgid "Sign Up Closed" msgstr "การลงทะเบียนปิดอยู่" #: templates/account/signup_closed.html:10 msgid "We are sorry, but the sign up is currently closed." msgstr "เราขอโทษด้วย การลงทะเบียนได้ปิดชั่วคราว" #: templates/account/snippets/already_logged_in.html:5 msgid "Note" msgstr "หมายเหตุ" #: templates/account/snippets/already_logged_in.html:5 #, python-format msgid "you are already logged in as %(user_display)s." msgstr "คุณได้ลงชื่อเข้าใช้เป็น %(user_display)s" #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:8 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:8 msgid "Verify Your E-mail Address" msgstr "ยืนยันอีเมลของคุณ" #: templates/account/verification_sent.html:10 msgid "" "We have sent an e-mail to you for verification. Follow the link provided to " "finalize the signup process. Please contact us if you do not receive it " "within a few minutes." msgstr "" "เราได้ส่งอีเมลถึงคุณเพื่อให้คุณได้ทำการยืนยัน " "ใช้ลิงค์ที่อยู่ในอีเมลเพื่อทำการสิ้นสุดการลงทะเบียนกรุณาติดต่อเราหากคุณไม่ได้รับอีเมลภายในเวลาไม่กี่นาทีนี้" #: templates/account/verified_email_required.html:12 msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your e-mail address. " msgstr "" "ส่วนนี้ของเว็บไซท์นี้ต้องการให้คุณยืนยันตัวตนของคุณก่อน\n" "ด้วยการนี้ เราขอให้คุณทำการยืนยันการเป็นเจ้าของของอีเมลของคุณก่อน" #: templates/account/verified_email_required.html:16 msgid "" "We have sent an e-mail to you for\n" "verification. Please click on the link inside this e-mail. Please\n" "contact us if you do not receive it within a few minutes." msgstr "" "เราได้ส่งอีเมลให้คุณเพื่อ\n" "ทำการยืนยัน กรุณาคลิกลิงค์ที่อยู่ข้างในอีเมล\n" "กรุณาติดต่อเราหากคุณไม่ได้รับอีเมลภายในเวลาไม่กี่นาทีนี้" #: templates/account/verified_email_required.html:20 #, python-format msgid "" "Note: you can still change your e-" "mail address." msgstr "" "หมายเหตุ: คุณยังสามารถเปลี่ยนอีเมลของคุณได้" #: templates/openid/login.html:9 msgid "OpenID Sign In" msgstr "ลงชื่อเข้าใช้ด้วย OpenID" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:8 msgid "Social Network Login Failure" msgstr "ลงชื่อเข้าใช้ด้วยระบบโซเชีลไม่สำเร็จ" #: templates/socialaccount/authentication_error.html:10 msgid "" "An error occurred while attempting to login via your social network account." msgstr "มีปัญหาเกิดขึ้นในขณะที่คุณทำการลงชื่อเข้าใช้ด้วยบัญชีโซเชียล" #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:8 msgid "Account Connections" msgstr "การเชื่อมต่อบัญชีต่างๆ" #: templates/socialaccount/connections.html:11 msgid "" "You can sign in to your account using any of the following third party " "accounts:" msgstr "คุณสามารถลงชื่อเข้าสู่ระบบด้วยบัญชีภายนอกเหล่านี้ได้:" #: templates/socialaccount/connections.html:43 msgid "" "You currently have no social network accounts connected to this account." msgstr "คุณไม่มีบัญชีโซเชียลใดๆที่เชื่อมกับบัญชีนี้" #: templates/socialaccount/connections.html:46 msgid "Add a 3rd Party Account" msgstr "เพิ่ม บัญชีภายนอก" #: templates/socialaccount/login.html:6 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:8 #, python-format msgid "You are about to connect a new third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:10 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:12 #, python-format msgid "You are about to sign in using a third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "การลงชื่เข้าใช้ยกเลิก" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "คุณตัดสินใจที่จะยกเลิกการลงชื่อเข้าใช้เว็บของเราด้วยหนึ่งในบัญชีของคุณถ้านี้เป็นความผิดพลาด กรุณาลงชื่อเข้าใช้" #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "บัญชีโซเชียลเชื่อมต่อเรียบร้อยแล้ว" #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "บัญชีโซเชียลนี้ได้ถูกเชื่อมต่อกับบัญชีอื่นแล้ว" #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "บัญชีโซเชียลได้ถูกตัดการเชื่อมต่อแล้ว" #: templates/socialaccount/signup.html:10 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "คุณกำลังจะทำการใช้บัญชี %(provider_name)s ของคุณ ในการเข้าสู่ระบบของ\n" "%(site_name)s. ในขั้นตอนสุดท้าย กรุณากรอกฟอร์มข้างล่าง:" #~ msgid "Account" #~ msgstr "บัญชี" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "การลงชื่เข้าใช้และ/หรือรหัสผ่านที่ระบุมาไม่ถูกต้อง" #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "ชื่อผู้ใช้สามารถมีตัวอักษรภาษาอังกฤษตัวเลขและ @/./+/-/_. เท่านั้น" #~ msgid "This username is already taken. Please choose another." #~ msgstr "ชื่อผู้ใช้นี้ถูกใช้แล้ว กรุณาเลือกชื่ออื่น" #, fuzzy #~| msgid "Sign In" #~ msgid "Shopify Sign In" #~ msgstr "ลงชื่อเข้าใช้" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "คุณได้ยืนยันว่า %(email)s เป็นอีเมลของผู้ใช้ " #~ "%(user_display)s." django-allauth-0.47.0/allauth/locale/tr/000077500000000000000000000000001415442050100200065ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/tr/LC_MESSAGES/000077500000000000000000000000001415442050100215735ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/tr/LC_MESSAGES/django.po000066400000000000000000000634751415442050100234140ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # , 2013 msgid "" msgstr "" "Project-Id-Version: django-allauth\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-12-09 08:41-0600\n" "PO-Revision-Date: 2014-08-12 00:35+0200\n" "Last-Translator: Jannis Š\n" "Language-Team: Turkish (http://www.transifex.com/projects/p/django-allauth/" "language/tr/)\n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: account/adapter.py:45 msgid "Username can not be used. Please use other username." msgstr "Bu kullanıcı adı kullanılamaz. Lütfen başka bir kullanıcı adı deneyin." #: account/adapter.py:51 msgid "Too many failed login attempts. Try again later." msgstr "Çok fazla hatalı giriş yapıldı. Lütfen daha sonra tekrar deneyin." #: account/adapter.py:53 msgid "A user is already registered with this e-mail address." msgstr "Bu e-posta adresiyle bir kullanıcı zaten kayıtlı." #: account/adapter.py:300 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Parola en az {0} karakter olmalıdır." #: account/apps.py:7 #, fuzzy msgid "Accounts" msgstr "Hesap" #: account/forms.py:59 account/forms.py:413 msgid "You must type the same password each time." msgstr "Her seferinde aynı parolayı girmelisiniz." #: account/forms.py:92 account/forms.py:381 account/forms.py:498 msgid "Password" msgstr "Parola" #: account/forms.py:93 msgid "Remember Me" msgstr "Beni Hatırla" #: account/forms.py:97 msgid "This account is currently inactive." msgstr "Bu hesap şu anda etkin değil." #: account/forms.py:99 msgid "The e-mail address and/or password you specified are not correct." msgstr "Girdiğiniz e-posta adresi ve/veya parola doğru değil." #: account/forms.py:102 msgid "The username and/or password you specified are not correct." msgstr "Girdiğiniz kullanıcı adı ve/veya parola doğru değil." #: account/forms.py:113 account/forms.py:279 account/forms.py:439 #: account/forms.py:517 msgid "E-mail address" msgstr "E-posta adresi" #: account/forms.py:117 account/forms.py:316 account/forms.py:436 #: account/forms.py:512 msgid "E-mail" msgstr "E-posta" #: account/forms.py:120 account/forms.py:123 account/forms.py:269 #: account/forms.py:272 msgid "Username" msgstr "Kullanıcı adı" #: account/forms.py:133 msgid "Username or e-mail" msgstr "Kullanıcı adı ya da e-posta" #: account/forms.py:136 msgctxt "field label" msgid "Login" msgstr "Giriş Yap" #: account/forms.py:307 #, fuzzy #| msgid "E-mail (optional)" msgid "E-mail (again)" msgstr "E-posta (zorunlu değil)" #: account/forms.py:311 #, fuzzy #| msgid "email confirmation" msgid "E-mail address confirmation" msgstr "e-posta onayı" #: account/forms.py:319 msgid "E-mail (optional)" msgstr "E-posta (zorunlu değil)" #: account/forms.py:359 #, fuzzy #| msgid "You must type the same password each time." msgid "You must type the same email each time." msgstr "Her seferinde aynı parolayı girmelisiniz." #: account/forms.py:384 account/forms.py:499 msgid "Password (again)" msgstr "Parola (tekrar)" #: account/forms.py:448 msgid "This e-mail address is already associated with this account." msgstr "Bu e-post adresi zaten bu hesap ile ilişkilendirilmiş." #: account/forms.py:451 msgid "This e-mail address is already associated with another account." msgstr "Bu e-post adresi başka bir hesap ile ilişkilendirilmiş." #: account/forms.py:453 #, fuzzy, python-format #| msgid "Your account has no verified e-mail address." msgid "You cannot add more than %d e-mail addresses." msgstr "Hesabınızın doğrulanmış e-posta adresi yok." #: account/forms.py:478 msgid "Current Password" msgstr "Mevcut Parola" #: account/forms.py:480 account/forms.py:570 msgid "New Password" msgstr "Yeni Parola" #: account/forms.py:481 account/forms.py:571 msgid "New Password (again)" msgstr "Yeni Parola (tekrar)" #: account/forms.py:489 msgid "Please type your current password." msgstr "Mevcut parolanızı tekrar yazın." #: account/forms.py:529 msgid "The e-mail address is not assigned to any user account" msgstr "Bu e-posta adresi hiçbir kullanıcı hesabıyla ilişkili değil" #: account/forms.py:592 msgid "The password reset token was invalid." msgstr "Şifre sıfırlama kodu hatalı." #: account/models.py:22 msgid "user" msgstr "kullanıcı" #: account/models.py:28 account/models.py:83 #, fuzzy msgid "e-mail address" msgstr "e-posta adresi" #: account/models.py:30 #, fuzzy msgid "verified" msgstr "Doğrulanmamış" #: account/models.py:31 #, fuzzy msgid "primary" msgstr "Birincil" #: account/models.py:36 msgid "email address" msgstr "e-posta adresi" #: account/models.py:37 msgid "email addresses" msgstr "e-posta adresleri" #: account/models.py:86 msgid "created" msgstr "oluşturuldu" #: account/models.py:87 msgid "sent" msgstr "gönderildi" #: account/models.py:88 socialaccount/models.py:58 msgid "key" msgstr "" #: account/models.py:93 msgid "email confirmation" msgstr "e-posta onayı" #: account/models.py:94 msgid "email confirmations" msgstr "e-posta onayları" #: socialaccount/adapter.py:26 #, python-format msgid "" "An account already exists with this e-mail address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Bu e-posta ile kayıtlı bir hesap bulunmaktadır. Lütfen önce bu hesaba giriş " "yapıp daha sonra %s hesabınızı bağlayın." #: socialaccount/adapter.py:131 msgid "Your account has no password set up." msgstr "Hesabınız için parola belirlemediniz." #: socialaccount/adapter.py:138 msgid "Your account has no verified e-mail address." msgstr "Hesabınızın doğrulanmış e-posta adresi yok." #: socialaccount/apps.py:7 #, fuzzy msgid "Social Accounts" msgstr "Hesap" #: socialaccount/models.py:41 socialaccount/models.py:84 msgid "provider" msgstr "sağlayıcı" #: socialaccount/models.py:45 #, fuzzy msgid "name" msgstr "Kullanıcı adı" #: socialaccount/models.py:47 msgid "client id" msgstr "" #: socialaccount/models.py:49 msgid "App ID, or consumer key" msgstr "" #: socialaccount/models.py:52 msgid "secret key" msgstr "" #: socialaccount/models.py:55 msgid "API secret, client secret, or consumer secret" msgstr "" #: socialaccount/models.py:58 msgid "Key" msgstr "" #: socialaccount/models.py:74 msgid "social application" msgstr "" #: socialaccount/models.py:75 msgid "social applications" msgstr "" #: socialaccount/models.py:105 msgid "uid" msgstr "" #: socialaccount/models.py:107 msgid "last login" msgstr "son giriş" #: socialaccount/models.py:108 msgid "date joined" msgstr "katıldığı tarih" #: socialaccount/models.py:109 msgid "extra data" msgstr "" #: socialaccount/models.py:113 msgid "social account" msgstr "" #: socialaccount/models.py:114 msgid "social accounts" msgstr "" #: socialaccount/models.py:139 msgid "token" msgstr "" #: socialaccount/models.py:140 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "" #: socialaccount/models.py:144 msgid "token secret" msgstr "" #: socialaccount/models.py:145 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "" #: socialaccount/models.py:148 msgid "expires at" msgstr "" #: socialaccount/models.py:153 msgid "social application token" msgstr "" #: socialaccount/models.py:154 msgid "social application tokens" msgstr "" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "Geçersiz profil bilgisi" #: socialaccount/providers/oauth/client.py:85 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "\"%s\"'dan talep kodu alınırken geçersiz cevap alındı." #: socialaccount/providers/oauth/client.py:117 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "\"%s\"'dan erişim kodu alınırken geçersiz cevap alındı." #: socialaccount/providers/oauth/client.py:138 #, python-format msgid "No request token saved for \"%s\"." msgstr "\"%s\" için hiçbir talep kodu kaydedilmedi." #: socialaccount/providers/oauth/client.py:189 #, python-format msgid "No access token saved for \"%s\"." msgstr "\"%s\" için hiçbir erişim kodu kaydedilmedi." #: socialaccount/providers/oauth/client.py:210 #, python-format msgid "No access to private resources at \"%s\"." msgstr "\"%s\"'daki özel kaynaklara erişim yok." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:8 msgid "Account Inactive" msgstr "Hesap Etkin Değil" #: templates/account/account_inactive.html:10 msgid "This account is inactive." msgstr "Bu hesap etkin değil." #: templates/account/email.html:5 templates/account/email.html:8 msgid "E-mail Addresses" msgstr "E-posta Adresleri" #: templates/account/email.html:10 msgid "The following e-mail addresses are associated with your account:" msgstr "Şu e-posta adresleri hesabınızla ilişkilendirildi:" #: templates/account/email.html:24 msgid "Verified" msgstr "Doğrulanmış" #: templates/account/email.html:26 msgid "Unverified" msgstr "Doğrulanmamış" #: templates/account/email.html:28 msgid "Primary" msgstr "Birincil" #: templates/account/email.html:34 msgid "Make Primary" msgstr "Birincil Yap" #: templates/account/email.html:35 msgid "Re-send Verification" msgstr "Tekrar Doğrula" #: templates/account/email.html:36 templates/socialaccount/connections.html:35 msgid "Remove" msgstr "Kaldır" #: templates/account/email.html:43 msgid "Warning:" msgstr "Uyarı:" #: templates/account/email.html:43 msgid "" "You currently do not have any e-mail address set up. You should really add " "an e-mail address so you can receive notifications, reset your password, etc." msgstr "" "Şu anda kayıtlı hiçbir e-posta adresiniz yok. Bildirim alabilmek, parolanızı " "sıfırlayabilmek, vs. işler için e-posta adresinizi mutlaka eklemelisiniz." #: templates/account/email.html:48 msgid "Add E-mail Address" msgstr "E-posta Adresi Ekle" #: templates/account/email.html:53 msgid "Add E-mail" msgstr "E-posta Ekle" #: templates/account/email.html:63 msgid "Do you really want to remove the selected e-mail address?" msgstr "Seçilen e-posta adresini kaldırmak istediğinizden emin misiniz?" #: templates/account/email/base_message.txt:1 #, fuzzy, python-format #| msgid "" #| "Thank you from %(site_name)s!\n" #| "%(site_domain)s" msgid "Hello from %(site_name)s!" msgstr "" "%(site_name)s: Teşekkürler!\n" "%(site_domain)s" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "User %(user_display)s at %(site_name)s has given this as an email " #| "address.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s\n" msgid "" "You're receiving this e-mail because user %(user_display)s has given your e-" "mail address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "%(site_name)s sitesinde %(user_display)s, bunu e-posta adresi olarak verdi.\n" "\n" "Doğruluğunu onaylamak için %(activate_url)s adresine gidin\n" #: templates/account/email/email_confirmation_subject.txt:3 #, fuzzy #| msgid "Confirm E-mail Address" msgid "Please Confirm Your E-mail Address" msgstr "E-posta Adresi Doğrula" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account at %(site_domain)s.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this e-mail because you or someone else has requested a " "password for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Bu e-postayı alıyorsunuz çünkü siz veya bir başkası %(site_domain)s " "sitesindeki hesabınız için parola sıfırlama talebinde bulundu.\n" "Eğer böyle bir talepte bulunmadıysanız bu e-postayı gözardı edebilirsiniz. " "Bulunduysanız aşağıdaki bağlantıya tıklayarak parolanızı sıfırlayabilirsiniz." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "Kullanıcı adınızı unuttuysanız, kullanıcı adınız: %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 msgid "Password Reset E-mail" msgstr "Parola Sıfırlama E-postası" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm E-mail Address" msgstr "E-posta Adresi Doğrula" #: templates/account/email_confirm.html:16 #, python-format msgid "" "Please confirm that %(email)s is an e-mail " "address for user %(user_display)s." msgstr "" "Lütfen %(email)s adresinin %(user_display)s " "kullanıcısına ait olduğunu onaylayın." #: templates/account/email_confirm.html:20 msgid "Confirm" msgstr "Onayla" #: templates/account/email_confirm.html:27 #, python-format msgid "" "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgstr "" "Bu onaylama bağlantısının süresi geçmiş ya da bağlantı geçersiz. Lütfen yeni bir e-posta doğrulama talebinde bulunun.." #: templates/account/login.html:6 templates/account/login.html:10 #: templates/account/login.html:43 msgid "Sign In" msgstr "Giriş Yap" #: templates/account/login.html:15 #, python-format msgid "" "Please sign in with one\n" "of your existing third party accounts. Or, sign " "up\n" "for a %(site_name)s account and sign in below:" msgstr "" #: templates/account/login.html:25 msgid "or" msgstr "ya da" #: templates/account/login.html:32 #, fuzzy, python-format msgid "" "If you have not created an account yet, then please\n" "sign up first." msgstr "" "Zaten hesabınız var mı? O zaman lütfen giriş " "yapın." #: templates/account/login.html:42 templates/account/password_change.html:14 msgid "Forgot Password?" msgstr "Parolanızı mı unuttunuz?" #: templates/account/logout.html:5 templates/account/logout.html:8 #: templates/account/logout.html:17 msgid "Sign Out" msgstr "Çıkış Yap" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Çıkış yapmak istediğinize emin misiniz?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary e-mail address (%(email)s)." msgstr "" #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation e-mail sent to %(email)s." msgstr "Doğrulama e-posta'sı %(email)s adresine gönderildi." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "%(email)s adresini onayladınız." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed e-mail address %(email)s." msgstr "%(email)s adresini sildiniz." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "%(name)s olarak başarıyla giriş yapıldı." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Çıkış yaptınız." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Parola başarıyla değiştirildi." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Parola başarıyla ayarlandı." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary e-mail address set." msgstr "" #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary e-mail address must be verified." msgstr "" #: templates/account/password_change.html:5 #: templates/account/password_change.html:8 #: templates/account/password_change.html:13 #: templates/account/password_reset_from_key.html:4 #: templates/account/password_reset_from_key.html:7 #: templates/account/password_reset_from_key_done.html:4 #: templates/account/password_reset_from_key_done.html:7 msgid "Change Password" msgstr "Parola Değiştir" #: templates/account/password_reset.html:6 #: templates/account/password_reset.html:10 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:9 msgid "Password Reset" msgstr "Parola Sıfırlama" #: templates/account/password_reset.html:15 msgid "" "Forgotten your password? Enter your e-mail address below, and we'll send you " "an e-mail allowing you to reset it." msgstr "" "Parolanızı mı unuttunuz? E-posta adresinizi aşağıya yazın, size parolanızı " "sıfırlamanıza imkan veren e-postayı göndereceğiz." #: templates/account/password_reset.html:20 msgid "Reset My Password" msgstr "Parolamı Sıfırla" #: templates/account/password_reset.html:23 msgid "Please contact us if you have any trouble resetting your password." msgstr "" "Parolanızı sıfırlarken herhangi bir sorunla karşılaşırsanız lütfen bize " "ulaşın." #: templates/account/password_reset_done.html:15 msgid "" "We have sent you an e-mail. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Size bir e-posta gönderdik. Birkaç dakika içerisinde size ulaşmazsa lütfen " "bize ulaşın." #: templates/account/password_reset_from_key.html:7 msgid "Bad Token" msgstr "" #: templates/account/password_reset_from_key.html:11 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Parola sıfırlama bağlantısı gerçersiz, muhtemelen daha önce kullanıldığı " "için. Lütfen yeni parola sıfırlama " "talebinde bulunun." #: templates/account/password_reset_from_key.html:17 msgid "change password" msgstr "parola değiştir" #: templates/account/password_reset_from_key.html:20 #: templates/account/password_reset_from_key_done.html:8 msgid "Your password is now changed." msgstr "Parolanız değişti." #: templates/account/password_set.html:5 templates/account/password_set.html:8 #: templates/account/password_set.html:13 msgid "Set Password" msgstr "Parola Belirle" #: templates/account/signup.html:5 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Üye Ol" #: templates/account/signup.html:8 templates/account/signup.html:18 #: templates/socialaccount/signup.html:8 templates/socialaccount/signup.html:19 msgid "Sign Up" msgstr "Üye Ol" #: templates/account/signup.html:10 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "" "Zaten hesabınız var mı? O zaman lütfen giriş " "yapın." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:8 msgid "Sign Up Closed" msgstr "Kayıt Kapalı" #: templates/account/signup_closed.html:10 msgid "We are sorry, but the sign up is currently closed." msgstr "" #: templates/account/snippets/already_logged_in.html:5 msgid "Note" msgstr "Not" #: templates/account/snippets/already_logged_in.html:5 #, python-format msgid "you are already logged in as %(user_display)s." msgstr "zaten %(user_display)s olarak giriş yaptınız." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:8 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:8 msgid "Verify Your E-mail Address" msgstr "E-posta Adresinizi Doğrulayın" #: templates/account/verification_sent.html:10 #, fuzzy msgid "" "We have sent an e-mail to you for verification. Follow the link provided to " "finalize the signup process. Please contact us if you do not receive it " "within a few minutes." msgstr "" "%(email)s adresinize doğrulama amaçlı e-" "posta gönderdik. Üyelik sürecini tamamlamak için sunulan bağlantıyı takip " "edin. Eğer e-posta birkaç dakika içinde size ulaşmazsa lütfen bize ulaşın." #: templates/account/verified_email_required.html:12 msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your e-mail address. " msgstr "" "Sitenin bu kısmı kim olduğunuzu doğrulamanızı\n" "gerektirmektedir. Bu sebeple, girdiğiniz e-posta adresinize sahip\n" "olduğunuzu doğrulamanızı rica ediyoruz. " #: templates/account/verified_email_required.html:16 msgid "" "We have sent an e-mail to you for\n" "verification. Please click on the link inside this e-mail. Please\n" "contact us if you do not receive it within a few minutes." msgstr "" "Doğrulama için size bir e-posta gönderdik.\n" "Lütfen e-postadaki bağlantıya tıklayın. Eğer birkaç dakika içinde\n" "bu e-postayı almazsanız bize ulaşın." #: templates/account/verified_email_required.html:20 #, python-format msgid "" "Note: you can still change your e-" "mail address." msgstr "" "Not: hala e-posta adresinizi " "değiştirebilirsiniz." #: templates/openid/login.html:9 msgid "OpenID Sign In" msgstr "OpenID Girişi" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:8 msgid "Social Network Login Failure" msgstr "Sosyal Ağ Girişi Başarısız" #: templates/socialaccount/authentication_error.html:10 msgid "" "An error occurred while attempting to login via your social network account." msgstr "Sosyal ağ hesabınız ile giriş yapılırken bir hata oluştu." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:8 msgid "Account Connections" msgstr "Hesap Bağlantıları" #: templates/socialaccount/connections.html:11 msgid "" "You can sign in to your account using any of the following third party " "accounts:" msgstr "" "Hesabınıza aşağıdaki üçüncü parti hesaplar aracılığıyla giriş yapabilirsiniz." #: templates/socialaccount/connections.html:43 msgid "" "You currently have no social network accounts connected to this account." msgstr "Hesabınızla bağlantılı hiçbir sosyal ağ hesabınız yok." #: templates/socialaccount/connections.html:46 msgid "Add a 3rd Party Account" msgstr "3. Parti Hesap ekle" #: templates/socialaccount/login.html:6 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:8 #, python-format msgid "You are about to connect a new third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:10 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:12 #, python-format msgid "You are about to sign in using a third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Giriş İptal Edildi" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Mevcut hesaplarınızdan birisiyle sitemize girişinizi iptal etmeye karar " "verdiniz. Eğer bu yanlışlıkla olduysa, lütfen devam edin: giriş yapın." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "" #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "" #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "" #: templates/socialaccount/signup.html:10 #, fuzzy, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "%(site_name)s sitesine giriş yapmak için %(provider_name)s hesabınızı " "kullanmak üzeresiniz. Son bir adım olarak, lütfen şu formu doldurun:" #~ msgid "Account" #~ msgstr "Hesap" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "Girdiğiniz giriş bilgisi ve/veya parola doğru değil." #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "Kullanıcı adları sadece harf, rakam ve @/./+/-/_ içerebilir." #~ msgid "This username is already taken. Please choose another." #~ msgstr "Bu kullanıcı adı alınmış durumda. Lütfen başka bir tane deneyiniz." #, fuzzy #~| msgid "Sign In" #~ msgid "Shopify Sign In" #~ msgstr "Giriş Yap" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "%(email)s adresinin %(user_display)s " #~ "kullanıcısına ait olduğunu onayladınız." #~ msgid "Thanks for using our site!" #~ msgstr "Sitemizi kullandığınız için teşekkür ederiz!" #~ msgid "Confirmation e-mail sent to %(email)s" #~ msgstr "Onay e-postası %(email)s adresine gönderildi." #~ msgid "Delete Password" #~ msgstr "Parola Sil" #~ msgid "" #~ "You may delete your password since you are currently logged in using " #~ "OpenID." #~ msgstr "" #~ "Şu anda OpenID ile giriş yaptığınız için dilerseniz parolanızı " #~ "silebilirsiniz." #~ msgid "delete my password" #~ msgstr "parolamı sil" #~ msgid "Password Deleted" #~ msgstr "Parola Silindi" #~ msgid "Your password has been deleted." #~ msgstr "Parolanız silindi." django-allauth-0.47.0/allauth/locale/uk/000077500000000000000000000000001415442050100200005ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/uk/LC_MESSAGES/000077500000000000000000000000001415442050100215655ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/uk/LC_MESSAGES/django.po000066400000000000000000000740321415442050100233750ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-12-09 08:41-0600\n" "PO-Revision-Date: 2020-10-15 19:53+0200\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != " "11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % " "100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || " "(n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" #: account/adapter.py:45 msgid "Username can not be used. Please use other username." msgstr "" "Ім'я користувача не може бути використаним. Будь ласка, оберіть інше ім'я " "користувача." #: account/adapter.py:51 msgid "Too many failed login attempts. Try again later." msgstr "Занадто багато спроб входу в систему, спробуйте пізніше." #: account/adapter.py:53 msgid "A user is already registered with this e-mail address." msgstr "Користувач з такою e-mail адресою уже зареєстрований." #: account/adapter.py:300 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Пароль повинен містити мінімум {0} символів." #: account/apps.py:7 msgid "Accounts" msgstr "Акаунти" #: account/forms.py:59 account/forms.py:413 msgid "You must type the same password each time." msgstr "Ви повинні вводити однаковий пароль кожного разу." #: account/forms.py:92 account/forms.py:381 account/forms.py:498 msgid "Password" msgstr "Пароль" #: account/forms.py:93 msgid "Remember Me" msgstr "Запам'ятати мене" #: account/forms.py:97 msgid "This account is currently inactive." msgstr "Даний акаунт є неактивним." #: account/forms.py:99 msgid "The e-mail address and/or password you specified are not correct." msgstr "Введена e-mail адреса і/або пароль є некоректними." #: account/forms.py:102 msgid "The username and/or password you specified are not correct." msgstr "Введене ім'я користувача і/або пароль є некоректними." #: account/forms.py:113 account/forms.py:279 account/forms.py:439 #: account/forms.py:517 msgid "E-mail address" msgstr "E-mail адреса" #: account/forms.py:117 account/forms.py:316 account/forms.py:436 #: account/forms.py:512 msgid "E-mail" msgstr "E-mail" #: account/forms.py:120 account/forms.py:123 account/forms.py:269 #: account/forms.py:272 msgid "Username" msgstr "Ім'я користувача" #: account/forms.py:133 msgid "Username or e-mail" msgstr "Ім'я користувача або e-mail" #: account/forms.py:136 msgctxt "field label" msgid "Login" msgstr "Увійти" #: account/forms.py:307 msgid "E-mail (again)" msgstr "E-mail (ще раз)" #: account/forms.py:311 msgid "E-mail address confirmation" msgstr "e-mail адреса підтвердження" #: account/forms.py:319 msgid "E-mail (optional)" msgstr "E-mail (необов'язковий)" #: account/forms.py:359 msgid "You must type the same email each time." msgstr "Ви повинні вводити однакову e-mail адресу кожного разу." #: account/forms.py:384 account/forms.py:499 msgid "Password (again)" msgstr "Пароль (ще раз)" #: account/forms.py:448 msgid "This e-mail address is already associated with this account." msgstr "Вказаний e-mail уже прикріплений до цього акаунту." #: account/forms.py:451 msgid "This e-mail address is already associated with another account." msgstr "Вказаний e-mail уже прикріплений до іншого користувача." #: account/forms.py:453 #, fuzzy, python-format #| msgid "Your account has no verified e-mail address." msgid "You cannot add more than %d e-mail addresses." msgstr "Немає підтвердження по e-mail для Вашого акаунту." #: account/forms.py:478 msgid "Current Password" msgstr "Поточний пароль" #: account/forms.py:480 account/forms.py:570 msgid "New Password" msgstr "Новий пароль" #: account/forms.py:481 account/forms.py:571 msgid "New Password (again)" msgstr "Новий пароль (ще раз)" #: account/forms.py:489 msgid "Please type your current password." msgstr "Будь ласка, вкажіть Ваш поточний пароль." #: account/forms.py:529 msgid "The e-mail address is not assigned to any user account" msgstr "Немає користувача з такою e-mail адресою." #: account/forms.py:592 msgid "The password reset token was invalid." msgstr "Токен відновлення паролю був невірним." #: account/models.py:22 msgid "user" msgstr "користувач" #: account/models.py:28 account/models.py:83 msgid "e-mail address" msgstr "e-mail адреса" #: account/models.py:30 msgid "verified" msgstr "підтверджено" #: account/models.py:31 msgid "primary" msgstr "основний" #: account/models.py:36 msgid "email address" msgstr "e-mail адреса" #: account/models.py:37 msgid "email addresses" msgstr "e-mail адреса" #: account/models.py:86 msgid "created" msgstr "створено" #: account/models.py:87 msgid "sent" msgstr "відправлено" #: account/models.py:88 socialaccount/models.py:58 msgid "key" msgstr "ключ" #: account/models.py:93 msgid "email confirmation" msgstr "e-mail підтвердження" #: account/models.py:94 msgid "email confirmations" msgstr "e-mail підтвердження" #: socialaccount/adapter.py:26 #, python-format msgid "" "An account already exists with this e-mail address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Акаунт з такою e-mail адресою уже існує. Будь ласка, спершу увійдіть у цей " "акаунт, потім приєднайте Ваш %s акаунт." #: socialaccount/adapter.py:131 msgid "Your account has no password set up." msgstr "Ваш акаунт не має встановленого паролю." #: socialaccount/adapter.py:138 msgid "Your account has no verified e-mail address." msgstr "Немає підтвердження по e-mail для Вашого акаунту." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Соціальні акаунти" #: socialaccount/models.py:41 socialaccount/models.py:84 msgid "provider" msgstr "постачальник" #: socialaccount/models.py:45 msgid "name" msgstr "Ім'я" #: socialaccount/models.py:47 msgid "client id" msgstr "ідентифікатор клієнта" #: socialaccount/models.py:49 msgid "App ID, or consumer key" msgstr "ідентифікатор додатку або ключ користувача" #: socialaccount/models.py:52 msgid "secret key" msgstr "секретний ключ" #: socialaccount/models.py:55 msgid "API secret, client secret, or consumer secret" msgstr "" "секретний ключ додатку, секретний ключ клієнта або секретний ключ користувача" #: socialaccount/models.py:58 msgid "Key" msgstr "Ключ" #: socialaccount/models.py:74 msgid "social application" msgstr "соціальний додаток" #: socialaccount/models.py:75 msgid "social applications" msgstr "соціальні додатки" #: socialaccount/models.py:105 msgid "uid" msgstr "ID користувача" #: socialaccount/models.py:107 msgid "last login" msgstr "дата останнього входу" #: socialaccount/models.py:108 msgid "date joined" msgstr "дата реєстрації" #: socialaccount/models.py:109 msgid "extra data" msgstr "додаткові дані" #: socialaccount/models.py:113 msgid "social account" msgstr "аккаунт соціальної мережі" #: socialaccount/models.py:114 msgid "social accounts" msgstr "акаунти соціальних мереж" #: socialaccount/models.py:139 msgid "token" msgstr "токен" #: socialaccount/models.py:140 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "\"oauth_token\" (OAuth1) або access token (OAuth2)" #: socialaccount/models.py:144 msgid "token secret" msgstr "секретний токен" #: socialaccount/models.py:145 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "\"oauth_token_secret\" (OAuth1) або refresh token (OAuth2)" #: socialaccount/models.py:148 msgid "expires at" msgstr "закінчується" #: socialaccount/models.py:153 msgid "social application token" msgstr "токен соціального додатку" #: socialaccount/models.py:154 msgid "social application tokens" msgstr "токени соціальних додатків" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "Невірні дані профілю" #: socialaccount/providers/oauth/client.py:85 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Невірна відповідь під час отримання запиту від \"%s\"" #: socialaccount/providers/oauth/client.py:117 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Невірна відповідь під час отримання токену доступу від \"%s\"." #: socialaccount/providers/oauth/client.py:138 #, python-format msgid "No request token saved for \"%s\"." msgstr "Немає збереженого ключа запиту для \"%s\"." #: socialaccount/providers/oauth/client.py:189 #, python-format msgid "No access token saved for \"%s\"." msgstr "Токен доступу не збережений для \"%s\"." #: socialaccount/providers/oauth/client.py:210 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Немає токену доступу для приватних ресурсів від \"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:8 msgid "Account Inactive" msgstr "Акаунт неактивний" #: templates/account/account_inactive.html:10 msgid "This account is inactive." msgstr "Даний акаунт неактивний" #: templates/account/email.html:5 templates/account/email.html:8 msgid "E-mail Addresses" msgstr "E-mail адреса" #: templates/account/email.html:10 msgid "The following e-mail addresses are associated with your account:" msgstr "Вказаний e-mail уже прикріплений до цього акаунту" #: templates/account/email.html:24 msgid "Verified" msgstr "Підтверджено" #: templates/account/email.html:26 msgid "Unverified" msgstr "Непідтверджено" #: templates/account/email.html:28 msgid "Primary" msgstr "Основний" #: templates/account/email.html:34 msgid "Make Primary" msgstr "Зробити основним" #: templates/account/email.html:35 msgid "Re-send Verification" msgstr "Надіслати підтвердження ще раз" #: templates/account/email.html:36 templates/socialaccount/connections.html:35 msgid "Remove" msgstr "Видалити" #: templates/account/email.html:43 msgid "Warning:" msgstr "Попередження:" #: templates/account/email.html:43 msgid "" "You currently do not have any e-mail address set up. You should really add " "an e-mail address so you can receive notifications, reset your password, etc." msgstr "" "На даний момент у Вас немає збереженої e-mail адреси. Рекомендуємо додати e-" "mail адресу, для того, щоб отримувати сповіщення, оновлювати паролі та інше." #: templates/account/email.html:48 msgid "Add E-mail Address" msgstr "Додати e-mail адресу" #: templates/account/email.html:53 msgid "Add E-mail" msgstr "Додати e-mail" #: templates/account/email.html:63 msgid "Do you really want to remove the selected e-mail address?" msgstr "Ви дійсно бажаєте видалити дану e-mail адресу?" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "Вітання від %(site_name)s!" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "Дякуємо Вам, що користуєтесь %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, python-format msgid "" "You're receiving this e-mail because user %(user_display)s has given your e-" "mail address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "Ви отримали дане повідомлення тому, що користувач %(user_display)s на " "%(site_domain)s зареєстрував дану e-mail адресу.\n" "\n" "Для підтвердження, що все правильно, будь ласка, перейдіть за " "%(activate_url)s" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your E-mail Address" msgstr "Будь ласка, підтвердіть Вашу e-mail адресу" #: templates/account/email/password_reset_key_message.txt:4 msgid "" "You're receiving this e-mail because you or someone else has requested a " "password for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Ви отримали дане повідомлення, тому що Ви або хтось інший зробили запит на " "пароль для Вашого акаунту користувача на сайті %(site_domain)s.\n" "Дане повідомлення можна проігнорувати, якщо Ви не робили такого запиту. " "Перейдіть за посиланням для відновлення паролю." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "На випадок, якщо Ви забули Ваше ім'я користувача %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 msgid "Password Reset E-mail" msgstr "E-mail для відновлення паролю" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm E-mail Address" msgstr "Підтвердити e-mail адресу" #: templates/account/email_confirm.html:16 #, python-format msgid "" "Please confirm that %(email)s is an e-mail " "address for user %(user_display)s." msgstr "" "Будь ласка, підтвердіть, що %(email)s це e-" "mail адреса для користувача %(user_display)s." #: templates/account/email_confirm.html:20 msgid "Confirm" msgstr "Підтвердити" #: templates/account/email_confirm.html:27 #, python-format msgid "" "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgstr "" "Дане посилання для підтвердження e-mail неактивне або неправильне. Будь " "ласка, зробіть новий запит для підтвердження e-" "mail адреси." #: templates/account/login.html:6 templates/account/login.html:10 #: templates/account/login.html:43 msgid "Sign In" msgstr "Увійти" #: templates/account/login.html:15 #, python-format msgid "" "Please sign in with one\n" "of your existing third party accounts. Or, sign " "up\n" "for a %(site_name)s account and sign in below:" msgstr "" "Будь ласка, увійдіть із одним \n" "із Ваших існуючих зовнішніх акаунтів accounts. Або, Зареєструйте\n" " %(site_name)s акаунт і Увійдіть:" #: templates/account/login.html:25 msgid "or" msgstr "або" #: templates/account/login.html:32 #, python-format msgid "" "If you have not created an account yet, then please\n" "sign up first." msgstr "" "Якщо Ви ще не зареєструвались, будь ласка\n" "зареєструйтесь." #: templates/account/login.html:42 templates/account/password_change.html:14 msgid "Forgot Password?" msgstr "Забули пароль?" #: templates/account/logout.html:5 templates/account/logout.html:8 #: templates/account/logout.html:17 msgid "Sign Out" msgstr "Вийти" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Ви впевнені, що бажаєте вийти?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary e-mail address (%(email)s)." msgstr "Ви можете видалити Вашу основну e-mail адресу (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation e-mail sent to %(email)s." msgstr "E-mail підтвердження надіслано на %(email)s." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "E-mail %(email)s підтверджено. " #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed e-mail address %(email)s." msgstr "E-mail %(email)s видалено." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Успішно увійшли як %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Ви вийшли." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Пароль успішно змінено." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Пароль успішно введено." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary e-mail address set." msgstr "Основну e-mail адресу введено." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary e-mail address must be verified." msgstr "Ваша основна e-mail адреса повинна бути підтверджена." #: templates/account/password_change.html:5 #: templates/account/password_change.html:8 #: templates/account/password_change.html:13 #: templates/account/password_reset_from_key.html:4 #: templates/account/password_reset_from_key.html:7 #: templates/account/password_reset_from_key_done.html:4 #: templates/account/password_reset_from_key_done.html:7 msgid "Change Password" msgstr "Змінити пароль" #: templates/account/password_reset.html:6 #: templates/account/password_reset.html:10 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:9 msgid "Password Reset" msgstr "Відновити пароль" #: templates/account/password_reset.html:15 msgid "" "Forgotten your password? Enter your e-mail address below, and we'll send you " "an e-mail allowing you to reset it." msgstr "" "Забули пароль? Введіть Вашу e-mail адресу у поле і ми надішлемо Вам e-mail, " "що дозволить відновити пароль." #: templates/account/password_reset.html:20 msgid "Reset My Password" msgstr "Відновити мій пароль" #: templates/account/password_reset.html:23 msgid "Please contact us if you have any trouble resetting your password." msgstr "" "Будь ласка, зв'яжіться з нами, якщо у Вас виникли проблеми по відновленню " "паролю." #: templates/account/password_reset_done.html:15 msgid "" "We have sent you an e-mail. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Ми надіслали Вам e-mail повідомлення. Будь ласка, зв'яжіться з нами, якщо Ви " "не отримаєте повідомлення протягом декількох хвилин." #: templates/account/password_reset_from_key.html:7 msgid "Bad Token" msgstr "Поганий токен" #: templates/account/password_reset_from_key.html:11 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Посилання для відновлення паролю некоректне, можливо через те, що посилання " "уже використане. Будь ласка, зробіть запит на нове відновлення паролю." #: templates/account/password_reset_from_key.html:17 msgid "change password" msgstr "змінити пароль" #: templates/account/password_reset_from_key.html:20 #: templates/account/password_reset_from_key_done.html:8 msgid "Your password is now changed." msgstr "Ваш пароль змінено." #: templates/account/password_set.html:5 templates/account/password_set.html:8 #: templates/account/password_set.html:13 msgid "Set Password" msgstr "Введіть пароль" #: templates/account/signup.html:5 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Зареєструватись" #: templates/account/signup.html:8 templates/account/signup.html:18 #: templates/socialaccount/signup.html:8 templates/socialaccount/signup.html:19 msgid "Sign Up" msgstr "Зареєструватись" #: templates/account/signup.html:10 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "" "Уже зареєстрованні? Будь ласка, увійдіть." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:8 msgid "Sign Up Closed" msgstr "Реєстрація закрита" #: templates/account/signup_closed.html:10 msgid "We are sorry, but the sign up is currently closed." msgstr "Перепрошуємо, але реєстрацію закрито." #: templates/account/snippets/already_logged_in.html:5 msgid "Note" msgstr "Зауважте" #: templates/account/snippets/already_logged_in.html:5 #, python-format msgid "you are already logged in as %(user_display)s." msgstr "Ви уже увійшли як %(user_display)s." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:8 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:8 msgid "Verify Your E-mail Address" msgstr "Підтвердіть Вашу e-mail адресу" #: templates/account/verification_sent.html:10 msgid "" "We have sent an e-mail to you for verification. Follow the link provided to " "finalize the signup process. Please contact us if you do not receive it " "within a few minutes." msgstr "" "Ми надіслали Вам e-mail для підтвердження. Перейдіть за посиланням для " "звершення процесу реєстрації. Будь ласка, зв'яжіться з нами, якщо Ви не " "отримаєте повідомлення впродовж декількох хвилин." #: templates/account/verified_email_required.html:12 msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your e-mail address. " msgstr "Дана частина сайту вимає підтвердження e-mail адреси." #: templates/account/verified_email_required.html:16 msgid "" "We have sent an e-mail to you for\n" "verification. Please click on the link inside this e-mail. Please\n" "contact us if you do not receive it within a few minutes." msgstr "" "Ми надіслали Вам e-mail для підтвердження.\n" "Будь ласка, перейдіть за посилання вказаним у e-mail повідомленні. Будь " "ласка,\n" "зв'яжіться з нами, якщо Ви не отримаєте повідомлення впродовж декількох " "хвилин." #: templates/account/verified_email_required.html:20 #, python-format msgid "" "Note: you can still change your e-" "mail address." msgstr "" "Зауважте: Ви все ще можете змінити Вашу e-mail адресу." #: templates/openid/login.html:9 msgid "OpenID Sign In" msgstr "OpenID вхід" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:8 msgid "Social Network Login Failure" msgstr "Вхід за допомогою соціальних мереж неуспішний." #: templates/socialaccount/authentication_error.html:10 msgid "" "An error occurred while attempting to login via your social network account." msgstr "" "Виникла помилка під час входу за допомогою Вашого акаунту у соц. мережах." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:8 msgid "Account Connections" msgstr "З'єднання акаунта" #: templates/socialaccount/connections.html:11 msgid "" "You can sign in to your account using any of the following third party " "accounts:" msgstr "Ви можете увійти використовуючи будь-який із зовнішніх акаунтів:" #: templates/socialaccount/connections.html:43 msgid "" "You currently have no social network accounts connected to this account." msgstr "" "На даний момент Ви не маєте жодного акаунту із соц. мереж приєднаного до " "даного акаунту." #: templates/socialaccount/connections.html:46 msgid "Add a 3rd Party Account" msgstr "Додати зовнішній акаунт" #: templates/socialaccount/login.html:6 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:8 #, python-format msgid "You are about to connect a new third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:10 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:12 #, python-format msgid "You are about to sign in using a third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Вхід відмінено" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Ви відмінили вхід на наш сайт, використовуючи один з Ваших існуючих " "акаунтів. Якщо це сталось помилково, будь ласка, увійдіть." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "Акаунт із соц. мереж було приєднано." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "Акаунт із соц. мереж уже приєднано до іншого акаунту." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Акаунт із соц. мереж було від'єднано." #: templates/socialaccount/signup.html:10 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Ви використовуєте Ваш %(provider_name)s акаунт для авторизації на\n" "%(site_name)s. Для завершення, будь ласка, заповніть наступну форму:" #~ msgid "Account" #~ msgstr "Акаунт" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "Введений login і/або пароль є некоректними." #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "" #~ "Ім'я користувача може містити тільки букви, цифри та символи @/./+/-/_." #~ msgid "This username is already taken. Please choose another." #~ msgstr "" #~ "Ім'я користувача уже використовується. Будь ласка, оберіть інше ім'я " #~ "користувача." #, fuzzy #~| msgid "Sign In" #~ msgid "Shopify Sign In" #~ msgstr "Увійти" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "Ви підтвердили, що %(email)s це e-mail " #~ "адреса для користувача %(user_display)s." #~ msgid "Thanks for using our site!" #~ msgstr "Дякуємо за користування нашим сайтом!" django-allauth-0.47.0/allauth/locale/zh_CN/000077500000000000000000000000001415442050100203625ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/zh_CN/LC_MESSAGES/000077500000000000000000000000001415442050100221475ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/zh_CN/LC_MESSAGES/django.po000066400000000000000000000700021415442050100237500ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: django-allauth\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-12-09 08:41-0600\n" "PO-Revision-Date: 2014-08-12 00:36+0200\n" "Last-Translator: jresins \n" "Language-Team: LANGUAGE \n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: account/adapter.py:45 msgid "Username can not be used. Please use other username." msgstr "此用户名不能使用,请改用其他用户名。" #: account/adapter.py:51 msgid "Too many failed login attempts. Try again later." msgstr "登录失败次数过多,请稍后重试。" #: account/adapter.py:53 msgid "A user is already registered with this e-mail address." msgstr "此e-mail地址已被其他用户注册。" #: account/adapter.py:300 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "密码长度不得少于 {0} 个字符。" #: account/apps.py:7 #, fuzzy msgid "Accounts" msgstr "账号" #: account/forms.py:59 account/forms.py:413 msgid "You must type the same password each time." msgstr "每次输入的密码必须相同" #: account/forms.py:92 account/forms.py:381 account/forms.py:498 msgid "Password" msgstr "密码" #: account/forms.py:93 msgid "Remember Me" msgstr "记住我" #: account/forms.py:97 msgid "This account is currently inactive." msgstr "此账号当前未激活。" #: account/forms.py:99 msgid "The e-mail address and/or password you specified are not correct." msgstr "您提供的e-mail地址或密码不正确。" #: account/forms.py:102 msgid "The username and/or password you specified are not correct." msgstr "您提供的用户名或密码不正确。" #: account/forms.py:113 account/forms.py:279 account/forms.py:439 #: account/forms.py:517 msgid "E-mail address" msgstr "E-mail地址" #: account/forms.py:117 account/forms.py:316 account/forms.py:436 #: account/forms.py:512 msgid "E-mail" msgstr "E-mail" #: account/forms.py:120 account/forms.py:123 account/forms.py:269 #: account/forms.py:272 msgid "Username" msgstr "用户名" #: account/forms.py:133 msgid "Username or e-mail" msgstr "用户名或e-mail" #: account/forms.py:136 msgctxt "field label" msgid "Login" msgstr "账号" #: account/forms.py:307 #, fuzzy #| msgid "E-mail (optional)" msgid "E-mail (again)" msgstr "E-mail (选填项)" #: account/forms.py:311 #, fuzzy #| msgid "email confirmation" msgid "E-mail address confirmation" msgstr "e-mail确认" #: account/forms.py:319 msgid "E-mail (optional)" msgstr "E-mail (选填项)" #: account/forms.py:359 #, fuzzy #| msgid "You must type the same password each time." msgid "You must type the same email each time." msgstr "每次输入的密码必须相同" #: account/forms.py:384 account/forms.py:499 msgid "Password (again)" msgstr "密码(重复)" #: account/forms.py:448 msgid "This e-mail address is already associated with this account." msgstr "此e-mail地址已关联到这个账号。" #: account/forms.py:451 msgid "This e-mail address is already associated with another account." msgstr "此e-mail地址已关联到其他账号。" #: account/forms.py:453 #, fuzzy, python-format #| msgid "Your account has no verified e-mail address." msgid "You cannot add more than %d e-mail addresses." msgstr "您的账号下无任何验证过的e-mail地址。" #: account/forms.py:478 msgid "Current Password" msgstr "当前密码" #: account/forms.py:480 account/forms.py:570 msgid "New Password" msgstr "新密码" #: account/forms.py:481 account/forms.py:571 msgid "New Password (again)" msgstr "新密码(重复)" #: account/forms.py:489 msgid "Please type your current password." msgstr "请输入您的当前密码" #: account/forms.py:529 msgid "The e-mail address is not assigned to any user account" msgstr "此e-mail地址未分配给任何用户账号" #: account/forms.py:592 msgid "The password reset token was invalid." msgstr "重设密码的token不合法。" #: account/models.py:22 msgid "user" msgstr "用户" #: account/models.py:28 account/models.py:83 #, fuzzy msgid "e-mail address" msgstr "e-mail地址" #: account/models.py:30 msgid "verified" msgstr "已验证" #: account/models.py:31 #, fuzzy msgid "primary" msgstr "首选e-mail" #: account/models.py:36 msgid "email address" msgstr "e-mail地址" #: account/models.py:37 msgid "email addresses" msgstr "e-mail地址" #: account/models.py:86 msgid "created" msgstr "已建立" #: account/models.py:87 msgid "sent" msgstr "已发送" #: account/models.py:88 socialaccount/models.py:58 msgid "key" msgstr "key" #: account/models.py:93 msgid "email confirmation" msgstr "e-mail确认" #: account/models.py:94 msgid "email confirmations" msgstr "e-mail确认" #: socialaccount/adapter.py:26 #, python-format msgid "" "An account already exists with this e-mail address. Please sign in to that " "account first, then connect your %s account." msgstr "已有一个账号与此e-mail地址关联,请先登录该账号,然后连接你的 %s 账号。" #: socialaccount/adapter.py:131 msgid "Your account has no password set up." msgstr "您的账号未设置密码。" #: socialaccount/adapter.py:138 msgid "Your account has no verified e-mail address." msgstr "您的账号下无任何验证过的e-mail地址。" #: socialaccount/apps.py:7 #, fuzzy msgid "Social Accounts" msgstr "账号" #: socialaccount/models.py:41 socialaccount/models.py:84 msgid "provider" msgstr "提供商" #: socialaccount/models.py:45 #, fuzzy msgid "name" msgstr "用户名" #: socialaccount/models.py:47 msgid "client id" msgstr "客户端 id" #: socialaccount/models.py:49 msgid "App ID, or consumer key" msgstr "" #: socialaccount/models.py:52 msgid "secret key" msgstr "" #: socialaccount/models.py:55 msgid "API secret, client secret, or consumer secret" msgstr "" #: socialaccount/models.py:58 #, fuzzy msgid "Key" msgstr "key" #: socialaccount/models.py:74 msgid "social application" msgstr "" #: socialaccount/models.py:75 msgid "social applications" msgstr "" #: socialaccount/models.py:105 msgid "uid" msgstr "" #: socialaccount/models.py:107 msgid "last login" msgstr "最后登录" #: socialaccount/models.py:108 msgid "date joined" msgstr "注册日期" #: socialaccount/models.py:109 msgid "extra data" msgstr "" #: socialaccount/models.py:113 msgid "social account" msgstr "社交账号" #: socialaccount/models.py:114 msgid "social accounts" msgstr "社交账号" #: socialaccount/models.py:139 msgid "token" msgstr "" #: socialaccount/models.py:140 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "" #: socialaccount/models.py:144 msgid "token secret" msgstr "" #: socialaccount/models.py:145 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "" #: socialaccount/models.py:148 msgid "expires at" msgstr "" #: socialaccount/models.py:153 msgid "social application token" msgstr "" #: socialaccount/models.py:154 msgid "social application tokens" msgstr "" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "" #: socialaccount/providers/oauth/client.py:85 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Invalid response while obtaining request token from \"%s\"." #: socialaccount/providers/oauth/client.py:117 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Invalid response while obtaining access token from \"%s\"." #: socialaccount/providers/oauth/client.py:138 #, python-format msgid "No request token saved for \"%s\"." msgstr "No request token saved for \"%s\"." #: socialaccount/providers/oauth/client.py:189 #, python-format msgid "No access token saved for \"%s\"." msgstr "No access token saved for \"%s\"." #: socialaccount/providers/oauth/client.py:210 #, python-format msgid "No access to private resources at \"%s\"." msgstr "无权访问私有资源 \"%s\"。" #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:8 msgid "Account Inactive" msgstr "账号未激活" #: templates/account/account_inactive.html:10 msgid "This account is inactive." msgstr "此账号未激活" #: templates/account/email.html:5 templates/account/email.html:8 msgid "E-mail Addresses" msgstr "E-mail地址" #: templates/account/email.html:10 msgid "The following e-mail addresses are associated with your account:" msgstr "以下e-mail地址已关联到您的帐号:" #: templates/account/email.html:24 msgid "Verified" msgstr "已验证" #: templates/account/email.html:26 msgid "Unverified" msgstr "未验证" #: templates/account/email.html:28 msgid "Primary" msgstr "首选e-mail" #: templates/account/email.html:34 msgid "Make Primary" msgstr "设置首选e-mail" #: templates/account/email.html:35 msgid "Re-send Verification" msgstr "重发验证e-mail" #: templates/account/email.html:36 templates/socialaccount/connections.html:35 msgid "Remove" msgstr "移除" #: templates/account/email.html:43 msgid "Warning:" msgstr "警告:" #: templates/account/email.html:43 msgid "" "You currently do not have any e-mail address set up. You should really add " "an e-mail address so you can receive notifications, reset your password, etc." msgstr "" "您当前未设置任何邮件地址。您需要设置一个邮件地址,以便接收通知,重置密码等。" #: templates/account/email.html:48 msgid "Add E-mail Address" msgstr "添加E-mail地址" #: templates/account/email.html:53 msgid "Add E-mail" msgstr "添加E-mail" #: templates/account/email.html:63 msgid "Do you really want to remove the selected e-mail address?" msgstr "您真的想移除选定的e-mail地址吗?" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "User %(user_display)s at %(site_name)s has given this as an email " #| "address.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s\n" msgid "" "You're receiving this e-mail because user %(user_display)s has given your e-" "mail address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "网站%(site_name)s上的用户%(user_display)s将此设为其e-mail地址。\n" "\n" "为验证这是正确的,请访问%(activate_url)s\n" #: templates/account/email/email_confirmation_subject.txt:3 #, fuzzy #| msgid "Confirm E-mail Address" msgid "Please Confirm Your E-mail Address" msgstr "确认E-mail地址" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account at %(site_domain)s.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this e-mail because you or someone else has requested a " "password for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "您收到此邮件表示您或者他人在网站 %(site_domain)s上为您的账号请求了密码重" "置。\n" "若您未请求密码重置,可以直接忽略此邮件。如要重置密码,请点击下面的链接。" #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "作为提示,您的用户名是%(username)s." #: templates/account/email/password_reset_key_subject.txt:3 msgid "Password Reset E-mail" msgstr "密码重置邮件" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm E-mail Address" msgstr "确认E-mail地址" #: templates/account/email_confirm.html:16 #, python-format msgid "" "Please confirm that %(email)s is an e-mail " "address for user %(user_display)s." msgstr "" "请确认%(email)s是否是用户 %(user_display)s的" "e-mail地址。" #: templates/account/email_confirm.html:20 msgid "Confirm" msgstr "确认" #: templates/account/email_confirm.html:27 #, python-format msgid "" "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgstr "" "e-mail验证链接失效或无效。请点击 发起新的e-mail验证" "请求。" #: templates/account/login.html:6 templates/account/login.html:10 #: templates/account/login.html:43 msgid "Sign In" msgstr "登录" #: templates/account/login.html:15 #, fuzzy, python-format msgid "" "Please sign in with one\n" "of your existing third party accounts. Or, sign " "up\n" "for a %(site_name)s account and sign in below:" msgstr "" "请用您的第三方账号登录。\n" "或者注册 \n" "一个 %(site_name)s账号并登录:" #: templates/account/login.html:25 msgid "or" msgstr "或" #: templates/account/login.html:32 #, python-format msgid "" "If you have not created an account yet, then please\n" "sign up first." msgstr "" "如果没有账号,请先\n" "注册 。" #: templates/account/login.html:42 templates/account/password_change.html:14 msgid "Forgot Password?" msgstr "忘记密码了?" #: templates/account/logout.html:5 templates/account/logout.html:8 #: templates/account/logout.html:17 msgid "Sign Out" msgstr "注销" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "您确定要注销登录吗?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary e-mail address (%(email)s)." msgstr "您不能删除您的主e-mail地址 (%(email)s) " #: templates/account/messages/email_confirmation_sent.txt:2 #, fuzzy, python-format msgid "Confirmation e-mail sent to %(email)s." msgstr "确认e-mail已发往 %(email)s" #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "您已确认e-mail地址 %(email)s " #: templates/account/messages/email_deleted.txt:2 #, fuzzy, python-format msgid "Removed e-mail address %(email)s." msgstr "e-mail地址 %(email)s 已删除" #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "以 %(name)s..身份成功登录" #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "您已注销登录。" #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "密码修改成功。" #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "密码设置成功。" #: templates/account/messages/primary_email_set.txt:2 msgid "Primary e-mail address set." msgstr "主e-mail地址已设置" #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary e-mail address must be verified." msgstr "您的主e-mail地址必须被验证。" #: templates/account/password_change.html:5 #: templates/account/password_change.html:8 #: templates/account/password_change.html:13 #: templates/account/password_reset_from_key.html:4 #: templates/account/password_reset_from_key.html:7 #: templates/account/password_reset_from_key_done.html:4 #: templates/account/password_reset_from_key_done.html:7 msgid "Change Password" msgstr "修改密码" #: templates/account/password_reset.html:6 #: templates/account/password_reset.html:10 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:9 msgid "Password Reset" msgstr "密码重置" #: templates/account/password_reset.html:15 msgid "" "Forgotten your password? Enter your e-mail address below, and we'll send you " "an e-mail allowing you to reset it." msgstr "" "忘记密码?在下面输入您的e-mail地址,我们将给您发送一封e-mail,以便重置密码。" #: templates/account/password_reset.html:20 msgid "Reset My Password" msgstr "重置我的密码" #: templates/account/password_reset.html:23 msgid "Please contact us if you have any trouble resetting your password." msgstr "如在重置密码时遇到问题,请与我们联系。" #: templates/account/password_reset_done.html:15 msgid "" "We have sent you an e-mail. Please contact us if you do not receive it " "within a few minutes." msgstr "我们已给您发了一封e-mail,如您在几分钟后仍没收到,请与我们联系。" #: templates/account/password_reset_from_key.html:7 msgid "Bad Token" msgstr "Bad Token" #: templates/account/password_reset_from_key.html:11 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "密码重置链接无效,可能该链接已被使用。请重新申请链接重置。" #: templates/account/password_reset_from_key.html:17 msgid "change password" msgstr "修改密码" #: templates/account/password_reset_from_key.html:20 #: templates/account/password_reset_from_key_done.html:8 msgid "Your password is now changed." msgstr "您的密码现已被修改。" #: templates/account/password_set.html:5 templates/account/password_set.html:8 #: templates/account/password_set.html:13 msgid "Set Password" msgstr "设置密码" #: templates/account/signup.html:5 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "注册" #: templates/account/signup.html:8 templates/account/signup.html:18 #: templates/socialaccount/signup.html:8 templates/socialaccount/signup.html:19 msgid "Sign Up" msgstr "注册" #: templates/account/signup.html:10 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "已经有一个账号? 请登录." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:8 msgid "Sign Up Closed" msgstr "已关闭注册" #: templates/account/signup_closed.html:10 msgid "We are sorry, but the sign up is currently closed." msgstr "非常抱歉,当前已关闭注册。" #: templates/account/snippets/already_logged_in.html:5 msgid "Note" msgstr "注意" #: templates/account/snippets/already_logged_in.html:5 #, python-format msgid "you are already logged in as %(user_display)s." msgstr "您已以 %(user_display)s的身份登录" #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:8 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:8 msgid "Verify Your E-mail Address" msgstr "验证您的E-mail地址。" #: templates/account/verification_sent.html:10 msgid "" "We have sent an e-mail to you for verification. Follow the link provided to " "finalize the signup process. Please contact us if you do not receive it " "within a few minutes." msgstr "" "我们已向您发了一封验证e-mail。点击e-mail中的链接完成注册流程。如果您在几分钟" "后仍未收到邮件,请与我们联系。" #: templates/account/verified_email_required.html:12 msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your e-mail address. " msgstr "" "网站的这部分功能要求验证您的真实身份。\n" "为此,我们需要您确认您是此账号e-mail地址的所有者。" #: templates/account/verified_email_required.html:16 msgid "" "We have sent an e-mail to you for\n" "verification. Please click on the link inside this e-mail. Please\n" "contact us if you do not receive it within a few minutes." msgstr "" "我们已经给您发送了一封e-mail验证邮件。\n" "请点击e-mail中的链接。若您在几分钟后仍未收到邮件,请联系我们。" #: templates/account/verified_email_required.html:20 #, python-format msgid "" "Note: you can still change your e-" "mail address." msgstr "" "注意: 您仍然能够修改您的e-mail地" "址 ." #: templates/openid/login.html:9 msgid "OpenID Sign In" msgstr "OpenID登录" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:8 msgid "Social Network Login Failure" msgstr "社交网络登录失败" #: templates/socialaccount/authentication_error.html:10 msgid "" "An error occurred while attempting to login via your social network account." msgstr "当尝试用您的社交网络账号登录时,发生了一个错误。" #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:8 msgid "Account Connections" msgstr "账号链接" #: templates/socialaccount/connections.html:11 msgid "" "You can sign in to your account using any of the following third party " "accounts:" msgstr "您可以用您的以下任何第三方账号登录" #: templates/socialaccount/connections.html:43 msgid "" "You currently have no social network accounts connected to this account." msgstr "您当前没有任何社交网络账号与此账号关联" #: templates/socialaccount/connections.html:46 msgid "Add a 3rd Party Account" msgstr "添加一个第三方账号" #: templates/socialaccount/login.html:6 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:8 #, python-format msgid "You are about to connect a new third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:10 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:12 #, python-format msgid "You are about to sign in using a third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "登录已取消" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "您决定取消使用您的已有账号登录我们的网站。如果这是一个失误,请继续登录." #: templates/socialaccount/messages/account_connected.txt:2 #, fuzzy msgid "The social account has been connected." msgstr "社交账号已连接" #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "社交账号已连接到另一个账号。" #: templates/socialaccount/messages/account_disconnected.txt:2 #, fuzzy msgid "The social account has been disconnected." msgstr "社交账号已断开连接" #: templates/socialaccount/signup.html:10 #, fuzzy, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "您将使用您的%(provider_name)s账号登录\n" "%(site_name)s。作为最后一步,请完成以下表单:" #~ msgid "Account" #~ msgstr "账号" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "您提供的账号或密码错误" #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "用户名只能包含字母,数字和@/./+/-/_." #~ msgid "This username is already taken. Please choose another." #~ msgstr "此用户名已被使用,请选择其他用户名。" #, fuzzy #~| msgid "Sign In" #~ msgid "Shopify Sign In" #~ msgstr "登录" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "您已确认%(email)s是用户%(user_display)s的" #~ "e-mail地址。" #~ msgid "Thanks for using our site!" #~ msgstr "感谢您使用我们的网站!" #~ msgid "Confirmation e-mail sent to %(email)s" #~ msgstr "确认e-mail已发往 %(email)s" #~ msgid "Delete Password" #~ msgstr "删除密码" #~ msgid "" #~ "You may delete your password since you are currently logged in using " #~ "OpenID." #~ msgstr "您当前使用OpenID登录,因此您可以删除你的密码。" #~ msgid "delete my password" #~ msgstr "删除我的密码" #~ msgid "Password Deleted" #~ msgstr "密码已删除" #~ msgid "Your password has been deleted." #~ msgstr "您的密码已被删除。" #~ msgid "Your e-mail address has already been verified" #~ msgstr "您的e-mail地址已经认证。" #~ msgid "" #~ "If you have any trouble resetting your password, contact us at %(CONTACT_EMAIL)s." #~ msgstr "" #~ "如果您在重置密码中遇到任何问题,请联系我们%(CONTACT_EMAIL)s." #~ msgid "Invalid confirmation key." #~ msgstr "不合法的确认密匙" #~ msgid "OpenID" #~ msgstr "OpenID" #~ msgid "Already have an account?" #~ msgstr "已经有账户了?" #~ msgid "Sign in" #~ msgstr "注册" #~ msgid "Language" #~ msgstr "语言" #~ msgid "Pinax can be used in your preferred language." #~ msgstr "Pinax可以在您的首选语言中使用。" #~ msgid "Change my language" #~ msgstr "切换我的语言" #~ msgid "Timezone" #~ msgstr "时区" #, fuzzy #~ msgid "" #~ "You're receiving this e-mail because you requested a password reset\n" #~ "for your user account at Pinax.\n" #~ "\n" #~ "Your new password is: %(new_password)s\n" #~ "\n" #~ "Your username, in case you've forgotten: %(username)s\n" #~ "\n" #~ "You should log in as soon as possible and change your password.\n" #~ "\n" #~ "Thanks for using our site!\n" #~ msgstr "" #~ "Je ontvangt deze mail omdat er een verzoek is ingelegd om het wachtwoord\n" #~ "behorende bij je %(site_name)s account opnieuw in te stellen.\n" #~ "\n" #~ "Je nieuwe wachtwoord is: %(new_password)s\n" #~ "\n" #~ "Je gebruikersnaam, voor het geval je die vergeten bent, is: %(username)s\n" #~ "\n" #~ "Je moet zo snel mogelijk inloggen en bovenstaand wachtwoord veranderen.\n" #~ "\n" #~ "Bedankt voor het gebruik van onze site!\n" #~ msgid "If checked you will stay logged in for 3 weeks" #~ msgstr "Bij 'Onthouden' blijf je ingelogd gedurende 3 weken" #~ msgid "Timezone successfully updated." #~ msgstr "Tijdzone gewijzigd." #~ msgid "Language successfully updated." #~ msgstr "Taal gewijzigd." #~ msgid "E-Mail Addresses" #~ msgstr "E-mail adressen" #~ msgid "None" #~ msgstr "Geen" #~ msgid "add" #~ msgstr "Voeg toe" #~ msgid "Log In" #~ msgstr "Inloggen" #~ msgid "Log in" #~ msgstr "Inloggen" #~ msgid "Logout" #~ msgstr "Afmelden" #~ msgid "" #~ "When you receive the new password, you should log in and change it as soon as possible." #~ msgstr "" #~ "Zodra je het nieuwe wachtwoord ontvangen hebt moet je zo snel mogelijk inloggen en het wachtwoord wijzigen." #~ msgid "You are already logged in." #~ msgstr "Je bent al ingelogd." #~ msgid "" #~ "By clicking \"Sign Up\", you are indicating that you have read and agree " #~ "to the Terms of Use and Privacy Policy." #~ msgstr "" #~ "Door te registreren geef je aan dat je de gebruiksvoorwaarden en de privacy " #~ "policy gelezen hebt en ermee akkoord gaat." #~ msgid "" #~ "If you have any trouble creating your account, contact us at %(contact_email)s." #~ msgstr "" #~ "Als je problemen hebt om een account aan te maken, neem dan contact op " #~ "met %(contact_email)s." #~ msgid "Log in »" #~ msgstr "Inloggen" django-allauth-0.47.0/allauth/locale/zh_Hans/000077500000000000000000000000001415442050100207535ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/zh_Hans/LC_MESSAGES/000077500000000000000000000000001415442050100225405ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/zh_Hans/LC_MESSAGES/django.po000066400000000000000000000677541415442050100243650ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-12-09 08:41-0600\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" #: account/adapter.py:45 msgid "Username can not be used. Please use other username." msgstr "此用户名不能使用,请改用其他用户名。" #: account/adapter.py:51 msgid "Too many failed login attempts. Try again later." msgstr "登录失败次数过多,请稍后重试。" #: account/adapter.py:53 msgid "A user is already registered with this e-mail address." msgstr "此e-mail地址已被其他用户注册。" #: account/adapter.py:300 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "密码长度不得少于 {0} 个字符。" #: account/apps.py:7 #, fuzzy msgid "Accounts" msgstr "账号" #: account/forms.py:59 account/forms.py:413 msgid "You must type the same password each time." msgstr "每次输入的密码必须相同" #: account/forms.py:92 account/forms.py:381 account/forms.py:498 msgid "Password" msgstr "密码" #: account/forms.py:93 msgid "Remember Me" msgstr "记住我" #: account/forms.py:97 msgid "This account is currently inactive." msgstr "此账号当前未激活。" #: account/forms.py:99 msgid "The e-mail address and/or password you specified are not correct." msgstr "您提供的e-mail地址或密码不正确。" #: account/forms.py:102 msgid "The username and/or password you specified are not correct." msgstr "您提供的用户名或密码不正确。" #: account/forms.py:113 account/forms.py:279 account/forms.py:439 #: account/forms.py:517 msgid "E-mail address" msgstr "E-mail地址" #: account/forms.py:117 account/forms.py:316 account/forms.py:436 #: account/forms.py:512 msgid "E-mail" msgstr "E-mail" #: account/forms.py:120 account/forms.py:123 account/forms.py:269 #: account/forms.py:272 msgid "Username" msgstr "用户名" #: account/forms.py:133 msgid "Username or e-mail" msgstr "用户名或e-mail" #: account/forms.py:136 msgctxt "field label" msgid "Login" msgstr "账号" #: account/forms.py:307 #, fuzzy #| msgid "E-mail (optional)" msgid "E-mail (again)" msgstr "E-mail (选填项)" #: account/forms.py:311 #, fuzzy #| msgid "email confirmation" msgid "E-mail address confirmation" msgstr "e-mail确认" #: account/forms.py:319 msgid "E-mail (optional)" msgstr "E-mail (选填项)" #: account/forms.py:359 #, fuzzy #| msgid "You must type the same password each time." msgid "You must type the same email each time." msgstr "每次输入的密码必须相同" #: account/forms.py:384 account/forms.py:499 msgid "Password (again)" msgstr "密码(重复)" #: account/forms.py:448 msgid "This e-mail address is already associated with this account." msgstr "此e-mail地址已关联到这个账号。" #: account/forms.py:451 msgid "This e-mail address is already associated with another account." msgstr "此e-mail地址已关联到其他账号。" #: account/forms.py:453 #, fuzzy, python-format #| msgid "Your account has no verified e-mail address." msgid "You cannot add more than %d e-mail addresses." msgstr "您的账号下无任何验证过的e-mail地址。" #: account/forms.py:478 msgid "Current Password" msgstr "当前密码" #: account/forms.py:480 account/forms.py:570 msgid "New Password" msgstr "新密码" #: account/forms.py:481 account/forms.py:571 msgid "New Password (again)" msgstr "新密码(重复)" #: account/forms.py:489 msgid "Please type your current password." msgstr "请输入您的当前密码" #: account/forms.py:529 msgid "The e-mail address is not assigned to any user account" msgstr "此e-mail地址未分配给任何用户账号" #: account/forms.py:592 msgid "The password reset token was invalid." msgstr "" #: account/models.py:22 msgid "user" msgstr "用户" #: account/models.py:28 account/models.py:83 #, fuzzy msgid "e-mail address" msgstr "e-mail地址" #: account/models.py:30 msgid "verified" msgstr "已验证" #: account/models.py:31 #, fuzzy msgid "primary" msgstr "首选e-mail" #: account/models.py:36 msgid "email address" msgstr "e-mail地址" #: account/models.py:37 msgid "email addresses" msgstr "e-mail地址" #: account/models.py:86 msgid "created" msgstr "已建立" #: account/models.py:87 msgid "sent" msgstr "已发送" #: account/models.py:88 socialaccount/models.py:58 msgid "key" msgstr "key" #: account/models.py:93 msgid "email confirmation" msgstr "e-mail确认" #: account/models.py:94 msgid "email confirmations" msgstr "e-mail确认" #: socialaccount/adapter.py:26 #, python-format msgid "" "An account already exists with this e-mail address. Please sign in to that " "account first, then connect your %s account." msgstr "已有一个账号与此e-mail地址关联,请先登录该账号,然后连接你的 %s 账号。" #: socialaccount/adapter.py:131 msgid "Your account has no password set up." msgstr "您的账号未设置密码。" #: socialaccount/adapter.py:138 msgid "Your account has no verified e-mail address." msgstr "您的账号下无任何验证过的e-mail地址。" #: socialaccount/apps.py:7 #, fuzzy msgid "Social Accounts" msgstr "账号" #: socialaccount/models.py:41 socialaccount/models.py:84 msgid "provider" msgstr "" #: socialaccount/models.py:45 #, fuzzy msgid "name" msgstr "用户名" #: socialaccount/models.py:47 msgid "client id" msgstr "" #: socialaccount/models.py:49 msgid "App ID, or consumer key" msgstr "" #: socialaccount/models.py:52 msgid "secret key" msgstr "" #: socialaccount/models.py:55 msgid "API secret, client secret, or consumer secret" msgstr "" #: socialaccount/models.py:58 #, fuzzy msgid "Key" msgstr "key" #: socialaccount/models.py:74 msgid "social application" msgstr "" #: socialaccount/models.py:75 msgid "social applications" msgstr "" #: socialaccount/models.py:105 msgid "uid" msgstr "" #: socialaccount/models.py:107 msgid "last login" msgstr "" #: socialaccount/models.py:108 msgid "date joined" msgstr "" #: socialaccount/models.py:109 msgid "extra data" msgstr "" #: socialaccount/models.py:113 msgid "social account" msgstr "" #: socialaccount/models.py:114 msgid "social accounts" msgstr "" #: socialaccount/models.py:139 msgid "token" msgstr "" #: socialaccount/models.py:140 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "" #: socialaccount/models.py:144 msgid "token secret" msgstr "" #: socialaccount/models.py:145 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "" #: socialaccount/models.py:148 msgid "expires at" msgstr "" #: socialaccount/models.py:153 msgid "social application token" msgstr "" #: socialaccount/models.py:154 msgid "social application tokens" msgstr "" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "" #: socialaccount/providers/oauth/client.py:85 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Invalid response while obtaining request token from \"%s\"." #: socialaccount/providers/oauth/client.py:117 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Invalid response while obtaining access token from \"%s\"." #: socialaccount/providers/oauth/client.py:138 #, python-format msgid "No request token saved for \"%s\"." msgstr "No request token saved for \"%s\"." #: socialaccount/providers/oauth/client.py:189 #, python-format msgid "No access token saved for \"%s\"." msgstr "No access token saved for \"%s\"." #: socialaccount/providers/oauth/client.py:210 #, python-format msgid "No access to private resources at \"%s\"." msgstr "无权访问私有资源 \"%s\"。" #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:8 msgid "Account Inactive" msgstr "账号未激活" #: templates/account/account_inactive.html:10 msgid "This account is inactive." msgstr "此账号未激活" #: templates/account/email.html:5 templates/account/email.html:8 msgid "E-mail Addresses" msgstr "E-mail地址" #: templates/account/email.html:10 msgid "The following e-mail addresses are associated with your account:" msgstr "以下e-mail地址已关联到您的帐号:" #: templates/account/email.html:24 msgid "Verified" msgstr "已验证" #: templates/account/email.html:26 msgid "Unverified" msgstr "未验证" #: templates/account/email.html:28 msgid "Primary" msgstr "首选e-mail" #: templates/account/email.html:34 msgid "Make Primary" msgstr "设置首选e-mail" #: templates/account/email.html:35 msgid "Re-send Verification" msgstr "重发验证e-mail" #: templates/account/email.html:36 templates/socialaccount/connections.html:35 msgid "Remove" msgstr "移除" #: templates/account/email.html:43 msgid "Warning:" msgstr "警告:" #: templates/account/email.html:43 msgid "" "You currently do not have any e-mail address set up. You should really add " "an e-mail address so you can receive notifications, reset your password, etc." msgstr "" "您当前未设置任何邮件地址。您需要设置一个邮件地址,以便接收通知,重置密码等。" #: templates/account/email.html:48 msgid "Add E-mail Address" msgstr "添加E-mail地址" #: templates/account/email.html:53 msgid "Add E-mail" msgstr "添加E-mail" #: templates/account/email.html:63 msgid "Do you really want to remove the selected e-mail address?" msgstr "您真的想移除选定的e-mail地址吗?" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "User %(user_display)s at %(site_name)s has given this as an email " #| "address.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s\n" msgid "" "You're receiving this e-mail because user %(user_display)s has given your e-" "mail address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "网站%(site_name)s上的用户%(user_display)s将此设为其e-mail地址。\n" "\n" "为验证这是正确的,请访问%(activate_url)s\n" #: templates/account/email/email_confirmation_subject.txt:3 #, fuzzy #| msgid "Confirm E-mail Address" msgid "Please Confirm Your E-mail Address" msgstr "确认E-mail地址" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account at %(site_domain)s.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this e-mail because you or someone else has requested a " "password for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "您收到此邮件表示您或者他人在网站 %(site_name)s上为您的账号请求了密码重置。\n" "若您未请求密码重置,可以直接忽略此邮件。如要重置密码,请点击下面的链接。" #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "作为提示,您的用户名是%(username)s." #: templates/account/email/password_reset_key_subject.txt:3 msgid "Password Reset E-mail" msgstr "密码重置邮件" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm E-mail Address" msgstr "确认E-mail地址" #: templates/account/email_confirm.html:16 #, python-format msgid "" "Please confirm that %(email)s is an e-mail " "address for user %(user_display)s." msgstr "" "请确认%(email)s是否是用户 %(user_display)s的" "e-mail地址。" #: templates/account/email_confirm.html:20 msgid "Confirm" msgstr "确认" #: templates/account/email_confirm.html:27 #, python-format msgid "" "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgstr "" "e-mail验证链接失效或无效。请点击 发起新的e-mail验证" "请求。" #: templates/account/login.html:6 templates/account/login.html:10 #: templates/account/login.html:43 msgid "Sign In" msgstr "登录" #: templates/account/login.html:15 #, fuzzy, python-format msgid "" "Please sign in with one\n" "of your existing third party accounts. Or, sign " "up\n" "for a %(site_name)s account and sign in below:" msgstr "" "请用您的第三方账号登录。\n" "或者注册 \n" "一个 %(site_name)s账号并登录:" #: templates/account/login.html:25 msgid "or" msgstr "或" #: templates/account/login.html:32 #, python-format msgid "" "If you have not created an account yet, then please\n" "sign up first." msgstr "" "如果没有账号,请先\n" "注册 。" #: templates/account/login.html:42 templates/account/password_change.html:14 msgid "Forgot Password?" msgstr "忘记密码了?" #: templates/account/logout.html:5 templates/account/logout.html:8 #: templates/account/logout.html:17 msgid "Sign Out" msgstr "注销" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "您确定要注销登录吗?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary e-mail address (%(email)s)." msgstr "您不能删除您的主e-mail地址 (%(email)s) " #: templates/account/messages/email_confirmation_sent.txt:2 #, fuzzy, python-format msgid "Confirmation e-mail sent to %(email)s." msgstr "确认e-mail已发往 %(email)s" #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "您已确认e-mail地址 %(email)s " #: templates/account/messages/email_deleted.txt:2 #, fuzzy, python-format msgid "Removed e-mail address %(email)s." msgstr "e-mail地址 %(email)s 已删除" #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "以 %(name)s..身份成功登录" #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "您已注销登录。" #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "密码修改成功。" #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "密码设置成功。" #: templates/account/messages/primary_email_set.txt:2 msgid "Primary e-mail address set." msgstr "主e-mail地址已设置" #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary e-mail address must be verified." msgstr "您的主e-mail地址必须被验证。" #: templates/account/password_change.html:5 #: templates/account/password_change.html:8 #: templates/account/password_change.html:13 #: templates/account/password_reset_from_key.html:4 #: templates/account/password_reset_from_key.html:7 #: templates/account/password_reset_from_key_done.html:4 #: templates/account/password_reset_from_key_done.html:7 msgid "Change Password" msgstr "修改密码" #: templates/account/password_reset.html:6 #: templates/account/password_reset.html:10 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:9 msgid "Password Reset" msgstr "密码重置" #: templates/account/password_reset.html:15 msgid "" "Forgotten your password? Enter your e-mail address below, and we'll send you " "an e-mail allowing you to reset it." msgstr "" "忘记密码?在下面输入您的e-mail地址,我们将给您发送一封e-mail,以便重置密码。" #: templates/account/password_reset.html:20 msgid "Reset My Password" msgstr "重置我的密码" #: templates/account/password_reset.html:23 msgid "Please contact us if you have any trouble resetting your password." msgstr "如在重置密码时遇到问题,请与我们联系。" #: templates/account/password_reset_done.html:15 msgid "" "We have sent you an e-mail. Please contact us if you do not receive it " "within a few minutes." msgstr "我们已给您发了一封e-mail,如您在几分钟后仍没收到,请与我们联系。" #: templates/account/password_reset_from_key.html:7 msgid "Bad Token" msgstr "Bad Token" #: templates/account/password_reset_from_key.html:11 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "密码重置链接无效,可能该链接已被使用。请重新申请链接重置。" #: templates/account/password_reset_from_key.html:17 msgid "change password" msgstr "修改密码" #: templates/account/password_reset_from_key.html:20 #: templates/account/password_reset_from_key_done.html:8 msgid "Your password is now changed." msgstr "您的密码现已被修改。" #: templates/account/password_set.html:5 templates/account/password_set.html:8 #: templates/account/password_set.html:13 msgid "Set Password" msgstr "设置密码" #: templates/account/signup.html:5 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "注册" #: templates/account/signup.html:8 templates/account/signup.html:18 #: templates/socialaccount/signup.html:8 templates/socialaccount/signup.html:19 msgid "Sign Up" msgstr "注册" #: templates/account/signup.html:10 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "已经有一个账号? 请登录." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:8 msgid "Sign Up Closed" msgstr "已关闭注册" #: templates/account/signup_closed.html:10 msgid "We are sorry, but the sign up is currently closed." msgstr "非常抱歉,当前已关闭注册。" #: templates/account/snippets/already_logged_in.html:5 msgid "Note" msgstr "注意" #: templates/account/snippets/already_logged_in.html:5 #, python-format msgid "you are already logged in as %(user_display)s." msgstr "您已以 %(user_display)s的身份登录" #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:8 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:8 msgid "Verify Your E-mail Address" msgstr "验证您的E-mail地址。" #: templates/account/verification_sent.html:10 msgid "" "We have sent an e-mail to you for verification. Follow the link provided to " "finalize the signup process. Please contact us if you do not receive it " "within a few minutes." msgstr "" "我们已向您发了一封验证e-mail。点击e-mail中的链接完成注册流程。如果您在几分钟" "后仍未收到邮件,请与我们联系。" #: templates/account/verified_email_required.html:12 msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your e-mail address. " msgstr "" "网站的这部分功能要求验证您的真实身份。\n" "为此,我们需要您确认您是此账号e-mail地址的所有者。" #: templates/account/verified_email_required.html:16 msgid "" "We have sent an e-mail to you for\n" "verification. Please click on the link inside this e-mail. Please\n" "contact us if you do not receive it within a few minutes." msgstr "" "我们已经给您发送了一封e-mail验证邮件。\n" "请点击e-mail中的链接。若您在几分钟后仍未收到邮件,请联系我们。" #: templates/account/verified_email_required.html:20 #, python-format msgid "" "Note: you can still change your e-" "mail address." msgstr "" "注意: 您仍然能够修改您的e-mail地" "址 ." #: templates/openid/login.html:9 msgid "OpenID Sign In" msgstr "OpenID登录" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:8 msgid "Social Network Login Failure" msgstr "社交网络登录失败" #: templates/socialaccount/authentication_error.html:10 msgid "" "An error occurred while attempting to login via your social network account." msgstr "当尝试用您的社交网络账号登录时,发生了一个错误。" #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:8 msgid "Account Connections" msgstr "账号链接" #: templates/socialaccount/connections.html:11 msgid "" "You can sign in to your account using any of the following third party " "accounts:" msgstr "您可以用您的以下任何第三方账号登录" #: templates/socialaccount/connections.html:43 msgid "" "You currently have no social network accounts connected to this account." msgstr "您当前没有任何社交网络账号与此账号关联" #: templates/socialaccount/connections.html:46 msgid "Add a 3rd Party Account" msgstr "添加一个第三方账号" #: templates/socialaccount/login.html:6 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:8 #, python-format msgid "You are about to connect a new third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:10 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:12 #, python-format msgid "You are about to sign in using a third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "登录已取消" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "您决定取消使用您的已有账号登录我们的网站。如果这是一个失误,请继续登录." #: templates/socialaccount/messages/account_connected.txt:2 #, fuzzy msgid "The social account has been connected." msgstr "社交账号已连接" #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "社交账号已连接到另一个账号。" #: templates/socialaccount/messages/account_disconnected.txt:2 #, fuzzy msgid "The social account has been disconnected." msgstr "社交账号已断开连接" #: templates/socialaccount/signup.html:10 #, fuzzy, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "您将使用您的%(provider_name)s账号登录\n" "%(site_name)s。作为最后一步,请完成以下表单:" #~ msgid "Account" #~ msgstr "账号" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "您提供的账号或密码错误" #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "用户名只能包含字母,数字和@/./+/-/_." #~ msgid "This username is already taken. Please choose another." #~ msgstr "此用户名已被使用,请选择其他用户名。" #, fuzzy #~| msgid "Sign In" #~ msgid "Shopify Sign In" #~ msgstr "登录" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "您已确认%(email)s是用户%(user_display)s的" #~ "e-mail地址。" #~ msgid "Thanks for using our site!" #~ msgstr "感谢您使用我们的网站!" #~ msgid "Confirmation e-mail sent to %(email)s" #~ msgstr "确认e-mail已发往 %(email)s" #~ msgid "Delete Password" #~ msgstr "删除密码" #~ msgid "" #~ "You may delete your password since you are currently logged in using " #~ "OpenID." #~ msgstr "您当前使用OpenID登录,因此您可以删除你的密码。" #~ msgid "delete my password" #~ msgstr "删除我的密码" #~ msgid "Password Deleted" #~ msgstr "密码已删除" #~ msgid "Your password has been deleted." #~ msgstr "您的密码已被删除。" #~ msgid "Your e-mail address has already been verified" #~ msgstr "Je e-mail adres is al geverifieerd" #~ msgid "" #~ "If you have any trouble resetting your password, contact us at %(CONTACT_EMAIL)s." #~ msgstr "" #~ "Als je problemen hebt je wachtwoord opnieuw in te stellen, neem dan " #~ "contact op met %(CONTACT_EMAIL)s." #~ msgid "Invalid confirmation key." #~ msgstr "Ongeldige bevestigingssleutel." #~ msgid "OpenID" #~ msgstr "OpenID" #~ msgid "Already have an account?" #~ msgstr "Heb je al een account?" #~ msgid "Sign in" #~ msgstr "Aanmelden" #~ msgid "Language" #~ msgstr "Taal" #~ msgid "Pinax can be used in your preferred language." #~ msgstr "Deze site kan in jouw voorkeurstaal gebruikt worden." #~ msgid "Change my language" #~ msgstr "Verander mijn taal" #~ msgid "Timezone" #~ msgstr "Tijdzone" #, fuzzy #~ msgid "" #~ "You're receiving this e-mail because you requested a password reset\n" #~ "for your user account at Pinax.\n" #~ "\n" #~ "Your new password is: %(new_password)s\n" #~ "\n" #~ "Your username, in case you've forgotten: %(username)s\n" #~ "\n" #~ "You should log in as soon as possible and change your password.\n" #~ "\n" #~ "Thanks for using our site!\n" #~ msgstr "" #~ "Je ontvangt deze mail omdat er een verzoek is ingelegd om het wachtwoord\n" #~ "behorende bij je %(site_name)s account opnieuw in te stellen.\n" #~ "\n" #~ "Je nieuwe wachtwoord is: %(new_password)s\n" #~ "\n" #~ "Je gebruikersnaam, voor het geval je die vergeten bent, is: %(username)s\n" #~ "\n" #~ "Je moet zo snel mogelijk inloggen en bovenstaand wachtwoord veranderen.\n" #~ "\n" #~ "Bedankt voor het gebruik van onze site!\n" #~ msgid "If checked you will stay logged in for 3 weeks" #~ msgstr "Bij 'Onthouden' blijf je ingelogd gedurende 3 weken" #~ msgid "Timezone successfully updated." #~ msgstr "Tijdzone gewijzigd." #~ msgid "Language successfully updated." #~ msgstr "Taal gewijzigd." #~ msgid "E-Mail Addresses" #~ msgstr "E-mail adressen" #~ msgid "None" #~ msgstr "Geen" #~ msgid "add" #~ msgstr "Voeg toe" #~ msgid "Log In" #~ msgstr "Inloggen" #~ msgid "Log in" #~ msgstr "Inloggen" #~ msgid "Logout" #~ msgstr "Afmelden" #~ msgid "" #~ "When you receive the new password, you should log in and change it as soon as possible." #~ msgstr "" #~ "Zodra je het nieuwe wachtwoord ontvangen hebt moet je zo snel mogelijk inloggen en het wachtwoord wijzigen." #~ msgid "You are already logged in." #~ msgstr "Je bent al ingelogd." #~ msgid "" #~ "By clicking \"Sign Up\", you are indicating that you have read and agree " #~ "to the Terms of Use and Privacy Policy." #~ msgstr "" #~ "Door te registreren geef je aan dat je de gebruiksvoorwaarden en de privacy " #~ "policy gelezen hebt en ermee akkoord gaat." #~ msgid "" #~ "If you have any trouble creating your account, contact us at %(contact_email)s." #~ msgstr "" #~ "Als je problemen hebt om een account aan te maken, neem dan contact op " #~ "met %(contact_email)s." #~ msgid "Log in »" #~ msgstr "Inloggen" django-allauth-0.47.0/allauth/locale/zh_Hant/000077500000000000000000000000001415442050100207545ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/zh_Hant/LC_MESSAGES/000077500000000000000000000000001415442050100225415ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/zh_Hant/LC_MESSAGES/django.po000066400000000000000000000711721415442050100243530ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-12-09 08:41-0600\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" #: account/adapter.py:45 msgid "Username can not be used. Please use other username." msgstr "無法使用此使用者名稱,請使用其他名稱。" #: account/adapter.py:51 msgid "Too many failed login attempts. Try again later." msgstr "登錄失敗次數過多,請稍後再試。" #: account/adapter.py:53 msgid "A user is already registered with this e-mail address." msgstr "已經有人使用這一個電子郵件註冊了。" #: account/adapter.py:300 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "密碼長度至少要有 {0} 個字元。" #: account/apps.py:7 msgid "Accounts" msgstr "帳號" #: account/forms.py:59 account/forms.py:413 msgid "You must type the same password each time." msgstr "每次輸入的密碼必須相同" #: account/forms.py:92 account/forms.py:381 account/forms.py:498 msgid "Password" msgstr "密碼" #: account/forms.py:93 msgid "Remember Me" msgstr "記住我" #: account/forms.py:97 msgid "This account is currently inactive." msgstr "此帳號目前沒有啟用。" #: account/forms.py:99 msgid "The e-mail address and/or password you specified are not correct." msgstr "您提供的電子郵件地址或密碼不正確。" #: account/forms.py:102 msgid "The username and/or password you specified are not correct." msgstr "您提供的使用者名稱或密碼不正確。" #: account/forms.py:113 account/forms.py:279 account/forms.py:439 #: account/forms.py:517 msgid "E-mail address" msgstr "電子郵件地址" #: account/forms.py:117 account/forms.py:316 account/forms.py:436 #: account/forms.py:512 msgid "E-mail" msgstr "E-mail" #: account/forms.py:120 account/forms.py:123 account/forms.py:269 #: account/forms.py:272 msgid "Username" msgstr "使用者名稱" #: account/forms.py:133 msgid "Username or e-mail" msgstr "使用者名稱或電子郵件" #: account/forms.py:136 msgctxt "field label" msgid "Login" msgstr "登入" #: account/forms.py:307 #, fuzzy #| msgid "E-mail (optional)" msgid "E-mail (again)" msgstr "E-mail (可不填)" #: account/forms.py:311 #, fuzzy #| msgid "email confirmation" msgid "E-mail address confirmation" msgstr "電子郵件確認" #: account/forms.py:319 msgid "E-mail (optional)" msgstr "E-mail (可不填)" #: account/forms.py:359 #, fuzzy #| msgid "You must type the same password each time." msgid "You must type the same email each time." msgstr "每次輸入的密碼必須相同" #: account/forms.py:384 account/forms.py:499 msgid "Password (again)" msgstr "密碼 (再一次)" #: account/forms.py:448 msgid "This e-mail address is already associated with this account." msgstr "此電子郵件已與這個帳號連結了。" #: account/forms.py:451 msgid "This e-mail address is already associated with another account." msgstr "此電子郵件已經與別的帳號連結了。" #: account/forms.py:453 #, fuzzy, python-format #| msgid "Your account has no verified e-mail address." msgid "You cannot add more than %d e-mail addresses." msgstr "您的帳號下沒有驗證過的電子郵件地址。" #: account/forms.py:478 msgid "Current Password" msgstr "目前密碼" #: account/forms.py:480 account/forms.py:570 msgid "New Password" msgstr "新密碼" #: account/forms.py:481 account/forms.py:571 msgid "New Password (again)" msgstr "新密碼 (再一次)" #: account/forms.py:489 msgid "Please type your current password." msgstr "請輸入您目前的密碼" #: account/forms.py:529 msgid "The e-mail address is not assigned to any user account" msgstr "還沒有其他帳號使用這個電子郵件地址" #: account/forms.py:592 msgid "The password reset token was invalid." msgstr "" #: account/models.py:22 msgid "user" msgstr "使用者" #: account/models.py:28 account/models.py:83 #, fuzzy msgid "e-mail address" msgstr "電子郵件地址" #: account/models.py:30 msgid "verified" msgstr "已驗證" #: account/models.py:31 msgid "primary" msgstr "主要的" #: account/models.py:36 msgid "email address" msgstr "電子郵件地址" #: account/models.py:37 msgid "email addresses" msgstr "電子郵件地址" #: account/models.py:86 msgid "created" msgstr "以建立" #: account/models.py:87 msgid "sent" msgstr "已送出" #: account/models.py:88 socialaccount/models.py:58 msgid "key" msgstr "key" #: account/models.py:93 msgid "email confirmation" msgstr "電子郵件確認" #: account/models.py:94 msgid "email confirmations" msgstr "電子郵件確認" #: socialaccount/adapter.py:26 #, python-format msgid "" "An account already exists with this e-mail address. Please sign in to that " "account first, then connect your %s account." msgstr "" "已經有一個帳號與此電子郵件連結了,請先登入該帳號,然後連接你的 %s 帳號。" #: socialaccount/adapter.py:131 msgid "Your account has no password set up." msgstr "您的帳號沒有設置密碼。" #: socialaccount/adapter.py:138 msgid "Your account has no verified e-mail address." msgstr "您的帳號下沒有驗證過的電子郵件地址。" #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "社群帳號" #: socialaccount/models.py:41 socialaccount/models.py:84 msgid "provider" msgstr "提供者" #: socialaccount/models.py:45 msgid "name" msgstr "名稱" #: socialaccount/models.py:47 msgid "client id" msgstr "client id" #: socialaccount/models.py:49 msgid "App ID, or consumer key" msgstr "App ID, or consumer key" #: socialaccount/models.py:52 msgid "secret key" msgstr "secret key" #: socialaccount/models.py:55 msgid "API secret, client secret, or consumer secret" msgstr "API secret, client secret, or consumer secret" #: socialaccount/models.py:58 msgid "Key" msgstr "Key" #: socialaccount/models.py:74 msgid "social application" msgstr "社群應用程式" #: socialaccount/models.py:75 msgid "social applications" msgstr "社群應用程式" #: socialaccount/models.py:105 msgid "uid" msgstr "uid" #: socialaccount/models.py:107 msgid "last login" msgstr "最後一次登入" #: socialaccount/models.py:108 msgid "date joined" msgstr "加入日期" #: socialaccount/models.py:109 msgid "extra data" msgstr "額外資料" #: socialaccount/models.py:113 msgid "social account" msgstr "社群帳號" #: socialaccount/models.py:114 msgid "social accounts" msgstr "社群帳號" #: socialaccount/models.py:139 msgid "token" msgstr "" #: socialaccount/models.py:140 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "" #: socialaccount/models.py:144 msgid "token secret" msgstr "" #: socialaccount/models.py:145 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "" #: socialaccount/models.py:148 msgid "expires at" msgstr "過期日" #: socialaccount/models.py:153 msgid "social application token" msgstr "社群應用程式 Token" #: socialaccount/models.py:154 msgid "social application tokens" msgstr "社群應用程式 Token" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "" #: socialaccount/providers/oauth/client.py:85 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Invalid response while obtaining request token from \"%s\"." #: socialaccount/providers/oauth/client.py:117 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Invalid response while obtaining access token from \"%s\"." #: socialaccount/providers/oauth/client.py:138 #, python-format msgid "No request token saved for \"%s\"." msgstr "No request token saved for \"%s\"." #: socialaccount/providers/oauth/client.py:189 #, python-format msgid "No access token saved for \"%s\"." msgstr "No access token saved for \"%s\"." #: socialaccount/providers/oauth/client.py:210 #, python-format msgid "No access to private resources at \"%s\"." msgstr "無權訪問私有資源 \"%s\"。" #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:8 msgid "Account Inactive" msgstr "帳號未啟用" #: templates/account/account_inactive.html:10 msgid "This account is inactive." msgstr "這個帳號未啟用" #: templates/account/email.html:5 templates/account/email.html:8 msgid "E-mail Addresses" msgstr "電子郵件地址" #: templates/account/email.html:10 msgid "The following e-mail addresses are associated with your account:" msgstr "下列電子郵件已與你的帳號連結:" #: templates/account/email.html:24 msgid "Verified" msgstr "已驗證" #: templates/account/email.html:26 msgid "Unverified" msgstr "未驗證" #: templates/account/email.html:28 msgid "Primary" msgstr "主要的" #: templates/account/email.html:34 msgid "Make Primary" msgstr "設為主要的" #: templates/account/email.html:35 msgid "Re-send Verification" msgstr "重寄驗証信" #: templates/account/email.html:36 templates/socialaccount/connections.html:35 msgid "Remove" msgstr "移除" #: templates/account/email.html:43 msgid "Warning:" msgstr "警告:" #: templates/account/email.html:43 msgid "" "You currently do not have any e-mail address set up. You should really add " "an e-mail address so you can receive notifications, reset your password, etc." msgstr "" "您尚未設定任何電子郵件。建議您最好設定一個電子郵件,以便您接收通知或重新設定" "密碼等等。" #: templates/account/email.html:48 msgid "Add E-mail Address" msgstr "增加電子郵件" #: templates/account/email.html:53 msgid "Add E-mail" msgstr "增加電子郵件" #: templates/account/email.html:63 msgid "Do you really want to remove the selected e-mail address?" msgstr "您真的要移除所選擇電子郵件嗎?" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "User %(user_display)s at %(site_name)s has given this as an email " #| "address.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s\n" msgid "" "You're receiving this e-mail because user %(user_display)s has given your e-" "mail address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "網站%(site_name)s上的使用者%(user_display)s將此設為他的電子郵件地址。\n" "\n" "為了確認這是正確的,請開啟這個連結: %(activate_url)s\n" #: templates/account/email/email_confirmation_subject.txt:3 #, fuzzy #| msgid "Confirm E-mail Address" msgid "Please Confirm Your E-mail Address" msgstr "確認電子郵件" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account at %(site_domain)s.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this e-mail because you or someone else has requested a " "password for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "您會收到這封信是因為您或是某人在 %(site_domain)s 這個網站上要求重設您帳號的密" "碼。\n" "若您沒有要求我們重設密碼,請您直接忽略這封信。若要重設您的密碼,請點擊下面的" "連結。" #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "提醒您,您的使用者名稱是 %(username)s 。" #: templates/account/email/password_reset_key_subject.txt:3 msgid "Password Reset E-mail" msgstr "密碼重設電子郵件" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm E-mail Address" msgstr "確認電子郵件" #: templates/account/email_confirm.html:16 #, python-format msgid "" "Please confirm that %(email)s is an e-mail " "address for user %(user_display)s." msgstr "" "請確認%(email)s是否是使用者 " "%(user_display)s 的電子郵件地址。" #: templates/account/email_confirm.html:20 msgid "Confirm" msgstr "確認" #: templates/account/email_confirm.html:27 #, python-format msgid "" "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgstr "" "電子郵件確認連結已經過期或失效了,請點擊 以要求發" "送新的電子郵件確認信。" #: templates/account/login.html:6 templates/account/login.html:10 #: templates/account/login.html:43 msgid "Sign In" msgstr "登入" #: templates/account/login.html:15 #, fuzzy, python-format msgid "" "Please sign in with one\n" "of your existing third party accounts. Or, sign " "up\n" "for a %(site_name)s account and sign in below:" msgstr "" "請用您的第三方帳號登入。\n" "或者註冊 \n" "一個 %(site_name)s帳號後登入:" #: templates/account/login.html:25 msgid "or" msgstr "或" #: templates/account/login.html:32 #, python-format msgid "" "If you have not created an account yet, then please\n" "sign up first." msgstr "" "若你沒有帳號,請先\n" "註冊 。" #: templates/account/login.html:42 templates/account/password_change.html:14 msgid "Forgot Password?" msgstr "忘記密碼了?" #: templates/account/logout.html:5 templates/account/logout.html:8 #: templates/account/logout.html:17 msgid "Sign Out" msgstr "登出" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "您確定要登出嗎?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary e-mail address (%(email)s)." msgstr "您不能移除您的主要的電子郵件地址 (%(email)s) 。" #: templates/account/messages/email_confirmation_sent.txt:2 #, fuzzy, python-format msgid "Confirmation e-mail sent to %(email)s." msgstr "確認信已發至 %(email)s 。" #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "您以確認電子郵件地址 %(email)s 。 " #: templates/account/messages/email_deleted.txt:2 #, fuzzy, python-format msgid "Removed e-mail address %(email)s." msgstr "電子郵件地址 %(email)s 已刪除。" #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "成功以 %(name)s..的身份登入。" #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "您已登出。" #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "密碼修改完成。" #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "密碼設定完成。" #: templates/account/messages/primary_email_set.txt:2 msgid "Primary e-mail address set." msgstr "已設定好主要的電子郵件地址。" #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary e-mail address must be verified." msgstr "您的主要電子郵件位址必須被驗證過。" #: templates/account/password_change.html:5 #: templates/account/password_change.html:8 #: templates/account/password_change.html:13 #: templates/account/password_reset_from_key.html:4 #: templates/account/password_reset_from_key.html:7 #: templates/account/password_reset_from_key_done.html:4 #: templates/account/password_reset_from_key_done.html:7 msgid "Change Password" msgstr "修改密碼" #: templates/account/password_reset.html:6 #: templates/account/password_reset.html:10 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:9 msgid "Password Reset" msgstr "密碼重設" #: templates/account/password_reset.html:15 msgid "" "Forgotten your password? Enter your e-mail address below, and we'll send you " "an e-mail allowing you to reset it." msgstr "" "忘記您的密碼了嗎? 請在下方輸入您的電子郵件,我們會發送一封電子郵件給您,以便" "重新設定您的密碼。" #: templates/account/password_reset.html:20 msgid "Reset My Password" msgstr "重設我的密碼" #: templates/account/password_reset.html:23 msgid "Please contact us if you have any trouble resetting your password." msgstr "如果在重設密碼時碰到問題,請與我們聯絡。" #: templates/account/password_reset_done.html:15 msgid "" "We have sent you an e-mail. Please contact us if you do not receive it " "within a few minutes." msgstr "我們已經寄了一封電子郵件給您,如果數分鐘內您沒有收到,請與我們聯絡。" #: templates/account/password_reset_from_key.html:7 msgid "Bad Token" msgstr "Bad Token" #: templates/account/password_reset_from_key.html:11 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "密碼重設連結已失效,可能是因為該連結已經被人用過了,請重新申請重設密碼。" #: templates/account/password_reset_from_key.html:17 msgid "change password" msgstr "修改密碼" #: templates/account/password_reset_from_key.html:20 #: templates/account/password_reset_from_key_done.html:8 msgid "Your password is now changed." msgstr "您的密碼已變更。" #: templates/account/password_set.html:5 templates/account/password_set.html:8 #: templates/account/password_set.html:13 msgid "Set Password" msgstr "設定密碼" #: templates/account/signup.html:5 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "註冊" #: templates/account/signup.html:8 templates/account/signup.html:18 #: templates/socialaccount/signup.html:8 templates/socialaccount/signup.html:19 msgid "Sign Up" msgstr "註冊" #: templates/account/signup.html:10 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "已有帳號了嗎?請登入." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:8 msgid "Sign Up Closed" msgstr "註冊未開放" #: templates/account/signup_closed.html:10 msgid "We are sorry, but the sign up is currently closed." msgstr "很抱歉,目前不開放註冊。" #: templates/account/snippets/already_logged_in.html:5 msgid "Note" msgstr "注意" #: templates/account/snippets/already_logged_in.html:5 #, python-format msgid "you are already logged in as %(user_display)s." msgstr "您已經以 %(user_display)s 的身份登入了。" #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:8 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:8 msgid "Verify Your E-mail Address" msgstr "驗證您的電子郵件地址" #: templates/account/verification_sent.html:10 msgid "" "We have sent an e-mail to you for verification. Follow the link provided to " "finalize the signup process. Please contact us if you do not receive it " "within a few minutes." msgstr "" "我們剛剛寄了一封電子郵件確認信給您,請點擊郵件中的連結以完成註冊流程。若您在" "數分鐘內尚無法收到郵件,請與我們聯絡。" #: templates/account/verified_email_required.html:12 msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your e-mail address. " msgstr "" "此網站的這部分功能需要驗證您的身份,\n" "因此我們需要確認您的電子郵件地址。" #: templates/account/verified_email_required.html:16 msgid "" "We have sent an e-mail to you for\n" "verification. Please click on the link inside this e-mail. Please\n" "contact us if you do not receive it within a few minutes." msgstr "" "我們剛剛寄了一封電子郵件確認信給您,\n" "請點擊郵件中的連結。您在數分鐘內尚無法收到郵件,請與我們聯絡。" #: templates/account/verified_email_required.html:20 #, python-format msgid "" "Note: you can still change your e-" "mail address." msgstr "" "注意: 您仍能修改您的電子郵件地址 " "." #: templates/openid/login.html:9 msgid "OpenID Sign In" msgstr "OpenID 登入" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:8 msgid "Social Network Login Failure" msgstr "社群網路登入失敗" #: templates/socialaccount/authentication_error.html:10 msgid "" "An error occurred while attempting to login via your social network account." msgstr "當嘗試用您的社群網路帳號登入時發生錯誤。" #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:8 msgid "Account Connections" msgstr "帳號連結" #: templates/socialaccount/connections.html:11 msgid "" "You can sign in to your account using any of the following third party " "accounts:" msgstr "您可以使用下列任何第三方帳號登入您的帳號:" #: templates/socialaccount/connections.html:43 msgid "" "You currently have no social network accounts connected to this account." msgstr "您目前沒有任何社群網路帳號與此帳號連結。" #: templates/socialaccount/connections.html:46 msgid "Add a 3rd Party Account" msgstr "增加一個第三方帳號" #: templates/socialaccount/login.html:6 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:8 #, python-format msgid "You are about to connect a new third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:10 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:12 #, python-format msgid "You are about to sign in using a third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "登入取消了" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "您決定不繼續登入這一個網站。若這是一個失誤,請由此" "重新登入。" #: templates/socialaccount/messages/account_connected.txt:2 #, fuzzy msgid "The social account has been connected." msgstr "社群網站帳號已連結。" #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "這個社群網站帳號已經與另一個帳號連結過了。" #: templates/socialaccount/messages/account_disconnected.txt:2 #, fuzzy msgid "The social account has been disconnected." msgstr "社群網站帳號已斷開連結。" #: templates/socialaccount/signup.html:10 #, fuzzy, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "您將使用 %(provider_name)s 這個帳號登入\n" " %(site_name)s 這個網站。最後一步,請填完下列表單:" #~ msgid "Account" #~ msgstr "帳號" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "您提供的帳號或密碼不正確。" #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "使用者名稱只能包含字母,數字及 @/./+/-/_." #~ msgid "This username is already taken. Please choose another." #~ msgstr "這個使用者名稱已經有人用了,請換一個。" #, fuzzy #~| msgid "Sign In" #~ msgid "Shopify Sign In" #~ msgstr "登入" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "您以確認%(email)s是使用者%(user_display)s" #~ "的電子郵件地址。" #~ msgid "Thanks for using our site!" #~ msgstr "感謝您使用我們的網站!" #~ msgid "Confirmation e-mail sent to %(email)s" #~ msgstr "确认e-mail已发往 %(email)s" #~ msgid "Delete Password" #~ msgstr "删除密码" #~ msgid "" #~ "You may delete your password since you are currently logged in using " #~ "OpenID." #~ msgstr "您当前使用OpenID登录,因此您可以删除你的密码。" #~ msgid "delete my password" #~ msgstr "删除我的密码" #~ msgid "Password Deleted" #~ msgstr "密码已删除" #~ msgid "Your password has been deleted." #~ msgstr "您的密码已被删除。" #~ msgid "Your e-mail address has already been verified" #~ msgstr "Je e-mail adres is al geverifieerd" #~ msgid "" #~ "If you have any trouble resetting your password, contact us at %(CONTACT_EMAIL)s." #~ msgstr "" #~ "Als je problemen hebt je wachtwoord opnieuw in te stellen, neem dan " #~ "contact op met %(CONTACT_EMAIL)s." #~ msgid "Invalid confirmation key." #~ msgstr "Ongeldige bevestigingssleutel." #~ msgid "OpenID" #~ msgstr "OpenID" #~ msgid "Already have an account?" #~ msgstr "Heb je al een account?" #~ msgid "Sign in" #~ msgstr "Aanmelden" #~ msgid "Language" #~ msgstr "Taal" #~ msgid "Pinax can be used in your preferred language." #~ msgstr "Deze site kan in jouw voorkeurstaal gebruikt worden." #~ msgid "Change my language" #~ msgstr "Verander mijn taal" #~ msgid "Timezone" #~ msgstr "Tijdzone" #, fuzzy #~ msgid "" #~ "You're receiving this e-mail because you requested a password reset\n" #~ "for your user account at Pinax.\n" #~ "\n" #~ "Your new password is: %(new_password)s\n" #~ "\n" #~ "Your username, in case you've forgotten: %(username)s\n" #~ "\n" #~ "You should log in as soon as possible and change your password.\n" #~ "\n" #~ "Thanks for using our site!\n" #~ msgstr "" #~ "Je ontvangt deze mail omdat er een verzoek is ingelegd om het wachtwoord\n" #~ "behorende bij je %(site_name)s account opnieuw in te stellen.\n" #~ "\n" #~ "Je nieuwe wachtwoord is: %(new_password)s\n" #~ "\n" #~ "Je gebruikersnaam, voor het geval je die vergeten bent, is: %(username)s\n" #~ "\n" #~ "Je moet zo snel mogelijk inloggen en bovenstaand wachtwoord veranderen.\n" #~ "\n" #~ "Bedankt voor het gebruik van onze site!\n" #~ msgid "If checked you will stay logged in for 3 weeks" #~ msgstr "Bij 'Onthouden' blijf je ingelogd gedurende 3 weken" #~ msgid "Timezone successfully updated." #~ msgstr "Tijdzone gewijzigd." #~ msgid "Language successfully updated." #~ msgstr "Taal gewijzigd." #~ msgid "E-Mail Addresses" #~ msgstr "E-mail adressen" #~ msgid "None" #~ msgstr "Geen" #~ msgid "add" #~ msgstr "Voeg toe" #~ msgid "Log In" #~ msgstr "Inloggen" #~ msgid "Log in" #~ msgstr "Inloggen" #~ msgid "Logout" #~ msgstr "Afmelden" #~ msgid "" #~ "When you receive the new password, you should log in and change it as soon as possible." #~ msgstr "" #~ "Zodra je het nieuwe wachtwoord ontvangen hebt moet je zo snel mogelijk inloggen en het wachtwoord wijzigen." #~ msgid "You are already logged in." #~ msgstr "Je bent al ingelogd." #~ msgid "" #~ "By clicking \"Sign Up\", you are indicating that you have read and agree " #~ "to the Terms of Use and Privacy Policy." #~ msgstr "" #~ "Door te registreren geef je aan dat je de gebruiksvoorwaarden en de privacy " #~ "policy gelezen hebt en ermee akkoord gaat." #~ msgid "" #~ "If you have any trouble creating your account, contact us at %(contact_email)s." #~ msgstr "" #~ "Als je problemen hebt om een account aan te maken, neem dan contact op " #~ "met %(contact_email)s." #~ msgid "Log in »" #~ msgstr "Inloggen" django-allauth-0.47.0/allauth/locale/zh_TW/000077500000000000000000000000001415442050100204145ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/zh_TW/LC_MESSAGES/000077500000000000000000000000001415442050100222015ustar00rootroot00000000000000django-allauth-0.47.0/allauth/locale/zh_TW/LC_MESSAGES/django.po000066400000000000000000000707571415442050100240230ustar00rootroot00000000000000# Copyright (C) 2014 # This file is distributed under the same license as the django-allauth package. # Kirby Wu , 2014 # msgid "" msgstr "" "Project-Id-Version: django-allauth\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-12-09 08:41-0600\n" "PO-Revision-Date: 2014-08-12 00:36+0200\n" "Last-Translator: jresins \n" "Language-Team: Chinese (Traditional)\n" "Language: zh_TW\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: account/adapter.py:45 msgid "Username can not be used. Please use other username." msgstr "無法使用此使用者名稱,請使用其他名稱。" #: account/adapter.py:51 msgid "Too many failed login attempts. Try again later." msgstr "" #: account/adapter.py:53 msgid "A user is already registered with this e-mail address." msgstr "已經有人使用這一個電子郵件註冊了。" #: account/adapter.py:300 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "密碼長度至少要有 {0} 個字元。" #: account/apps.py:7 msgid "Accounts" msgstr "帳號" #: account/forms.py:59 account/forms.py:413 msgid "You must type the same password each time." msgstr "每次輸入的密碼必須相同" #: account/forms.py:92 account/forms.py:381 account/forms.py:498 msgid "Password" msgstr "密碼" #: account/forms.py:93 msgid "Remember Me" msgstr "記住我" #: account/forms.py:97 msgid "This account is currently inactive." msgstr "此帳號目前沒有啟用。" #: account/forms.py:99 msgid "The e-mail address and/or password you specified are not correct." msgstr "您提供的電子郵件地址或密碼不正確。" #: account/forms.py:102 msgid "The username and/or password you specified are not correct." msgstr "您提供的使用者名稱或密碼不正確。" #: account/forms.py:113 account/forms.py:279 account/forms.py:439 #: account/forms.py:517 msgid "E-mail address" msgstr "電子郵件地址" #: account/forms.py:117 account/forms.py:316 account/forms.py:436 #: account/forms.py:512 msgid "E-mail" msgstr "E-mail" #: account/forms.py:120 account/forms.py:123 account/forms.py:269 #: account/forms.py:272 msgid "Username" msgstr "使用者名稱" #: account/forms.py:133 msgid "Username or e-mail" msgstr "使用者名稱或電子郵件" #: account/forms.py:136 msgctxt "field label" msgid "Login" msgstr "登入" #: account/forms.py:307 #, fuzzy #| msgid "E-mail (optional)" msgid "E-mail (again)" msgstr "E-mail (可不填)" #: account/forms.py:311 #, fuzzy #| msgid "email confirmation" msgid "E-mail address confirmation" msgstr "電子郵件確認" #: account/forms.py:319 msgid "E-mail (optional)" msgstr "E-mail (可不填)" #: account/forms.py:359 #, fuzzy #| msgid "You must type the same password each time." msgid "You must type the same email each time." msgstr "每次輸入的密碼必須相同" #: account/forms.py:384 account/forms.py:499 msgid "Password (again)" msgstr "密碼 (再一次)" #: account/forms.py:448 msgid "This e-mail address is already associated with this account." msgstr "此電子郵件已與這個帳號連結了。" #: account/forms.py:451 msgid "This e-mail address is already associated with another account." msgstr "此電子郵件已經與別的帳號連結了。" #: account/forms.py:453 #, fuzzy, python-format #| msgid "Your account has no verified e-mail address." msgid "You cannot add more than %d e-mail addresses." msgstr "您的帳號下沒有驗證過的電子郵件地址。" #: account/forms.py:478 msgid "Current Password" msgstr "目前密碼" #: account/forms.py:480 account/forms.py:570 msgid "New Password" msgstr "新密碼" #: account/forms.py:481 account/forms.py:571 msgid "New Password (again)" msgstr "新密碼 (再一次)" #: account/forms.py:489 msgid "Please type your current password." msgstr "請輸入您目前的密碼" #: account/forms.py:529 msgid "The e-mail address is not assigned to any user account" msgstr "還沒有其他帳號使用這個電子郵件地址" #: account/forms.py:592 msgid "The password reset token was invalid." msgstr "" #: account/models.py:22 msgid "user" msgstr "使用者" #: account/models.py:28 account/models.py:83 #, fuzzy msgid "e-mail address" msgstr "電子郵件地址" #: account/models.py:30 msgid "verified" msgstr "已驗證" #: account/models.py:31 msgid "primary" msgstr "主要的" #: account/models.py:36 msgid "email address" msgstr "電子郵件地址" #: account/models.py:37 msgid "email addresses" msgstr "電子郵件地址" #: account/models.py:86 msgid "created" msgstr "以建立" #: account/models.py:87 msgid "sent" msgstr "已送出" #: account/models.py:88 socialaccount/models.py:58 msgid "key" msgstr "key" #: account/models.py:93 msgid "email confirmation" msgstr "電子郵件確認" #: account/models.py:94 msgid "email confirmations" msgstr "電子郵件確認" #: socialaccount/adapter.py:26 #, python-format msgid "" "An account already exists with this e-mail address. Please sign in to that " "account first, then connect your %s account." msgstr "" "已經有一個帳號與此電子郵件連結了,請先登入該帳號,然後連接你的 %s 帳號。" #: socialaccount/adapter.py:131 msgid "Your account has no password set up." msgstr "您的帳號沒有設置密碼。" #: socialaccount/adapter.py:138 msgid "Your account has no verified e-mail address." msgstr "您的帳號下沒有驗證過的電子郵件地址。" #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "社群帳號" #: socialaccount/models.py:41 socialaccount/models.py:84 msgid "provider" msgstr "提供者" #: socialaccount/models.py:45 msgid "name" msgstr "名稱" #: socialaccount/models.py:47 msgid "client id" msgstr "client id" #: socialaccount/models.py:49 msgid "App ID, or consumer key" msgstr "App ID, or consumer key" #: socialaccount/models.py:52 msgid "secret key" msgstr "secret key" #: socialaccount/models.py:55 msgid "API secret, client secret, or consumer secret" msgstr "API secret, client secret, or consumer secret" #: socialaccount/models.py:58 msgid "Key" msgstr "Key" #: socialaccount/models.py:74 msgid "social application" msgstr "社群應用程式" #: socialaccount/models.py:75 msgid "social applications" msgstr "社群應用程式" #: socialaccount/models.py:105 msgid "uid" msgstr "uid" #: socialaccount/models.py:107 msgid "last login" msgstr "最後一次登入" #: socialaccount/models.py:108 msgid "date joined" msgstr "加入日期" #: socialaccount/models.py:109 msgid "extra data" msgstr "額外資料" #: socialaccount/models.py:113 msgid "social account" msgstr "社群帳號" #: socialaccount/models.py:114 msgid "social accounts" msgstr "社群帳號" #: socialaccount/models.py:139 msgid "token" msgstr "" #: socialaccount/models.py:140 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "" #: socialaccount/models.py:144 msgid "token secret" msgstr "" #: socialaccount/models.py:145 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "" #: socialaccount/models.py:148 msgid "expires at" msgstr "過期日" #: socialaccount/models.py:153 msgid "social application token" msgstr "社群應用程式 Token" #: socialaccount/models.py:154 msgid "social application tokens" msgstr "社群應用程式 Token" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "" #: socialaccount/providers/oauth/client.py:85 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Invalid response while obtaining request token from \"%s\"." #: socialaccount/providers/oauth/client.py:117 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Invalid response while obtaining access token from \"%s\"." #: socialaccount/providers/oauth/client.py:138 #, python-format msgid "No request token saved for \"%s\"." msgstr "No request token saved for \"%s\"." #: socialaccount/providers/oauth/client.py:189 #, python-format msgid "No access token saved for \"%s\"." msgstr "No access token saved for \"%s\"." #: socialaccount/providers/oauth/client.py:210 #, python-format msgid "No access to private resources at \"%s\"." msgstr "無權訪問私有資源 \"%s\"。" #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:8 msgid "Account Inactive" msgstr "帳號未啟用" #: templates/account/account_inactive.html:10 msgid "This account is inactive." msgstr "這個帳號未啟用" #: templates/account/email.html:5 templates/account/email.html:8 msgid "E-mail Addresses" msgstr "電子郵件地址" #: templates/account/email.html:10 msgid "The following e-mail addresses are associated with your account:" msgstr "下列電子郵件已與你的帳號連結:" #: templates/account/email.html:24 msgid "Verified" msgstr "已驗證" #: templates/account/email.html:26 msgid "Unverified" msgstr "未驗證" #: templates/account/email.html:28 msgid "Primary" msgstr "主要的" #: templates/account/email.html:34 msgid "Make Primary" msgstr "設為主要的" #: templates/account/email.html:35 msgid "Re-send Verification" msgstr "重寄驗証信" #: templates/account/email.html:36 templates/socialaccount/connections.html:35 msgid "Remove" msgstr "移除" #: templates/account/email.html:43 msgid "Warning:" msgstr "警告:" #: templates/account/email.html:43 msgid "" "You currently do not have any e-mail address set up. You should really add " "an e-mail address so you can receive notifications, reset your password, etc." msgstr "" "您尚未設定任何電子郵件。建議您最好設定一個電子郵件,以便您接收通知或重新設定" "密碼等等。" #: templates/account/email.html:48 msgid "Add E-mail Address" msgstr "增加電子郵件" #: templates/account/email.html:53 msgid "Add E-mail" msgstr "增加電子郵件" #: templates/account/email.html:63 msgid "Do you really want to remove the selected e-mail address?" msgstr "您真的要移除所選擇電子郵件嗎?" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "User %(user_display)s at %(site_name)s has given this as an email " #| "address.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s\n" msgid "" "You're receiving this e-mail because user %(user_display)s has given your e-" "mail address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "網站%(site_name)s上的使用者%(user_display)s將此設為他的電子郵件地址。\n" "\n" "為了確認這是正確的,請開啟這個連結: %(activate_url)s\n" #: templates/account/email/email_confirmation_subject.txt:3 #, fuzzy #| msgid "Confirm E-mail Address" msgid "Please Confirm Your E-mail Address" msgstr "確認電子郵件" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account at %(site_domain)s.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this e-mail because you or someone else has requested a " "password for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "您會收到這封信是因為您或是某人在 %(site_domain)s 這個網站上要求重設您帳號的密" "碼。\n" "若您沒有要求我們重設密碼,請您直接忽略這封信。若要重設您的密碼,請點擊下面的" "連結。" #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "提醒您,您的使用者名稱是 %(username)s 。" #: templates/account/email/password_reset_key_subject.txt:3 msgid "Password Reset E-mail" msgstr "密碼重設電子郵件" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm E-mail Address" msgstr "確認電子郵件" #: templates/account/email_confirm.html:16 #, python-format msgid "" "Please confirm that %(email)s is an e-mail " "address for user %(user_display)s." msgstr "" "請確認%(email)s是否是使用者 " "%(user_display)s 的電子郵件地址。" #: templates/account/email_confirm.html:20 msgid "Confirm" msgstr "確認" #: templates/account/email_confirm.html:27 #, python-format msgid "" "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgstr "" "電子郵件確認連結已經過期或失效了,請點擊 以要求發" "送新的電子郵件確認信。" #: templates/account/login.html:6 templates/account/login.html:10 #: templates/account/login.html:43 msgid "Sign In" msgstr "登入" #: templates/account/login.html:15 #, fuzzy, python-format msgid "" "Please sign in with one\n" "of your existing third party accounts. Or, sign " "up\n" "for a %(site_name)s account and sign in below:" msgstr "" "請用您的第三方帳號登入。\n" "或者註冊 \n" "一個 %(site_name)s帳號後登入:" #: templates/account/login.html:25 msgid "or" msgstr "或" #: templates/account/login.html:32 #, python-format msgid "" "If you have not created an account yet, then please\n" "sign up first." msgstr "" "若你沒有帳號,請先\n" "註冊 。" #: templates/account/login.html:42 templates/account/password_change.html:14 msgid "Forgot Password?" msgstr "忘記密碼了?" #: templates/account/logout.html:5 templates/account/logout.html:8 #: templates/account/logout.html:17 msgid "Sign Out" msgstr "登出" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "您確定要登出嗎?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary e-mail address (%(email)s)." msgstr "您不能移除您的主要的電子郵件地址 (%(email)s) 。" #: templates/account/messages/email_confirmation_sent.txt:2 #, fuzzy, python-format msgid "Confirmation e-mail sent to %(email)s." msgstr "確認信已發至 %(email)s 。" #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "您以確認電子郵件地址 %(email)s 。 " #: templates/account/messages/email_deleted.txt:2 #, fuzzy, python-format msgid "Removed e-mail address %(email)s." msgstr "電子郵件地址 %(email)s 已刪除。" #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "成功以 %(name)s..的身份登入。" #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "您已登出。" #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "密碼修改完成。" #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "密碼設定完成。" #: templates/account/messages/primary_email_set.txt:2 msgid "Primary e-mail address set." msgstr "已設定好主要的電子郵件地址。" #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary e-mail address must be verified." msgstr "您的主要電子郵件位址必須被驗證過。" #: templates/account/password_change.html:5 #: templates/account/password_change.html:8 #: templates/account/password_change.html:13 #: templates/account/password_reset_from_key.html:4 #: templates/account/password_reset_from_key.html:7 #: templates/account/password_reset_from_key_done.html:4 #: templates/account/password_reset_from_key_done.html:7 msgid "Change Password" msgstr "修改密碼" #: templates/account/password_reset.html:6 #: templates/account/password_reset.html:10 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:9 msgid "Password Reset" msgstr "密碼重設" #: templates/account/password_reset.html:15 msgid "" "Forgotten your password? Enter your e-mail address below, and we'll send you " "an e-mail allowing you to reset it." msgstr "" "忘記您的密碼了嗎? 請在下方輸入您的電子郵件,我們會發送一封電子郵件給您,以便" "重新設定您的密碼。" #: templates/account/password_reset.html:20 msgid "Reset My Password" msgstr "重設我的密碼" #: templates/account/password_reset.html:23 msgid "Please contact us if you have any trouble resetting your password." msgstr "如果在重設密碼時碰到問題,請與我們聯絡。" #: templates/account/password_reset_done.html:15 msgid "" "We have sent you an e-mail. Please contact us if you do not receive it " "within a few minutes." msgstr "我們已經寄了一封電子郵件給您,如果數分鐘內您沒有收到,請與我們聯絡。" #: templates/account/password_reset_from_key.html:7 msgid "Bad Token" msgstr "Bad Token" #: templates/account/password_reset_from_key.html:11 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "密碼重設連結已失效,可能是因為該連結已經被人用過了,請重新申請重設密碼。" #: templates/account/password_reset_from_key.html:17 msgid "change password" msgstr "修改密碼" #: templates/account/password_reset_from_key.html:20 #: templates/account/password_reset_from_key_done.html:8 msgid "Your password is now changed." msgstr "您的密碼已變更。" #: templates/account/password_set.html:5 templates/account/password_set.html:8 #: templates/account/password_set.html:13 msgid "Set Password" msgstr "設定密碼" #: templates/account/signup.html:5 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "註冊" #: templates/account/signup.html:8 templates/account/signup.html:18 #: templates/socialaccount/signup.html:8 templates/socialaccount/signup.html:19 msgid "Sign Up" msgstr "註冊" #: templates/account/signup.html:10 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "已有帳號了嗎?請登入." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:8 msgid "Sign Up Closed" msgstr "註冊未開放" #: templates/account/signup_closed.html:10 msgid "We are sorry, but the sign up is currently closed." msgstr "很抱歉,目前不開放註冊。" #: templates/account/snippets/already_logged_in.html:5 msgid "Note" msgstr "注意" #: templates/account/snippets/already_logged_in.html:5 #, python-format msgid "you are already logged in as %(user_display)s." msgstr "您已經以 %(user_display)s 的身份登入了。" #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:8 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:8 msgid "Verify Your E-mail Address" msgstr "驗證您的電子郵件地址" #: templates/account/verification_sent.html:10 msgid "" "We have sent an e-mail to you for verification. Follow the link provided to " "finalize the signup process. Please contact us if you do not receive it " "within a few minutes." msgstr "" "我們剛剛寄了一封電子郵件確認信給您,請點擊郵件中的連結以完成註冊流程。若您在" "數分鐘內尚無法收到郵件,請與我們聯絡。" #: templates/account/verified_email_required.html:12 msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your e-mail address. " msgstr "" "此網站的這部分功能需要驗證您的身份,\n" "因此我們需要確認您的電子郵件地址。" #: templates/account/verified_email_required.html:16 msgid "" "We have sent an e-mail to you for\n" "verification. Please click on the link inside this e-mail. Please\n" "contact us if you do not receive it within a few minutes." msgstr "" "我們剛剛寄了一封電子郵件確認信給您,\n" "請點擊郵件中的連結。您在數分鐘內尚無法收到郵件,請與我們聯絡。" #: templates/account/verified_email_required.html:20 #, python-format msgid "" "Note: you can still change your e-" "mail address." msgstr "" "注意: 您仍能修改您的電子郵件地址 " "." #: templates/openid/login.html:9 msgid "OpenID Sign In" msgstr "OpenID 登入" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:8 msgid "Social Network Login Failure" msgstr "社群網路登入失敗" #: templates/socialaccount/authentication_error.html:10 msgid "" "An error occurred while attempting to login via your social network account." msgstr "當嘗試用您的社群網路帳號登入時發生錯誤。" #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:8 msgid "Account Connections" msgstr "帳號連結" #: templates/socialaccount/connections.html:11 msgid "" "You can sign in to your account using any of the following third party " "accounts:" msgstr "您可以使用下列任何第三方帳號登入您的帳號:" #: templates/socialaccount/connections.html:43 msgid "" "You currently have no social network accounts connected to this account." msgstr "您目前沒有任何社群網路帳號與此帳號連結。" #: templates/socialaccount/connections.html:46 msgid "Add a 3rd Party Account" msgstr "增加一個第三方帳號" #: templates/socialaccount/login.html:6 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:8 #, python-format msgid "You are about to connect a new third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:10 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:12 #, python-format msgid "You are about to sign in using a third party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "登入取消了" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "您決定不繼續登入這一個網站。若這是一個失誤,請由此" "重新登入。" #: templates/socialaccount/messages/account_connected.txt:2 #, fuzzy msgid "The social account has been connected." msgstr "社群網站帳號已連結。" #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "這個社群網站帳號已經與另一個帳號連結過了。" #: templates/socialaccount/messages/account_disconnected.txt:2 #, fuzzy msgid "The social account has been disconnected." msgstr "社群網站帳號已斷開連結。" #: templates/socialaccount/signup.html:10 #, fuzzy, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "您將使用 %(provider_name)s 這個帳號登入\n" " %(site_name)s 這個網站。最後一步,請填完下列表單:" #~ msgid "Account" #~ msgstr "帳號" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "您提供的帳號或密碼不正確。" #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "使用者名稱只能包含字母,數字及 @/./+/-/_." #~ msgid "This username is already taken. Please choose another." #~ msgstr "這個使用者名稱已經有人用了,請換一個。" #, fuzzy #~| msgid "Sign In" #~ msgid "Shopify Sign In" #~ msgstr "登入" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "您以確認%(email)s是使用者%(user_display)s" #~ "的電子郵件地址。" #~ msgid "Thanks for using our site!" #~ msgstr "感謝您使用我們的網站!" #~ msgid "Confirmation e-mail sent to %(email)s" #~ msgstr "确认e-mail已发往 %(email)s" #~ msgid "Delete Password" #~ msgstr "删除密码" #~ msgid "" #~ "You may delete your password since you are currently logged in using " #~ "OpenID." #~ msgstr "您当前使用OpenID登录,因此您可以删除你的密码。" #~ msgid "delete my password" #~ msgstr "删除我的密码" #~ msgid "Password Deleted" #~ msgstr "密码已删除" #~ msgid "Your password has been deleted." #~ msgstr "您的密码已被删除。" #~ msgid "Your e-mail address has already been verified" #~ msgstr "Je e-mail adres is al geverifieerd" #~ msgid "" #~ "If you have any trouble resetting your password, contact us at %(CONTACT_EMAIL)s." #~ msgstr "" #~ "Als je problemen hebt je wachtwoord opnieuw in te stellen, neem dan " #~ "contact op met %(CONTACT_EMAIL)s." #~ msgid "Invalid confirmation key." #~ msgstr "Ongeldige bevestigingssleutel." #~ msgid "OpenID" #~ msgstr "OpenID" #~ msgid "Already have an account?" #~ msgstr "Heb je al een account?" #~ msgid "Sign in" #~ msgstr "Aanmelden" #~ msgid "Language" #~ msgstr "Taal" #~ msgid "Pinax can be used in your preferred language." #~ msgstr "Deze site kan in jouw voorkeurstaal gebruikt worden." #~ msgid "Change my language" #~ msgstr "Verander mijn taal" #~ msgid "Timezone" #~ msgstr "Tijdzone" #, fuzzy #~ msgid "" #~ "You're receiving this e-mail because you requested a password reset\n" #~ "for your user account at Pinax.\n" #~ "\n" #~ "Your new password is: %(new_password)s\n" #~ "\n" #~ "Your username, in case you've forgotten: %(username)s\n" #~ "\n" #~ "You should log in as soon as possible and change your password.\n" #~ "\n" #~ "Thanks for using our site!\n" #~ msgstr "" #~ "Je ontvangt deze mail omdat er een verzoek is ingelegd om het wachtwoord\n" #~ "behorende bij je %(site_name)s account opnieuw in te stellen.\n" #~ "\n" #~ "Je nieuwe wachtwoord is: %(new_password)s\n" #~ "\n" #~ "Je gebruikersnaam, voor het geval je die vergeten bent, is: %(username)s\n" #~ "\n" #~ "Je moet zo snel mogelijk inloggen en bovenstaand wachtwoord veranderen.\n" #~ "\n" #~ "Bedankt voor het gebruik van onze site!\n" #~ msgid "If checked you will stay logged in for 3 weeks" #~ msgstr "Bij 'Onthouden' blijf je ingelogd gedurende 3 weken" #~ msgid "Timezone successfully updated." #~ msgstr "Tijdzone gewijzigd." #~ msgid "Language successfully updated." #~ msgstr "Taal gewijzigd." #~ msgid "E-Mail Addresses" #~ msgstr "E-mail adressen" #~ msgid "None" #~ msgstr "Geen" #~ msgid "add" #~ msgstr "Voeg toe" #~ msgid "Log In" #~ msgstr "Inloggen" #~ msgid "Log in" #~ msgstr "Inloggen" #~ msgid "Logout" #~ msgstr "Afmelden" #~ msgid "" #~ "When you receive the new password, you should log in and change it as soon as possible." #~ msgstr "" #~ "Zodra je het nieuwe wachtwoord ontvangen hebt moet je zo snel mogelijk inloggen en het wachtwoord wijzigen." #~ msgid "You are already logged in." #~ msgstr "Je bent al ingelogd." #~ msgid "" #~ "By clicking \"Sign Up\", you are indicating that you have read and agree " #~ "to the Terms of Use and Privacy Policy." #~ msgstr "" #~ "Door te registreren geef je aan dat je de gebruiksvoorwaarden en de privacy " #~ "policy gelezen hebt en ermee akkoord gaat." #~ msgid "" #~ "If you have any trouble creating your account, contact us at %(contact_email)s." #~ msgstr "" #~ "Als je problemen hebt om een account aan te maken, neem dan contact op " #~ "met %(contact_email)s." #~ msgid "Log in »" #~ msgstr "Inloggen" django-allauth-0.47.0/allauth/models.py000066400000000000000000000000001415442050100177450ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/000077500000000000000000000000001415442050100207515ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/__init__.py000066400000000000000000000002121415442050100230550ustar00rootroot00000000000000import django if django.VERSION < (3, 2): # pragma: no cover default_app_config = "allauth.socialaccount.apps.SocialAccountConfig" django-allauth-0.47.0/allauth/socialaccount/adapter.py000066400000000000000000000174471415442050100227600ustar00rootroot00000000000000from __future__ import absolute_import from django.core.exceptions import ValidationError from django.urls import reverse from django.utils.translation import gettext_lazy as _ from ..account import app_settings as account_settings from ..account.adapter import get_adapter as get_account_adapter from ..account.app_settings import EmailVerificationMethod from ..account.models import EmailAddress from ..account.utils import user_email, user_field, user_username from ..utils import ( deserialize_instance, email_address_exists, import_attribute, serialize_instance, valid_email_or_none, ) from . import app_settings class DefaultSocialAccountAdapter(object): error_messages = { "email_taken": _( "An account already exists with this e-mail address." " Please sign in to that account first, then connect" " your %s account." ) } def __init__(self, request=None): self.request = request def pre_social_login(self, request, sociallogin): """ Invoked just after a user successfully authenticates via a social provider, but before the login is actually processed (and before the pre_social_login signal is emitted). You can use this hook to intervene, e.g. abort the login by raising an ImmediateHttpResponse Why both an adapter hook and the signal? Intervening in e.g. the flow from within a signal handler is bad -- multiple handlers may be active and are executed in undetermined order. """ pass def authentication_error( self, request, provider_id, error=None, exception=None, extra_context=None, ): """ Invoked when there is an error in the authentication cycle. In this case, pre_social_login will not be reached. You can use this hook to intervene, e.g. redirect to an educational flow by raising an ImmediateHttpResponse. """ pass def new_user(self, request, sociallogin): """ Instantiates a new User instance. """ return get_account_adapter().new_user(request) def save_user(self, request, sociallogin, form=None): """ Saves a newly signed up social login. In case of auto-signup, the signup form is not available. """ u = sociallogin.user u.set_unusable_password() if form: get_account_adapter().save_user(request, u, form) else: get_account_adapter().populate_username(request, u) sociallogin.save(request) return u def populate_user(self, request, sociallogin, data): """ Hook that can be used to further populate the user instance. For convenience, we populate several common fields. Note that the user instance being populated represents a suggested User instance that represents the social user that is in the process of being logged in. The User instance need not be completely valid and conflict free. For example, verifying whether or not the username already exists, is not a responsibility. """ username = data.get("username") first_name = data.get("first_name") last_name = data.get("last_name") email = data.get("email") name = data.get("name") user = sociallogin.user user_username(user, username or "") user_email(user, valid_email_or_none(email) or "") name_parts = (name or "").partition(" ") user_field(user, "first_name", first_name or name_parts[0]) user_field(user, "last_name", last_name or name_parts[2]) return user def get_connect_redirect_url(self, request, socialaccount): """ Returns the default URL to redirect to after successfully connecting a social account. """ assert request.user.is_authenticated url = reverse("socialaccount_connections") return url def validate_disconnect(self, account, accounts): """ Validate whether or not the socialaccount account can be safely disconnected. """ if len(accounts) == 1: # No usable password would render the local account unusable if not account.user.has_usable_password(): raise ValidationError(_("Your account has no password set up.")) # No email address, no password reset if app_settings.EMAIL_VERIFICATION == EmailVerificationMethod.MANDATORY: if not EmailAddress.objects.filter( user=account.user, verified=True ).exists(): raise ValidationError( _("Your account has no verified e-mail address.") ) def is_auto_signup_allowed(self, request, sociallogin): # If email is specified, check for duplicate and if so, no auto signup. auto_signup = app_settings.AUTO_SIGNUP if auto_signup: email = user_email(sociallogin.user) # Let's check if auto_signup is really possible... if email: if account_settings.UNIQUE_EMAIL: if email_address_exists(email): # Oops, another user already has this address. # We cannot simply connect this social account # to the existing user. Reason is that the # email adress may not be verified, meaning, # the user may be a hacker that has added your # email address to their account in the hope # that you fall in their trap. We cannot # check on 'email_address.verified' either, # because 'email_address' is not guaranteed to # be verified. auto_signup = False # FIXME: We redirect to signup form -- user will # see email address conflict only after posting # whereas we detected it here already. elif app_settings.EMAIL_REQUIRED: # Nope, email is required and we don't have it yet... auto_signup = False return auto_signup def is_open_for_signup(self, request, sociallogin): """ Checks whether or not the site is open for signups. Next to simply returning True/False you can also intervene the regular flow by raising an ImmediateHttpResponse """ return get_account_adapter(request).is_open_for_signup(request) def get_signup_form_initial_data(self, sociallogin): user = sociallogin.user initial = { "email": user_email(user) or "", "username": user_username(user) or "", "first_name": user_field(user, "first_name") or "", "last_name": user_field(user, "last_name") or "", } return initial def deserialize_instance(self, model, data): return deserialize_instance(model, data) def serialize_instance(self, instance): return serialize_instance(instance) def get_app(self, request, provider): # NOTE: Avoid loading models at top due to registry boot... from allauth.socialaccount.models import SocialApp config = app_settings.PROVIDERS.get(provider, {}).get("APP") if config: app = SocialApp(provider=provider) for field in ["client_id", "secret", "key", "certificate_key"]: setattr(app, field, config.get(field)) else: app = SocialApp.objects.get_current(provider, request) return app def get_adapter(request=None): return import_attribute(app_settings.ADAPTER)(request) django-allauth-0.47.0/allauth/socialaccount/admin.py000066400000000000000000000031321415442050100224120ustar00rootroot00000000000000from django import forms from django.contrib import admin from allauth.account.adapter import get_adapter from .models import SocialAccount, SocialApp, SocialToken class SocialAppForm(forms.ModelForm): class Meta: model = SocialApp exclude = [] widgets = { "client_id": forms.TextInput(attrs={"size": "100"}), "key": forms.TextInput(attrs={"size": "100"}), "secret": forms.TextInput(attrs={"size": "100"}), } class SocialAppAdmin(admin.ModelAdmin): form = SocialAppForm list_display = ( "name", "provider", ) filter_horizontal = ("sites",) class SocialAccountAdmin(admin.ModelAdmin): search_fields = [] raw_id_fields = ("user",) list_display = ("user", "uid", "provider") list_filter = ("provider",) def get_search_fields(self, request): base_fields = get_adapter().get_user_search_fields() return list(map(lambda a: "user__" + a, base_fields)) class SocialTokenAdmin(admin.ModelAdmin): raw_id_fields = ( "app", "account", ) list_display = ("app", "account", "truncated_token", "expires_at") list_filter = ("app", "app__provider", "expires_at") def truncated_token(self, token): max_chars = 40 ret = token.token if len(ret) > max_chars: ret = ret[0:max_chars] + "...(truncated)" return ret truncated_token.short_description = "Token" admin.site.register(SocialApp, SocialAppAdmin) admin.site.register(SocialToken, SocialTokenAdmin) admin.site.register(SocialAccount, SocialAccountAdmin) django-allauth-0.47.0/allauth/socialaccount/app_settings.py000066400000000000000000000046571415442050100240370ustar00rootroot00000000000000class AppSettings(object): def __init__(self, prefix): self.prefix = prefix def _setting(self, name, dflt): from django.conf import settings getter = getattr( settings, "ALLAUTH_SETTING_GETTER", lambda name, dflt: getattr(settings, name, dflt), ) return getter(self.prefix + name, dflt) @property def QUERY_EMAIL(self): """ Request e-mail address from 3rd party account provider? E.g. using OpenID AX """ from allauth.account import app_settings as account_settings return self._setting("QUERY_EMAIL", account_settings.EMAIL_REQUIRED) @property def AUTO_SIGNUP(self): """ Attempt to bypass the signup form by using fields (e.g. username, email) retrieved from the social account provider. If a conflict arises due to a duplicate e-mail signup form will still kick in. """ return self._setting("AUTO_SIGNUP", True) @property def PROVIDERS(self): """ Provider specific settings """ return self._setting("PROVIDERS", {}) @property def EMAIL_REQUIRED(self): """ The user is required to hand over an e-mail address when signing up """ from allauth.account import app_settings as account_settings return self._setting("EMAIL_REQUIRED", account_settings.EMAIL_REQUIRED) @property def EMAIL_VERIFICATION(self): """ See e-mail verification method """ from allauth.account import app_settings as account_settings return self._setting("EMAIL_VERIFICATION", account_settings.EMAIL_VERIFICATION) @property def ADAPTER(self): return self._setting( "ADAPTER", "allauth.socialaccount.adapter.DefaultSocialAccountAdapter", ) @property def FORMS(self): return self._setting("FORMS", {}) @property def LOGIN_ON_GET(self): return self._setting("LOGIN_ON_GET", False) @property def STORE_TOKENS(self): return self._setting("STORE_TOKENS", True) @property def UID_MAX_LENGTH(self): return 191 # Ugly? Guido recommends this himself ... # http://mail.python.org/pipermail/python-ideas/2012-May/014969.html import sys # noqa app_settings = AppSettings("SOCIALACCOUNT_") app_settings.__name__ = __name__ sys.modules[__name__] = app_settings django-allauth-0.47.0/allauth/socialaccount/apps.py000066400000000000000000000004021415442050100222620ustar00rootroot00000000000000from django.apps import AppConfig from django.utils.translation import gettext_lazy as _ class SocialAccountConfig(AppConfig): name = "allauth.socialaccount" verbose_name = _("Social Accounts") default_auto_field = "django.db.models.AutoField" django-allauth-0.47.0/allauth/socialaccount/fields.py000066400000000000000000000031001415442050100225630ustar00rootroot00000000000000# Courtesy of django-social-auth import json from django.core.exceptions import ValidationError from django.db import models class JSONField(models.TextField): """Simple JSON field that stores python structures as JSON strings on database. """ def from_db_value(self, value, *args, **kwargs): return self.to_python(value) def to_python(self, value): """ Convert the input JSON value into python structures, raises django.core.exceptions.ValidationError if the data can't be converted. """ if self.blank and not value: return None if isinstance(value, str): try: return json.loads(value) except Exception as e: raise ValidationError(str(e)) else: return value def validate(self, value, model_instance): """Check value is a valid JSON string, raise ValidationError on error.""" if isinstance(value, str): super(JSONField, self).validate(value, model_instance) try: json.loads(value) except Exception as e: raise ValidationError(str(e)) def get_prep_value(self, value): """Convert value to JSON string before save""" try: return json.dumps(value) except Exception as e: raise ValidationError(str(e)) def value_from_object(self, obj): """Return value dumped to string.""" val = super(JSONField, self).value_from_object(obj) return self.get_prep_value(val) django-allauth-0.47.0/allauth/socialaccount/forms.py000066400000000000000000000042431415442050100224540ustar00rootroot00000000000000from __future__ import absolute_import from django import forms from allauth.account.forms import BaseSignupForm from . import app_settings, signals from .adapter import get_adapter from .models import SocialAccount class SignupForm(BaseSignupForm): def __init__(self, *args, **kwargs): self.sociallogin = kwargs.pop("sociallogin") initial = get_adapter().get_signup_form_initial_data(self.sociallogin) kwargs.update( { "initial": initial, "email_required": kwargs.get( "email_required", app_settings.EMAIL_REQUIRED ), } ) super(SignupForm, self).__init__(*args, **kwargs) def save(self, request): adapter = get_adapter(request) user = adapter.save_user(request, self.sociallogin, form=self) self.custom_signup(request, user) return user def validate_unique_email(self, value): try: return super(SignupForm, self).validate_unique_email(value) except forms.ValidationError: raise forms.ValidationError( get_adapter().error_messages["email_taken"] % self.sociallogin.account.get_provider().name ) class DisconnectForm(forms.Form): account = forms.ModelChoiceField( queryset=SocialAccount.objects.none(), widget=forms.RadioSelect, required=True, ) def __init__(self, *args, **kwargs): self.request = kwargs.pop("request") self.accounts = SocialAccount.objects.filter(user=self.request.user) super(DisconnectForm, self).__init__(*args, **kwargs) self.fields["account"].queryset = self.accounts def clean(self): cleaned_data = super(DisconnectForm, self).clean() account = cleaned_data.get("account") if account: get_adapter(self.request).validate_disconnect(account, self.accounts) return cleaned_data def save(self): account = self.cleaned_data["account"] account.delete() signals.social_account_removed.send( sender=SocialAccount, request=self.request, socialaccount=account ) django-allauth-0.47.0/allauth/socialaccount/helpers.py000066400000000000000000000153201415442050100227660ustar00rootroot00000000000000from django.contrib import messages from django.forms import ValidationError from django.http import HttpResponseRedirect from django.shortcuts import render from django.urls import reverse from allauth.account import app_settings as account_settings from allauth.account.adapter import get_adapter as get_account_adapter from allauth.account.utils import complete_signup, perform_login, user_username from allauth.exceptions import ImmediateHttpResponse from . import app_settings, signals from .adapter import get_adapter from .models import SocialLogin from .providers.base import AuthError, AuthProcess def _process_signup(request, sociallogin): auto_signup = get_adapter(request).is_auto_signup_allowed(request, sociallogin) if not auto_signup: request.session["socialaccount_sociallogin"] = sociallogin.serialize() url = reverse("socialaccount_signup") ret = HttpResponseRedirect(url) else: # Ok, auto signup it is, at least the e-mail address is ok. # We still need to check the username though... if account_settings.USER_MODEL_USERNAME_FIELD: username = user_username(sociallogin.user) try: get_account_adapter(request).clean_username(username) except ValidationError: # This username is no good ... user_username(sociallogin.user, "") # FIXME: This part contains a lot of duplication of logic # ("closed" rendering, create user, send email, in active # etc..) if not get_adapter(request).is_open_for_signup(request, sociallogin): return render( request, "account/signup_closed." + account_settings.TEMPLATE_EXTENSION, ) get_adapter(request).save_user(request, sociallogin, form=None) ret = complete_social_signup(request, sociallogin) return ret def _login_social_account(request, sociallogin): return perform_login( request, sociallogin.user, email_verification=app_settings.EMAIL_VERIFICATION, redirect_url=sociallogin.get_redirect_url(request), signal_kwargs={"sociallogin": sociallogin}, ) def render_authentication_error( request, provider_id, error=AuthError.UNKNOWN, exception=None, extra_context=None, ): try: if extra_context is None: extra_context = {} get_adapter(request).authentication_error( request, provider_id, error=error, exception=exception, extra_context=extra_context, ) except ImmediateHttpResponse as e: return e.response if error == AuthError.CANCELLED: return HttpResponseRedirect(reverse("socialaccount_login_cancelled")) context = { "auth_error": { "provider": provider_id, "code": error, "exception": exception, } } context.update(extra_context) return render( request, "socialaccount/authentication_error." + account_settings.TEMPLATE_EXTENSION, context, ) def _add_social_account(request, sociallogin): if request.user.is_anonymous: # This should not happen. Simply redirect to the connections # view (which has a login required) return HttpResponseRedirect(reverse("socialaccount_connections")) level = messages.INFO message = "socialaccount/messages/account_connected.txt" action = None if sociallogin.is_existing: if sociallogin.user != request.user: # Social account of other user. For now, this scenario # is not supported. Issue is that one cannot simply # remove the social account from the other user, as # that may render the account unusable. level = messages.ERROR message = "socialaccount/messages/account_connected_other.txt" else: # This account is already connected -- we give the opportunity # for customized behaviour through use of a signal. action = "updated" message = "socialaccount/messages/account_connected_updated.txt" signals.social_account_updated.send( sender=SocialLogin, request=request, sociallogin=sociallogin ) else: # New account, let's connect action = "added" sociallogin.connect(request, request.user) signals.social_account_added.send( sender=SocialLogin, request=request, sociallogin=sociallogin ) default_next = get_adapter(request).get_connect_redirect_url( request, sociallogin.account ) next_url = sociallogin.get_redirect_url(request) or default_next get_account_adapter(request).add_message( request, level, message, message_context={"sociallogin": sociallogin, "action": action}, ) return HttpResponseRedirect(next_url) def complete_social_login(request, sociallogin): assert not sociallogin.is_existing sociallogin.lookup() try: get_adapter(request).pre_social_login(request, sociallogin) signals.pre_social_login.send( sender=SocialLogin, request=request, sociallogin=sociallogin ) process = sociallogin.state.get("process") if process == AuthProcess.REDIRECT: return _social_login_redirect(request, sociallogin) elif process == AuthProcess.CONNECT: return _add_social_account(request, sociallogin) else: return _complete_social_login(request, sociallogin) except ImmediateHttpResponse as e: return e.response def _social_login_redirect(request, sociallogin): next_url = sociallogin.get_redirect_url(request) or "/" return HttpResponseRedirect(next_url) def _complete_social_login(request, sociallogin): if request.user.is_authenticated: get_account_adapter(request).logout(request) if sociallogin.is_existing: # Login existing user ret = _login_social_account(request, sociallogin) signals.social_account_updated.send( sender=SocialLogin, request=request, sociallogin=sociallogin ) else: # New social user ret = _process_signup(request, sociallogin) return ret def complete_social_signup(request, sociallogin): return complete_signup( request, sociallogin.user, app_settings.EMAIL_VERIFICATION, sociallogin.get_redirect_url(request), signal_kwargs={"sociallogin": sociallogin}, ) # TODO: Factor out callable importing functionality # See: account.utils.user_display def import_path(path): modname, _, attr = path.rpartition(".") m = __import__(modname, fromlist=[attr]) return getattr(m, attr) django-allauth-0.47.0/allauth/socialaccount/migrations/000077500000000000000000000000001415442050100231255ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/migrations/0001_initial.py000066400000000000000000000143041415442050100255720ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals from django.conf import settings from django.db import migrations, models import allauth.socialaccount.fields from allauth.socialaccount.providers import registry class Migration(migrations.Migration): dependencies = [ ("sites", "0001_initial"), migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( name="SocialAccount", fields=[ ( "id", models.AutoField( verbose_name="ID", serialize=False, auto_created=True, primary_key=True, ), ), ( "provider", models.CharField( max_length=30, verbose_name="provider", choices=registry.as_choices(), ), ), ( "uid", models.CharField( max_length=getattr( settings, "SOCIALACCOUNT_UID_MAX_LENGTH", 191 ), verbose_name="uid", ), ), ( "last_login", models.DateTimeField(auto_now=True, verbose_name="last login"), ), ( "date_joined", models.DateTimeField(auto_now_add=True, verbose_name="date joined"), ), ( "extra_data", allauth.socialaccount.fields.JSONField( default="{}", verbose_name="extra data" ), ), ( "user", models.ForeignKey( to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE ), ), ], options={ "verbose_name": "social account", "verbose_name_plural": "social accounts", }, bases=(models.Model,), ), migrations.CreateModel( name="SocialApp", fields=[ ( "id", models.AutoField( verbose_name="ID", serialize=False, auto_created=True, primary_key=True, ), ), ( "provider", models.CharField( max_length=30, verbose_name="provider", choices=registry.as_choices(), ), ), ("name", models.CharField(max_length=40, verbose_name="name")), ( "client_id", models.CharField( help_text="App ID, or consumer key", max_length=100, verbose_name="client id", ), ), ( "secret", models.CharField( help_text="API secret, client secret, or consumer secret", max_length=100, verbose_name="secret key", ), ), ( "key", models.CharField( help_text="Key", max_length=100, verbose_name="key", blank=True, ), ), ("sites", models.ManyToManyField(to="sites.Site", blank=True)), ], options={ "verbose_name": "social application", "verbose_name_plural": "social applications", }, bases=(models.Model,), ), migrations.CreateModel( name="SocialToken", fields=[ ( "id", models.AutoField( verbose_name="ID", serialize=False, auto_created=True, primary_key=True, ), ), ( "token", models.TextField( help_text='"oauth_token" (OAuth1) or access token (OAuth2)', verbose_name="token", ), ), ( "token_secret", models.TextField( help_text='"oauth_token_secret" (OAuth1) or refresh token (OAuth2)', verbose_name="token secret", blank=True, ), ), ( "expires_at", models.DateTimeField( null=True, verbose_name="expires at", blank=True ), ), ( "account", models.ForeignKey( to="socialaccount.SocialAccount", on_delete=models.CASCADE, ), ), ( "app", models.ForeignKey( to="socialaccount.SocialApp", on_delete=models.CASCADE ), ), ], options={ "verbose_name": "social application token", "verbose_name_plural": "social application tokens", }, bases=(models.Model,), ), migrations.AlterUniqueTogether( name="socialtoken", unique_together=set([("app", "account")]), ), migrations.AlterUniqueTogether( name="socialaccount", unique_together=set([("provider", "uid")]), ), ] django-allauth-0.47.0/allauth/socialaccount/migrations/0002_token_max_lengths.py000066400000000000000000000025761415442050100276630ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals from django.conf import settings from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ ("socialaccount", "0001_initial"), ] operations = [ migrations.AlterField( model_name="socialaccount", name="uid", field=models.CharField( max_length=getattr(settings, "SOCIALACCOUNT_UID_MAX_LENGTH", 191), verbose_name="uid", ), ), migrations.AlterField( model_name="socialapp", name="client_id", field=models.CharField( help_text="App ID, or consumer key", max_length=191, verbose_name="client id", ), ), migrations.AlterField( model_name="socialapp", name="key", field=models.CharField( help_text="Key", max_length=191, verbose_name="key", blank=True ), ), migrations.AlterField( model_name="socialapp", name="secret", field=models.CharField( help_text="API secret, client secret, or consumer secret", max_length=191, verbose_name="secret key", blank=True, ), ), ] django-allauth-0.47.0/allauth/socialaccount/migrations/0003_extra_data_default_dict.py000066400000000000000000000010701415442050100307620ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals from django.db import migrations, models import allauth.socialaccount.fields class Migration(migrations.Migration): dependencies = [ ("socialaccount", "0002_token_max_lengths"), ] operations = [ migrations.AlterField( model_name="socialaccount", name="extra_data", field=allauth.socialaccount.fields.JSONField( default=dict, verbose_name="extra data" ), preserve_default=True, ), ] django-allauth-0.47.0/allauth/socialaccount/migrations/__init__.py000066400000000000000000000000001415442050100252240ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/models.py000066400000000000000000000272411415442050100226140ustar00rootroot00000000000000from __future__ import absolute_import from django.contrib.auth import authenticate from django.contrib.sites.models import Site from django.contrib.sites.shortcuts import get_current_site from django.core.exceptions import PermissionDenied from django.db import models from django.utils.crypto import get_random_string from django.utils.encoding import force_str from django.utils.translation import gettext_lazy as _ import allauth.app_settings from allauth.account.models import EmailAddress from allauth.account.utils import get_next_redirect_url, setup_user_email from allauth.utils import get_user_model from ..utils import get_request_param from . import app_settings, providers from .adapter import get_adapter from .fields import JSONField class SocialAppManager(models.Manager): def get_current(self, provider, request=None): cache = {} if request: cache = getattr(request, "_socialapp_cache", {}) request._socialapp_cache = cache app = cache.get(provider) if not app: site = get_current_site(request) app = self.get(sites__id=site.id, provider=provider) cache[provider] = app return app class SocialApp(models.Model): objects = SocialAppManager() provider = models.CharField( verbose_name=_("provider"), max_length=30, choices=providers.registry.as_choices(), ) name = models.CharField(verbose_name=_("name"), max_length=40) client_id = models.CharField( verbose_name=_("client id"), max_length=191, help_text=_("App ID, or consumer key"), ) secret = models.CharField( verbose_name=_("secret key"), max_length=191, blank=True, help_text=_("API secret, client secret, or consumer secret"), ) key = models.CharField( verbose_name=_("key"), max_length=191, blank=True, help_text=_("Key") ) # Most apps can be used across multiple domains, therefore we use # a ManyToManyField. Note that Facebook requires an app per domain # (unless the domains share a common base name). # blank=True allows for disabling apps without removing them sites = models.ManyToManyField(Site, blank=True) # We want to move away from storing secrets in the database. So, we're # putting a halt towards adding more fields for additional secrets, such as # the certificate some providers need. Therefore, the certificate is not a # DB backed field and can only be set using the ``APP`` configuration key # in the provider settings. certificate_key = None class Meta: verbose_name = _("social application") verbose_name_plural = _("social applications") def __str__(self): return self.name class SocialAccount(models.Model): user = models.ForeignKey(allauth.app_settings.USER_MODEL, on_delete=models.CASCADE) provider = models.CharField( verbose_name=_("provider"), max_length=30, choices=providers.registry.as_choices(), ) # Just in case you're wondering if an OpenID identity URL is going # to fit in a 'uid': # # Ideally, URLField(max_length=1024, unique=True) would be used # for identity. However, MySQL has a max_length limitation of 191 # for URLField (in case of utf8mb4). How about # models.TextField(unique=True) then? Well, that won't work # either for MySQL due to another bug[1]. So the only way out # would be to drop the unique constraint, or switch to shorter # identity URLs. Opted for the latter, as [2] suggests that # identity URLs are supposed to be short anyway, at least for the # old spec. # # [1] http://code.djangoproject.com/ticket/2495. # [2] http://openid.net/specs/openid-authentication-1_1.html#limits uid = models.CharField( verbose_name=_("uid"), max_length=app_settings.UID_MAX_LENGTH ) last_login = models.DateTimeField(verbose_name=_("last login"), auto_now=True) date_joined = models.DateTimeField(verbose_name=_("date joined"), auto_now_add=True) extra_data = JSONField(verbose_name=_("extra data"), default=dict) class Meta: unique_together = ("provider", "uid") verbose_name = _("social account") verbose_name_plural = _("social accounts") def authenticate(self): return authenticate(account=self) def __str__(self): return force_str(self.user) def get_profile_url(self): return self.get_provider_account().get_profile_url() def get_avatar_url(self): return self.get_provider_account().get_avatar_url() def get_provider(self): return providers.registry.by_id(self.provider) def get_provider_account(self): return self.get_provider().wrap_account(self) class SocialToken(models.Model): app = models.ForeignKey(SocialApp, on_delete=models.CASCADE) account = models.ForeignKey(SocialAccount, on_delete=models.CASCADE) token = models.TextField( verbose_name=_("token"), help_text=_('"oauth_token" (OAuth1) or access token (OAuth2)'), ) token_secret = models.TextField( blank=True, verbose_name=_("token secret"), help_text=_('"oauth_token_secret" (OAuth1) or refresh token (OAuth2)'), ) expires_at = models.DateTimeField( blank=True, null=True, verbose_name=_("expires at") ) class Meta: unique_together = ("app", "account") verbose_name = _("social application token") verbose_name_plural = _("social application tokens") def __str__(self): return self.token class SocialLogin(object): """ Represents a social user that is in the process of being logged in. This consists of the following information: `account` (`SocialAccount` instance): The social account being logged in. Providers are not responsible for checking whether or not an account already exists or not. Therefore, a provider typically creates a new (unsaved) `SocialAccount` instance. The `User` instance pointed to by the account (`account.user`) may be prefilled by the provider for use as a starting point later on during the signup process. `token` (`SocialToken` instance): An optional access token token that results from performing a successful authentication handshake. `state` (`dict`): The state to be preserved during the authentication handshake. Note that this state may end up in the url -- do not put any secrets in here. It currently only contains the url to redirect to after login. `email_addresses` (list of `EmailAddress`): Optional list of e-mail addresses retrieved from the provider. """ def __init__(self, user=None, account=None, token=None, email_addresses=[]): if token: assert token.account is None or token.account == account self.token = token self.user = user self.account = account self.email_addresses = email_addresses self.state = {} def connect(self, request, user): self.user = user self.save(request, connect=True) def serialize(self): serialize_instance = get_adapter().serialize_instance ret = dict( account=serialize_instance(self.account), user=serialize_instance(self.user), state=self.state, email_addresses=[serialize_instance(ea) for ea in self.email_addresses], ) if self.token: ret["token"] = serialize_instance(self.token) return ret @classmethod def deserialize(cls, data): deserialize_instance = get_adapter().deserialize_instance account = deserialize_instance(SocialAccount, data["account"]) user = deserialize_instance(get_user_model(), data["user"]) if "token" in data: token = deserialize_instance(SocialToken, data["token"]) else: token = None email_addresses = [] for ea in data["email_addresses"]: email_address = deserialize_instance(EmailAddress, ea) email_addresses.append(email_address) ret = cls() ret.token = token ret.account = account ret.user = user ret.email_addresses = email_addresses ret.state = data["state"] return ret def save(self, request, connect=False): """ Saves a new account. Note that while the account is new, the user may be an existing one (when connecting accounts) """ assert not self.is_existing user = self.user user.save() self.account.user = user self.account.save() if app_settings.STORE_TOKENS and self.token and self.token.app_id: self.token.account = self.account self.token.save() if connect: # TODO: Add any new email addresses automatically? pass else: setup_user_email(request, user, self.email_addresses) @property def is_existing(self): """ Account is temporary, not yet backed by a database record. """ return self.account.pk is not None def lookup(self): """ Lookup existing account, if any. """ assert not self.is_existing try: a = SocialAccount.objects.get( provider=self.account.provider, uid=self.account.uid ) # Update account a.extra_data = self.account.extra_data self.account = a self.user = self.account.user a.save() # Update token if app_settings.STORE_TOKENS and self.token and self.token.app.pk: assert not self.token.pk try: t = SocialToken.objects.get( account=self.account, app=self.token.app ) t.token = self.token.token if self.token.token_secret: # only update the refresh token if we got one # many oauth2 providers do not resend the refresh token t.token_secret = self.token.token_secret t.expires_at = self.token.expires_at t.save() self.token = t except SocialToken.DoesNotExist: self.token.account = a self.token.save() except SocialAccount.DoesNotExist: pass def get_redirect_url(self, request): url = self.state.get("next") return url @classmethod def state_from_request(cls, request): state = {} next_url = get_next_redirect_url(request) if next_url: state["next"] = next_url state["process"] = get_request_param(request, "process", "login") state["scope"] = get_request_param(request, "scope", "") state["auth_params"] = get_request_param(request, "auth_params", "") return state @classmethod def stash_state(cls, request): state = cls.state_from_request(request) verifier = get_random_string(12) request.session["socialaccount_state"] = (state, verifier) return verifier @classmethod def unstash_state(cls, request): if "socialaccount_state" not in request.session: raise PermissionDenied() state, verifier = request.session.pop("socialaccount_state") return state @classmethod def verify_and_unstash_state(cls, request, verifier): if "socialaccount_state" not in request.session: raise PermissionDenied() state, verifier2 = request.session.pop("socialaccount_state") if verifier != verifier2: raise PermissionDenied() return state django-allauth-0.47.0/allauth/socialaccount/providers/000077500000000000000000000000001415442050100227665ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/__init__.py000066400000000000000000000031011415442050100250720ustar00rootroot00000000000000import importlib from collections import OrderedDict from django.conf import settings class ProviderRegistry(object): def __init__(self): self.provider_map = OrderedDict() self.loaded = False def get_list(self, request=None): self.load() return [provider_cls(request) for provider_cls in self.provider_map.values()] def register(self, cls): self.provider_map[cls.id] = cls def by_id(self, id, request=None): self.load() return self.provider_map[id](request=request) def as_choices(self): self.load() for provider_cls in self.provider_map.values(): yield (provider_cls.id, provider_cls.name) def load(self): # TODO: Providers register with the provider registry when # loaded. Here, we build the URLs for all registered providers. So, we # really need to be sure all providers did register, which is why we're # forcefully importing the `provider` modules here. The overall # mechanism is way to magical and depends on the import order et al, so # all of this really needs to be revisited. if not self.loaded: for app in settings.INSTALLED_APPS: try: provider_module = importlib.import_module(app + ".provider") except ImportError: pass else: for cls in getattr(provider_module, "provider_classes", []): self.register(cls) self.loaded = True registry = ProviderRegistry() django-allauth-0.47.0/allauth/socialaccount/providers/agave/000077500000000000000000000000001415442050100240515ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/agave/__init__.py000066400000000000000000000000001415442050100261500ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/agave/provider.py000066400000000000000000000020771415442050100262630ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class AgaveAccount(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("web_url", "dflt") def get_avatar_url(self): return self.account.extra_data.get("avatar_url", "dflt") def to_str(self): dflt = super(AgaveAccount, self).to_str() return self.account.extra_data.get("name", dflt) class AgaveProvider(OAuth2Provider): id = "agave" name = "Agave" account_class = AgaveAccount def extract_uid(self, data): return str(data.get("create_time")) def extract_common_fields(self, data): return dict( email=data.get("email"), username=data.get("username", ""), name=( (data.get("first_name", "") + " " + data.get("last_name", "")).strip() ), ) def get_default_scope(self): scope = ["PRODUCTION"] return scope provider_classes = [AgaveProvider] django-allauth-0.47.0/allauth/socialaccount/providers/agave/tests.py000066400000000000000000000014661415442050100255740ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import AgaveProvider class AgaveTests(OAuth2TestsMixin, TestCase): provider_id = AgaveProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "status": "success", "message": "User details retrieved successfully.", "version": "2.0.0-SNAPSHOT-rc3fad", "result": { "first_name": "John", "last_name": "Doe", "full_name": "John Doe", "email": "jon@doe.edu", "phone": "", "mobile_phone": "", "status": "Active", "create_time": "20180322043812Z", "username": "jdoe" } } """, ) django-allauth-0.47.0/allauth/socialaccount/providers/agave/urls.py000066400000000000000000000003101415442050100254020ustar00rootroot00000000000000from allauth.socialaccount.providers.agave.provider import AgaveProvider from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns urlpatterns = default_urlpatterns(AgaveProvider) django-allauth-0.47.0/allauth/socialaccount/providers/agave/views.py000066400000000000000000000023651415442050100255660ustar00rootroot00000000000000import requests from allauth.socialaccount import app_settings from allauth.socialaccount.providers.agave.provider import AgaveProvider from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) class AgaveAdapter(OAuth2Adapter): provider_id = AgaveProvider.id settings = app_settings.PROVIDERS.get(provider_id, {}) provider_base_url = settings.get("API_URL", "https://public.agaveapi.co") access_token_url = "{0}/token".format(provider_base_url) authorize_url = "{0}/authorize".format(provider_base_url) profile_url = "{0}/profiles/v2/me".format(provider_base_url) def complete_login(self, request, app, token, response): extra_data = requests.get( self.profile_url, params={"access_token": token.token}, headers={ "Authorization": "Bearer " + token.token, }, ) user_profile = ( extra_data.json()["result"] if "result" in extra_data.json() else {} ) return self.get_provider().sociallogin_from_response(request, user_profile) oauth2_login = OAuth2LoginView.adapter_view(AgaveAdapter) oauth2_callback = OAuth2CallbackView.adapter_view(AgaveAdapter) django-allauth-0.47.0/allauth/socialaccount/providers/amazon/000077500000000000000000000000001415442050100242535ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/amazon/__init__.py000066400000000000000000000000001415442050100263520ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/amazon/provider.py000066400000000000000000000017211415442050100264600ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class AmazonAccount(ProviderAccount): def to_str(self): return self.account.extra_data.get("name", super(AmazonAccount, self).to_str()) class AmazonProvider(OAuth2Provider): id = "amazon" name = "Amazon" account_class = AmazonAccount def get_default_scope(self): return ["profile"] def extract_uid(self, data): return str(data["user_id"]) def extract_common_fields(self, data): # Hackish way of splitting the fullname. # Asumes no middlenames. name = data.get("name", "") first_name, last_name = name, "" if name and " " in name: first_name, last_name = name.split(" ", 1) return dict( email=data.get("email", ""), last_name=last_name, first_name=first_name ) provider_classes = [AmazonProvider] django-allauth-0.47.0/allauth/socialaccount/providers/amazon/tests.py000066400000000000000000000011041415442050100257630ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import AmazonProvider class AmazonTests(OAuth2TestsMixin, TestCase): provider_id = AmazonProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "Profile":{ "CustomerId":"amzn1.account.K2LI23KL2LK2", "Name":"John Doe", "PrimaryEmail":"johndoe@example.com" } }""", ) django-allauth-0.47.0/allauth/socialaccount/providers/amazon/urls.py000066400000000000000000000002461415442050100256140ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import AmazonProvider urlpatterns = default_urlpatterns(AmazonProvider) django-allauth-0.47.0/allauth/socialaccount/providers/amazon/views.py000066400000000000000000000022001415442050100257540ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import AmazonProvider class AmazonOAuth2Adapter(OAuth2Adapter): provider_id = AmazonProvider.id access_token_url = "https://api.amazon.com/auth/o2/token" authorize_url = "http://www.amazon.com/ap/oa" profile_url = "https://api.amazon.com/user/profile" supports_state = False redirect_uri_protocol = "https" def complete_login(self, request, app, token, **kwargs): response = requests.get(self.profile_url, params={"access_token": token}) extra_data = response.json() if "Profile" in extra_data: extra_data = { "user_id": extra_data["Profile"]["CustomerId"], "name": extra_data["Profile"]["Name"], "email": extra_data["Profile"]["PrimaryEmail"], } return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(AmazonOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(AmazonOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/amazon_cognito/000077500000000000000000000000001415442050100257755ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/amazon_cognito/__init__.py000066400000000000000000000000001415442050100300740ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/amazon_cognito/provider.py000066400000000000000000000050501415442050100302010ustar00rootroot00000000000000from allauth.account.models import EmailAddress from allauth.socialaccount.providers.amazon_cognito.utils import ( convert_to_python_bool_if_value_is_json_string_bool, ) from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class AmazonCognitoAccount(ProviderAccount): def to_str(self): dflt = super(AmazonCognitoAccount, self).to_str() return self.account.extra_data.get("username", dflt) def get_avatar_url(self): return self.account.extra_data.get("picture") def get_profile_url(self): return self.account.extra_data.get("profile") class AmazonCognitoProvider(OAuth2Provider): id = "amazon_cognito" name = "Amazon Cognito" account_class = AmazonCognitoAccount def extract_uid(self, data): return str(data["sub"]) def extract_common_fields(self, data): return { "email": data.get("email"), "first_name": data.get("given_name"), "last_name": data.get("family_name"), } def get_default_scope(self): return ["openid", "profile", "email"] def extract_email_addresses(self, data): email = data.get("email") verified = convert_to_python_bool_if_value_is_json_string_bool( data.get("email_verified", False) ) return ( [EmailAddress(email=email, verified=verified, primary=True)] if email else [] ) def extract_extra_data(self, data): return { "address": data.get("address"), "birthdate": data.get("birthdate"), "gender": data.get("gender"), "locale": data.get("locale"), "middlename": data.get("middlename"), "nickname": data.get("nickname"), "phone_number": data.get("phone_number"), "phone_number_verified": convert_to_python_bool_if_value_is_json_string_bool( data.get("phone_number_verified") ), "picture": data.get("picture"), "preferred_username": data.get("preferred_username"), "profile": data.get("profile"), "website": data.get("website"), "zoneinfo": data.get("zoneinfo"), } @classmethod def get_slug(cls): # IMPORTANT: Amazon Cognito does not support `_` characters # as part of their redirect URI. return super(AmazonCognitoProvider, cls).get_slug().replace("_", "-") provider_classes = [AmazonCognitoProvider] django-allauth-0.47.0/allauth/socialaccount/providers/amazon_cognito/tests.py000066400000000000000000000043101415442050100275070ustar00rootroot00000000000000import json from django.test import override_settings from allauth.account.models import EmailAddress from allauth.socialaccount.models import SocialAccount from allauth.socialaccount.providers.amazon_cognito.provider import ( AmazonCognitoProvider, ) from allauth.socialaccount.providers.amazon_cognito.views import ( AmazonCognitoOAuth2Adapter, ) from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase def _get_mocked_claims(): return { "sub": "4993b410-8a1b-4c36-b843-a9c1a697e6b7", "given_name": "John", "family_name": "Doe", "email": "jdoe@example.com", "username": "johndoe", } @override_settings( SOCIALACCOUNT_PROVIDERS={ "amazon_cognito": {"DOMAIN": "https://domain.auth.us-east-1.amazoncognito.com"} } ) class AmazonCognitoTestCase(OAuth2TestsMixin, TestCase): provider_id = AmazonCognitoProvider.id def get_mocked_response(self): mocked_payload = json.dumps(_get_mocked_claims()) return MockedResponse(status_code=200, content=mocked_payload) @override_settings(SOCIALACCOUNT_PROVIDERS={"amazon_cognito": {}}) def test_oauth2_adapter_raises_if_domain_settings_is_missing( self, ): mocked_response = self.get_mocked_response() with self.assertRaises( ValueError, msg=AmazonCognitoOAuth2Adapter.DOMAIN_KEY_MISSING_ERROR, ): self.login(mocked_response) def test_saves_email_as_verified_if_email_is_verified_in_cognito( self, ): mocked_claims = _get_mocked_claims() mocked_claims["email_verified"] = True mocked_payload = json.dumps(mocked_claims) mocked_response = MockedResponse(status_code=200, content=mocked_payload) self.login(mocked_response) user_id = SocialAccount.objects.get(uid=mocked_claims["sub"]).user_id email_address = EmailAddress.objects.get(user_id=user_id) self.assertEqual(email_address.email, mocked_claims["email"]) self.assertTrue(email_address.verified) def test_provider_slug_replaces_underscores_with_hyphens(self): self.assertTrue("_" not in self.provider.get_slug()) django-allauth-0.47.0/allauth/socialaccount/providers/amazon_cognito/urls.py000066400000000000000000000003521415442050100273340ustar00rootroot00000000000000from allauth.socialaccount.providers.amazon_cognito.provider import ( AmazonCognitoProvider, ) from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns urlpatterns = default_urlpatterns(AmazonCognitoProvider) django-allauth-0.47.0/allauth/socialaccount/providers/amazon_cognito/utils.py000066400000000000000000000002361415442050100275100ustar00rootroot00000000000000def convert_to_python_bool_if_value_is_json_string_bool(s): if s == "true": return True elif s == "false": return False return s django-allauth-0.47.0/allauth/socialaccount/providers/amazon_cognito/views.py000066400000000000000000000030731415442050100275070ustar00rootroot00000000000000import requests from allauth.socialaccount import app_settings from allauth.socialaccount.providers.amazon_cognito.provider import ( AmazonCognitoProvider, ) from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) class AmazonCognitoOAuth2Adapter(OAuth2Adapter): provider_id = AmazonCognitoProvider.id DOMAIN_KEY_MISSING_ERROR = ( '"DOMAIN" key is missing in Amazon Cognito configuration.' ) @property def settings(self): return app_settings.PROVIDERS.get(self.provider_id, {}) @property def domain(self): domain = self.settings.get("DOMAIN") if domain is None: raise ValueError(self.DOMAIN_KEY_MISSING_ERROR) return domain @property def access_token_url(self): return "{}/oauth2/token".format(self.domain) @property def authorize_url(self): return "{}/oauth2/authorize".format(self.domain) @property def profile_url(self): return "{}/oauth2/userInfo".format(self.domain) def complete_login(self, request, app, access_token, **kwargs): headers = { "Authorization": "Bearer {}".format(access_token), } extra_data = requests.get(self.profile_url, headers=headers) extra_data.raise_for_status() return self.get_provider().sociallogin_from_response(request, extra_data.json()) oauth2_login = OAuth2LoginView.adapter_view(AmazonCognitoOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(AmazonCognitoOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/angellist/000077500000000000000000000000001415442050100247505ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/angellist/__init__.py000066400000000000000000000000001415442050100270470ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/angellist/provider.py000066400000000000000000000016431415442050100271600ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class AngelListAccount(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("angellist_url") def get_avatar_url(self): return self.account.extra_data.get("image") def to_str(self): dflt = super(AngelListAccount, self).to_str() return self.account.extra_data.get("name", dflt) class AngelListProvider(OAuth2Provider): id = "angellist" name = "AngelList" account_class = AngelListAccount def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): return dict( email=data.get("email"), username=data.get("angellist_url").split("/")[-1], name=data.get("name"), ) provider_classes = [AngelListProvider] django-allauth-0.47.0/allauth/socialaccount/providers/angellist/tests.py000066400000000000000000000015701415442050100264670ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import AngelListProvider class AngelListTests(OAuth2TestsMixin, TestCase): provider_id = AngelListProvider.id def get_mocked_response(self): return MockedResponse( 200, """ {"name":"pennersr","id":424732,"bio":"","follower_count":0, "angellist_url":"https://angel.co/dsxtst", "image":"https://angel.co/images/shared/nopic.png", "email":"raymond.penners@example.com","blog_url":null, "online_bio_url":null,"twitter_url":"https://twitter.com/dsxtst", "facebook_url":null,"linkedin_url":null,"aboutme_url":null, "github_url":null,"dribbble_url":null,"behance_url":null, "what_ive_built":null,"locations":[],"roles":[],"skills":[], "investor":false,"scopes":["message","talent","dealflow","comment", "email"]} """, ) django-allauth-0.47.0/allauth/socialaccount/providers/angellist/urls.py000066400000000000000000000002541415442050100263100ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import AngelListProvider urlpatterns = default_urlpatterns(AngelListProvider) django-allauth-0.47.0/allauth/socialaccount/providers/angellist/views.py000066400000000000000000000015431415442050100264620ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import AngelListProvider class AngelListOAuth2Adapter(OAuth2Adapter): provider_id = AngelListProvider.id access_token_url = "https://angel.co/api/oauth/token/" authorize_url = "https://angel.co/api/oauth/authorize/" profile_url = "https://api.angel.co/1/me/" supports_state = False def complete_login(self, request, app, token, **kwargs): resp = requests.get(self.profile_url, params={"access_token": token.token}) extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(AngelListOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(AngelListOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/apple/000077500000000000000000000000001415442050100240675ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/apple/__init__.py000066400000000000000000000000001415442050100261660ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/apple/apple_session.py000066400000000000000000000024531415442050100273110ustar00rootroot00000000000000from importlib import import_module from urllib.parse import urlparse import django from django.conf import settings from django.utils.cache import patch_vary_headers APPLE_SESSION_COOKIE_NAME = "apple-login-session" engine = import_module(settings.SESSION_ENGINE) SessionStore = engine.SessionStore def add_apple_session(request): """ Fetch an apple login session """ if not hasattr(request, "apple_login_session"): session_key = request.COOKIES.get(APPLE_SESSION_COOKIE_NAME) request.apple_login_session = SessionStore(session_key) def persist_apple_session(request, response): """ Save `request.apple_login_session` and set the cookie """ patch_vary_headers(response, ("Cookie",)) request.apple_login_session.save() kwargs = {} if django.VERSION >= (2, 1): samesite = getattr(settings, "SESSION_COOKIE_SAMESITE", None) if samesite: kwargs["samesite"] = samesite response.set_cookie( APPLE_SESSION_COOKIE_NAME, request.apple_login_session.session_key, max_age=None, expires=None, domain=settings.SESSION_COOKIE_DOMAIN, # The cookie is only needed on this endpoint path=urlparse(response.url).path, secure=True, httponly=None, **kwargs ) django-allauth-0.47.0/allauth/socialaccount/providers/apple/client.py000066400000000000000000000061701415442050100257230ustar00rootroot00000000000000import requests from datetime import datetime, timedelta from urllib.parse import parse_qsl, quote, urlencode from django.core.exceptions import ImproperlyConfigured import jwt from allauth.socialaccount.adapter import get_adapter from allauth.socialaccount.providers.oauth2.client import ( OAuth2Client, OAuth2Error, ) def jwt_encode(*args, **kwargs): resp = jwt.encode(*args, **kwargs) if isinstance(resp, bytes): # For PyJWT <2 resp = resp.decode("utf-8") return resp class Scope(object): EMAIL = "email" NAME = "name" class AppleOAuth2Client(OAuth2Client): """ Custom client because `Sign In With Apple`: * requires `response_mode` field in redirect_url * requires special `client_secret` as JWT """ def generate_client_secret(self): """Create a JWT signed with an apple provided private key""" now = datetime.utcnow() app = get_adapter().get_app(self.request, "apple") if not app.key: raise ImproperlyConfigured("Apple 'key' missing") if not app.certificate_key: raise ImproperlyConfigured("Apple 'certificate_key' missing") claims = { "iss": app.key, "aud": "https://appleid.apple.com", "sub": self.get_client_id(), "iat": now, "exp": now + timedelta(hours=1), } headers = {"kid": self.consumer_secret, "alg": "ES256"} client_secret = jwt_encode( payload=claims, key=app.certificate_key, algorithm="ES256", headers=headers ) return client_secret def get_client_id(self): """We support multiple client_ids, but use the first one for api calls""" return self.consumer_key.split(",")[0] def get_access_token(self, code): url = self.access_token_url client_secret = self.generate_client_secret() data = { "client_id": self.get_client_id(), "code": code, "grant_type": "authorization_code", "redirect_uri": self.callback_url, "client_secret": client_secret, } self._strip_empty_keys(data) resp = requests.request( self.access_token_method, url, data=data, headers=self.headers ) access_token = None if resp.status_code in [200, 201]: try: access_token = resp.json() except ValueError: access_token = dict(parse_qsl(resp.text)) if not access_token or "access_token" not in access_token: raise OAuth2Error("Error retrieving access token: %s" % resp.content) return access_token def get_redirect_url(self, authorization_url, extra_params): params = { "client_id": self.get_client_id(), "redirect_uri": self.callback_url, "response_mode": "form_post", "scope": self.scope, "response_type": "code id_token", } if self.state: params["state"] = self.state params.update(extra_params) return "%s?%s" % (authorization_url, urlencode(params, quote_via=quote)) django-allauth-0.47.0/allauth/socialaccount/providers/apple/provider.py000066400000000000000000000025441415442050100263000ustar00rootroot00000000000000from allauth.account.models import EmailAddress from allauth.socialaccount.app_settings import QUERY_EMAIL from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class AppleProvider(OAuth2Provider): id = "apple" name = "Apple" account_class = ProviderAccount def extract_uid(self, data): return str(data["sub"]) def extract_common_fields(self, data): fields = {"email": data.get("email")} # If the name was provided name = data.get("name") if name: fields["first_name"] = name.get("firstName", "") fields["last_name"] = name.get("lastName", "") return fields def extract_email_addresses(self, data): ret = [] email = data.get("email") verified = data.get("email_verified") if isinstance(verified, str): verified = verified.lower() == "true" if email: ret.append( EmailAddress( email=email, verified=verified, primary=True, ) ) return ret def get_default_scope(self): scopes = ["name"] if QUERY_EMAIL: scopes.append("email") return scopes provider_classes = [AppleProvider] django-allauth-0.47.0/allauth/socialaccount/providers/apple/tests.py000066400000000000000000000220001415442050100255750ustar00rootroot00000000000000import json from datetime import datetime, timedelta from importlib import import_module from urllib.parse import parse_qs, urlparse from django.conf import settings from django.test.utils import override_settings from django.urls import reverse from django.utils.http import urlencode import jwt from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase, mocked_response from .apple_session import APPLE_SESSION_COOKIE_NAME from .client import jwt_encode from .provider import AppleProvider # Generated on https://mkjwk.org/, used to sign and verify the apple id_token TESTING_JWT_KEYSET = { "p": ( "4ADzS5jKx_kdQihyOocVS0Qwwo7m0f7Ow56EadySJ-cmnwoHHF3AxgRaq-h-KwybSphv" "dc-X7NbS79-b9dumHKyt1MeVLAsDZD1a-uQCEneY1g9LsQkscNr7OggcpvMg5UUFwv6A" "kavu8cB0iyhNdha5_AWX27K5lNebvpaXEJ8" ), "kty": "RSA", "q": ( "yy5UvMjrvZyO1Os_nxXIugCa3NyWOkC8oMppPvr1Bl5AnF_xwXN2n9ozPd9Nb3Q3n-om" "NgLayyUxhwIjWDlI67Vbx-ESuff8ZEBKuTK0Gdmr4C_QU_j0gvvNMNJweSPxDdRmIUgO" "njTVNWmdqFTZs43jXAT4J519rgveNLAkGNE" ), "d": ( "riPuGIDde88WS03CVbo_mZ9toFWPyTxvuz8VInJ9S1ZxULo-hQWDBohWGYwvg8cgfXck" "cqWt5OBqNvPYdLgwb84uVi2JeEHmhcQSc_x0zfRTau5HVE2KdR-gWxQjPWoaBHeDVqwo" "PKaU2XYxa-gYDXcuSJWHz3BX13oInDEFCXr6VwiLiwLBFsb63EEHwyWXJbTpoar7AARW" "kz76qtngDkk4t9gk_Q0L1y1qf1GeWiAL7xWb-bdptma4-1ui-R2219-1ONEZ41v_jsIS" "_z8ooXmVCbUsHV4Z1UDpRvpORVE3u57WK3qXUdAtZsXjaIwkdItbDmL1jFUgefwfO91Y" "YQ" ), "e": "AQAB", "use": "sig", "kid": "testkey", "qi": ( "R0Hu4YmpHzw3SKWGYuAcAo6B97-JlN2fXiTjZ2g8eHGQX7LSoKEu0Hmu5hcBZYSgOuor" "IPsPUu3mNtx3pjLMOaJRk34VwcYu7h23ogEKGcPUt1c4tTotFDdw8WFptDOw4ow31Tml" "BPExLqzzGjJeQSNULB1bExuuhYMWx6wBXo8" ), "dp": ( "WBaHlnbjZ3hDVTzqjrGIYizSr-_aPUJitPKlR6wBncd8nJYo7bLAmB4mOewXkX5HozIG" "wuF78RsZoFLi1fAmhqgxQ7eopcU-9DBcksUPO4vkgmlJbrkYzNiQauW9vrllekOGXIQQ" "szhVoqP4MLEMpR-Sy9S3PyItcKbJDE3T4ik" ), "alg": "RS256", "dq": ( "Ar5kbIw2CsBzeVKX8FkF9eUOMk9URAMdyPoSw8P1zRk2vCXbiOY7Qttad8ptLEUgfytV" "SsNtGvMsoQsZWRak8nHnhGJ4s0QzB1OK7sdNgU_cL1HV-VxSSPaHhdJBrJEcrzggDPEB" "KYfDHU6Iz34d1nvjBxoWE8rfqJsGbCW4xxE" ), "n": ( "sclLPioUv4VOcOZWAKoRhcvwIH2jOhoHhSI_Cj5c5zSp7qaK8jCU6T7-GObsgrhpty-k" "26ZuqRdgu9d-62WO8OBGt1e0wxbTh128-nTTrOESHUlV_K1wpJmXOxNpJiybcgzZNbAm" "ACmsHfxZvN9bt7gKPXxf3-_zFAf12PbYMrOionAJ1N_4HxL7fz3xkr5C87Av06QNilIC" "-mA-4n9Eqw_R2DYNpE3RYMdWtwKqBwJC8qs3677RpG9vcc-yZ_97pEiytd2FBJ8uoTwH" "d3DHJB8UVgBSh1kMUpSdoM7HxVzKx732nx6Kusln79LrsfOzrXF4enkfKJYI40-uwT95" "zw" ), } # Mocked version of the test data from https://appleid.apple.com/auth/keys KEY_SERVER_RESP_JSON = json.dumps( { "keys": [ { "kty": TESTING_JWT_KEYSET["kty"], "kid": TESTING_JWT_KEYSET["kid"], "use": TESTING_JWT_KEYSET["use"], "alg": TESTING_JWT_KEYSET["alg"], "n": TESTING_JWT_KEYSET["n"], "e": TESTING_JWT_KEYSET["e"], } ] } ) def sign_id_token(payload): """ Sign a payload as apple normally would for the id_token. """ signing_key = jwt.algorithms.RSAAlgorithm.from_jwk(json.dumps(TESTING_JWT_KEYSET)) return jwt_encode( payload, signing_key, algorithm="RS256", headers={"kid": TESTING_JWT_KEYSET["kid"]}, ) @override_settings( SOCIALACCOUNT_STORE_TOKENS=False, SOCIALACCOUNT_PROVIDERS={ "apple": { "APP": { "client_id": "app123id", "key": "apple", "secret": "dummy", "certificate_key": """-----BEGIN PRIVATE KEY----- MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg2+Eybl8ojH4wB30C 3/iDkpsrxuPfs3DZ+3nHNghBOpmhRANCAAQSpo1eQ+EpNgQQyQVs/F27dkq3gvAI 28m95JEk26v64YAea5NTH56mru30RDqTKPgRVi5qRu3XGyqy3mdb8gMy -----END PRIVATE KEY----- """, } } }, ) class AppleTests(OAuth2TestsMixin, TestCase): provider_id = AppleProvider.id def get_apple_id_token_payload(self): now = datetime.utcnow() return { "iss": "https://appleid.apple.com", "aud": "app123id", # Matches `setup_app` "exp": now + timedelta(hours=1), "iat": now, "sub": "000313.c9720f41e9434e18987a.1218", "at_hash": "CkaUPjk4MJinaAq6Z0tGUA", "email": "test@privaterelay.appleid.com", "email_verified": "true", "is_private_email": "true", "auth_time": 1234345345, # not converted automatically by pyjwt } def get_login_response_json(self, with_refresh_token=True): """ `with_refresh_token` is not optional for apple, so it's ignored. """ id_token = sign_id_token(self.get_apple_id_token_payload()) return json.dumps( { "access_token": "testac", # Matches OAuth2TestsMixin value "expires_in": 3600, "id_token": id_token, "refresh_token": "testrt", # Matches OAuth2TestsMixin value "token_type": "Bearer", } ) def get_mocked_response(self): """ Apple is unusual in that the `id_token` contains all the user info so no profile info request is made. However, it does need the public key verification, so this mocked response is the public key request in order to verify the authenticity of the id_token. """ return MockedResponse( 200, KEY_SERVER_RESP_JSON, {"content-type": "application/json"} ) def get_complete_parameters(self, auth_request_params): """ Add apple specific response parameters which they include in the form_post response. https://developer.apple.com/documentation/sign_in_with_apple/sign_in_with_apple_js/incorporating_sign_in_with_apple_into_other_platforms """ params = super().get_complete_parameters(auth_request_params) params.update( { "id_token": sign_id_token(self.get_apple_id_token_payload()), "user": json.dumps( { "email": "private@appleid.apple.com", "name": { "firstName": "A", "lastName": "B", }, } ), } ) return params def login(self, resp_mock, process="login", with_refresh_token=True): resp = self.client.post( reverse(self.provider.id + "_login") + "?" + urlencode(dict(process=process)) ) p = urlparse(resp["location"]) q = parse_qs(p.query) complete_url = reverse(self.provider.id + "_callback") self.assertGreater(q["redirect_uri"][0].find(complete_url), 0) response_json = self.get_login_response_json( with_refresh_token=with_refresh_token ) with mocked_response( MockedResponse(200, response_json, {"content-type": "application/json"}), resp_mock, ): resp = self.client.post( complete_url, data=self.get_complete_parameters(q), ) assert reverse("apple_finish_callback") in resp.url # Follow the redirect resp = self.client.get(resp.url) return resp def test_authentication_error(self): """Override base test because apple posts errors""" resp = self.client.post( reverse(self.provider.id + "_callback"), data={"error": "misc", "state": "testingstate123"}, ) assert reverse("apple_finish_callback") in resp.url # Follow the redirect resp = self.client.get(resp.url) self.assertTemplateUsed( resp, "socialaccount/authentication_error.%s" % getattr(settings, "ACCOUNT_TEMPLATE_EXTENSION", "html"), ) def test_apple_finish(self): resp = self.login(self.get_mocked_response()) # Check request generating the response finish_url = reverse("apple_finish_callback") self.assertEqual(resp.request["PATH_INFO"], finish_url) self.assertTrue("state" in resp.request["QUERY_STRING"]) self.assertTrue("code" in resp.request["QUERY_STRING"]) # Check have cookie containing apple session self.assertTrue(APPLE_SESSION_COOKIE_NAME in self.client.cookies) # Session should have been cleared apple_session_cookie = self.client.cookies.get(APPLE_SESSION_COOKIE_NAME) engine = import_module(settings.SESSION_ENGINE) SessionStore = engine.SessionStore apple_login_session = SessionStore(apple_session_cookie.value) self.assertEqual(len(apple_login_session.keys()), 0) # Check cookie path was correctly set self.assertEqual(apple_session_cookie.get("path"), finish_url) django-allauth-0.47.0/allauth/socialaccount/providers/apple/urls.py000066400000000000000000000006161415442050100254310ustar00rootroot00000000000000from django.urls import path from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import AppleProvider from .views import oauth2_finish_login urlpatterns = default_urlpatterns(AppleProvider) urlpatterns += [ path( AppleProvider.get_slug() + "/login/callback/finish/", oauth2_finish_login, name="apple_finish_callback", ), ] django-allauth-0.47.0/allauth/socialaccount/providers/apple/views.py000066400000000000000000000141661415442050100256060ustar00rootroot00000000000000import json import requests from datetime import timedelta from django.http import HttpResponseNotAllowed, HttpResponseRedirect from django.urls import reverse from django.utils import timezone from django.utils.http import urlencode from django.views.decorators.csrf import csrf_exempt import jwt from allauth.socialaccount.adapter import get_adapter from allauth.socialaccount.models import SocialToken from allauth.socialaccount.providers.oauth2.client import OAuth2Error from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from allauth.utils import build_absolute_uri, get_request_param from .apple_session import add_apple_session, persist_apple_session from .client import AppleOAuth2Client from .provider import AppleProvider class AppleOAuth2Adapter(OAuth2Adapter): client_class = AppleOAuth2Client provider_id = AppleProvider.id access_token_url = "https://appleid.apple.com/auth/token" authorize_url = "https://appleid.apple.com/auth/authorize" public_key_url = "https://appleid.apple.com/auth/keys" def _get_apple_public_key(self, kid): response = requests.get(self.public_key_url) response.raise_for_status() try: data = response.json() except json.JSONDecodeError as e: raise OAuth2Error("Error retrieving apple public key.") from e for d in data["keys"]: if d["kid"] == kid: return d def get_public_key(self, id_token): """ Get the public key which matches the `kid` in the id_token header. """ kid = jwt.get_unverified_header(id_token)["kid"] apple_public_key = self._get_apple_public_key(kid=kid) public_key = jwt.algorithms.RSAAlgorithm.from_jwk(json.dumps(apple_public_key)) return public_key def get_client_id(self, provider): app = get_adapter().get_app(request=None, provider=self.provider_id) return [aud.strip() for aud in app.client_id.split(",")] def get_verified_identity_data(self, id_token): provider = self.get_provider() allowed_auds = self.get_client_id(provider) try: public_key = self.get_public_key(id_token) identity_data = jwt.decode( id_token, public_key, algorithms=["RS256"], audience=allowed_auds, issuer="https://appleid.apple.com", ) return identity_data except jwt.PyJWTError as e: raise OAuth2Error("Invalid id_token") from e def parse_token(self, data): token = SocialToken( token=data["access_token"], ) token.token_secret = data.get("refresh_token", "") expires_in = data.get(self.expires_in_key) if expires_in: token.expires_at = timezone.now() + timedelta(seconds=int(expires_in)) # `user_data` is a big flat dictionary with the parsed JWT claims # access_tokens, and user info from the apple post. identity_data = self.get_verified_identity_data(data["id_token"]) token.user_data = {**data, **identity_data} return token def complete_login(self, request, app, token, **kwargs): extra_data = token.user_data login = self.get_provider().sociallogin_from_response( request=request, response=extra_data ) login.state["id_token"] = token.user_data # We can safely remove the apple login session now # Note: The cookie will remain, but it's set to delete on browser close add_apple_session(request) request.apple_login_session.delete() return login def get_user_scope_data(self, request): user_scope_data = request.apple_login_session.get("user", "") try: return json.loads(user_scope_data) except json.JSONDecodeError: # We do not care much about user scope data as it maybe blank # so return blank dictionary instead return {} def get_access_token_data(self, request, app, client): """We need to gather the info from the apple specific login""" add_apple_session(request) # Exchange `code` code = get_request_param(request, "code") access_token_data = client.get_access_token(code) return { **access_token_data, **self.get_user_scope_data(request), "id_token": request.apple_login_session.get("id_token"), } @csrf_exempt def apple_post_callback(request, finish_endpoint_name="apple_finish_callback"): """ Apple uses a `form_post` response type, which due to CORS/Samesite-cookie rules means this request cannot access the request since the session cookie is unavailable. We work around this by storing the apple response in a separate, temporary session and redirecting to a more normal oauth flow. args: finish_endpoint_name (str): The name of a defined URL, which can be overridden in your url configuration if you have more than one callback endpoint. """ if request.method != "POST": raise HttpResponseNotAllowed(["POST"]) add_apple_session(request) # Add regular OAuth2 params to the URL - reduces the overrides required keys_to_put_in_url = ["code", "state", "error"] url_params = {} for key in keys_to_put_in_url: value = get_request_param(request, key, "") if value: url_params[key] = value # Add other params to the apple_login_session keys_to_save_to_session = ["user", "id_token"] for key in keys_to_save_to_session: request.apple_login_session[key] = get_request_param(request, key, "") url = build_absolute_uri(request, reverse(finish_endpoint_name)) response = HttpResponseRedirect( "{url}?{query}".format(url=url, query=urlencode(url_params)) ) persist_apple_session(request, response) return response oauth2_login = OAuth2LoginView.adapter_view(AppleOAuth2Adapter) oauth2_callback = apple_post_callback oauth2_finish_login = OAuth2CallbackView.adapter_view(AppleOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/asana/000077500000000000000000000000001415442050100240515ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/asana/__init__.py000066400000000000000000000000001415442050100261500ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/asana/models.py000066400000000000000000000000001415442050100256740ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/asana/provider.py000066400000000000000000000007761415442050100262670ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class AsanaAccount(ProviderAccount): pass class AsanaProvider(OAuth2Provider): id = "asana" name = "Asana" account_class = AsanaAccount def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): return dict(email=data.get("email"), name=data.get("name")) provider_classes = [AsanaProvider] django-allauth-0.47.0/allauth/socialaccount/providers/asana/tests.py000066400000000000000000000010731415442050100255660ustar00rootroot00000000000000from allauth.socialaccount.providers import registry from allauth.socialaccount.tests import create_oauth2_tests from allauth.tests import MockedResponse from .provider import AsanaProvider class AsanaTests(create_oauth2_tests(registry.by_id(AsanaProvider.id))): def get_mocked_response(self): return MockedResponse( 200, """ {"data": {"photo": null, "workspaces": [{"id": 31337, "name": "example.com"}, {"id": 3133777, "name": "Personal Projects"}], "email": "test@example.com", "name": "Test Name", "id": 43748387}}""", ) django-allauth-0.47.0/allauth/socialaccount/providers/asana/urls.py000066400000000000000000000002441415442050100254100ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import AsanaProvider urlpatterns = default_urlpatterns(AsanaProvider) django-allauth-0.47.0/allauth/socialaccount/providers/asana/views.py000066400000000000000000000015141415442050100255610ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import AsanaProvider class AsanaOAuth2Adapter(OAuth2Adapter): provider_id = AsanaProvider.id access_token_url = "https://app.asana.com/-/oauth_token" authorize_url = "https://app.asana.com/-/oauth_authorize" profile_url = "https://app.asana.com/api/1.0/users/me" def complete_login(self, request, app, token, **kwargs): resp = requests.get(self.profile_url, params={"access_token": token.token}) extra_data = resp.json()["data"] return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(AsanaOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(AsanaOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/auth0/000077500000000000000000000000001415442050100240075ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/auth0/__init__.py000066400000000000000000000000001415442050100261060ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/auth0/provider.py000066400000000000000000000017231415442050100262160ustar00rootroot00000000000000# -*- coding: utf-8 -*- from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class Auth0Account(ProviderAccount): def get_avatar_url(self): return self.account.extra_data.get("picture") def to_str(self): dflt = super(Auth0Account, self).to_str() return self.account.extra_data.get("name", dflt) class Auth0Provider(OAuth2Provider): id = "auth0" name = "Auth0" account_class = Auth0Account def get_default_scope(self): return ["openid", "profile", "email"] def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): return dict( email=data.get("email"), username=data.get("username"), name=data.get("name"), user_id=data.get("user_id"), picture=data.get("picture"), ) provider_classes = [Auth0Provider] django-allauth-0.47.0/allauth/socialaccount/providers/auth0/tests.py000066400000000000000000000012631415442050100255250ustar00rootroot00000000000000# -*- coding: utf-8 -*- from allauth.socialaccount.providers.auth0.provider import Auth0Provider from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase class Auth0Tests(OAuth2TestsMixin, TestCase): provider_id = Auth0Provider.id def get_mocked_response(self): return MockedResponse( 200, """ { "picture": "https://secure.gravatar.com/avatar/123", "email": "mr.bob@your.Auth0.server.example.com", "id": 2, "sub": 2, "identities": [], "name": "Mr Bob" } """, ) django-allauth-0.47.0/allauth/socialaccount/providers/auth0/urls.py000066400000000000000000000003401415442050100253430ustar00rootroot00000000000000# -*- coding: utf-8 -*- from allauth.socialaccount.providers.auth0.provider import Auth0Provider from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns urlpatterns = default_urlpatterns(Auth0Provider) django-allauth-0.47.0/allauth/socialaccount/providers/auth0/views.py000066400000000000000000000024031415442050100255150ustar00rootroot00000000000000# -*- coding: utf-8 -*- import requests from allauth.socialaccount import app_settings from allauth.socialaccount.providers.auth0.provider import Auth0Provider from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) class Auth0OAuth2Adapter(OAuth2Adapter): provider_id = Auth0Provider.id supports_state = True settings = app_settings.PROVIDERS.get(provider_id, {}) provider_base_url = settings.get("AUTH0_URL") access_token_url = "{0}/oauth/token".format(provider_base_url) authorize_url = "{0}/authorize".format(provider_base_url) profile_url = "{0}/userinfo".format(provider_base_url) def complete_login(self, request, app, token, response): extra_data = requests.get( self.profile_url, params={"access_token": token.token} ).json() extra_data = { "user_id": extra_data["sub"], "id": extra_data["sub"], "name": extra_data["name"], "email": extra_data["email"], } return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(Auth0OAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(Auth0OAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/authentiq/000077500000000000000000000000001415442050100247705ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/authentiq/__init__.py000066400000000000000000000000001415442050100270670ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/authentiq/provider.py000066400000000000000000000057701415442050100272050ustar00rootroot00000000000000from allauth.account.models import EmailAddress from allauth.socialaccount import app_settings from allauth.socialaccount.providers.base import AuthAction, ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class Scope(object): NAME = "aq:name" EMAIL = "email" PHONE = "phone" ADDRESS = "address" LOCATION = "aq:location" PUSH = "aq:push" IDENTITY_CLAIMS = frozenset( [ "sub", "name", "given_name", "family_name", "middle_name", "nickname", "preferred_username", "profile", "picture", "website", "email", "email_verified", "gender", "birthdate", "zoneinfo", "locale", "phone_number", "phone_number_verified", "address", "updated_at", "aq:location", ] ) class AuthentiqAccount(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("profile") def get_avatar_url(self): return self.account.extra_data.get("picture") def to_str(self): dflt = super(AuthentiqAccount, self).to_str() return self.account.extra_data.get("name", dflt) class AuthentiqProvider(OAuth2Provider): id = "authentiq" name = "Authentiq" account_class = AuthentiqAccount def get_scope(self, request): scope = set(super(AuthentiqProvider, self).get_scope(request)) scope.add("openid") if Scope.EMAIL in scope: modifiers = "" if app_settings.EMAIL_REQUIRED: modifiers += "r" if app_settings.EMAIL_VERIFICATION: modifiers += "s" if modifiers: scope.add(Scope.EMAIL + "~" + modifiers) scope.remove(Scope.EMAIL) return list(scope) def get_default_scope(self): scope = [Scope.NAME, Scope.PUSH] if app_settings.QUERY_EMAIL: scope.append(Scope.EMAIL) return scope def get_auth_params(self, request, action): ret = super(AuthentiqProvider, self).get_auth_params(request, action) if action == AuthAction.REAUTHENTICATE: ret["prompt"] = "select_account" return ret def extract_uid(self, data): return str(data["sub"]) def extract_common_fields(self, data): return dict( username=data.get("preferred_username", data.get("given_name")), email=data.get("email"), name=data.get("name"), first_name=data.get("given_name"), last_name=data.get("family_name"), ) def extract_extra_data(self, data): return {k: v for k, v in data.items() if k in IDENTITY_CLAIMS} def extract_email_addresses(self, data): ret = [] email = data.get("email") if email and data.get("email_verified"): ret.append(EmailAddress(email=email, verified=True, primary=True)) return ret provider_classes = [AuthentiqProvider] django-allauth-0.47.0/allauth/socialaccount/providers/authentiq/tests.py000066400000000000000000000066201415442050100265100ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import absolute_import, unicode_literals import json from django.test.client import RequestFactory from django.test.utils import override_settings from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import AuthentiqProvider from .views import AuthentiqOAuth2Adapter class AuthentiqTests(OAuth2TestsMixin, TestCase): provider_id = AuthentiqProvider.id def get_mocked_response(self): return MockedResponse( 200, json.dumps( { "sub": "ZLARGMFT1M", "email": "jane@email.invalid", "email_verified": True, "given_name": "Jane", "family_name": "Doe", } ), ) def test_default_scopes_no_email(self): scopes = self.provider.get_default_scope() self.assertIn("aq:name", scopes) self.assertNotIn("email", scopes) @override_settings( SOCIALACCOUNT_QUERY_EMAIL=True, ) def test_default_scopes_email(self): scopes = self.provider.get_default_scope() self.assertIn("aq:name", scopes) self.assertIn("email", scopes) def test_scopes(self): request = RequestFactory().get(AuthentiqOAuth2Adapter.authorize_url) scopes = self.provider.get_scope(request) self.assertIn("openid", scopes) self.assertIn("aq:name", scopes) def test_dynamic_scopes(self): request = RequestFactory().get( AuthentiqOAuth2Adapter.authorize_url, dict(scope="foo") ) scopes = self.provider.get_scope(request) self.assertIn("openid", scopes) self.assertIn("aq:name", scopes) self.assertIn("foo", scopes) @override_settings( SOCIALACCOUNT_QUERY_EMAIL=True, SOCIALACCOUNT_EMAIL_REQUIRED=True, SOCIALACCOUNT_EMAIL_VERIFICATION=True, ) def test_scopes_required_verified_email(self): request = RequestFactory().get(AuthentiqOAuth2Adapter.authorize_url) scopes = self.provider.get_scope(request) self.assertIn("email~rs", scopes) self.assertNotIn("email", scopes) @override_settings( SOCIALACCOUNT_QUERY_EMAIL=True, SOCIALACCOUNT_EMAIL_REQUIRED=False, SOCIALACCOUNT_EMAIL_VERIFICATION=True, ) def test_scopes_optional_verified_email(self): request = RequestFactory().get(AuthentiqOAuth2Adapter.authorize_url) scopes = self.provider.get_scope(request) self.assertIn("email~s", scopes) self.assertNotIn("email", scopes) @override_settings( SOCIALACCOUNT_QUERY_EMAIL=True, SOCIALACCOUNT_EMAIL_REQUIRED=True, SOCIALACCOUNT_EMAIL_VERIFICATION=False, ) def test_scopes_required_email(self): request = RequestFactory().get(AuthentiqOAuth2Adapter.authorize_url) scopes = self.provider.get_scope(request) self.assertIn("email~r", scopes) self.assertNotIn("email", scopes) @override_settings( SOCIALACCOUNT_QUERY_EMAIL=True, SOCIALACCOUNT_EMAIL_REQUIRED=False, SOCIALACCOUNT_EMAIL_VERIFICATION=False, ) def test_scopes_optional_email(self): request = RequestFactory().get(AuthentiqOAuth2Adapter.authorize_url) scopes = self.provider.get_scope(request) self.assertIn("email", scopes) django-allauth-0.47.0/allauth/socialaccount/providers/authentiq/urls.py000066400000000000000000000002541415442050100263300ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import AuthentiqProvider urlpatterns = default_urlpatterns(AuthentiqProvider) django-allauth-0.47.0/allauth/socialaccount/providers/authentiq/views.py000066400000000000000000000022751415442050100265050ustar00rootroot00000000000000import requests from urllib.parse import urljoin from allauth.socialaccount import app_settings from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import AuthentiqProvider class AuthentiqOAuth2Adapter(OAuth2Adapter): provider_id = AuthentiqProvider.id settings = app_settings.PROVIDERS.get(provider_id, {}) provider_url = settings.get("PROVIDER_URL", "https://connect.authentiq.io/") if not provider_url.endswith("/"): provider_url += "/" access_token_url = urljoin(provider_url, "token") authorize_url = urljoin(provider_url, "authorize") profile_url = urljoin(provider_url, "userinfo") def complete_login(self, request, app, token, **kwargs): auth = {"Authorization": "Bearer " + token.token} resp = requests.get(self.profile_url, headers=auth) resp.raise_for_status() extra_data = resp.json() login = self.get_provider().sociallogin_from_response(request, extra_data) return login oauth2_login = OAuth2LoginView.adapter_view(AuthentiqOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(AuthentiqOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/azure/000077500000000000000000000000001415442050100241145ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/azure/__init__.py000066400000000000000000000000001415442050100262130ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/azure/models.py000066400000000000000000000000331415442050100257450ustar00rootroot00000000000000# Create your models here. django-allauth-0.47.0/allauth/socialaccount/providers/azure/provider.py000066400000000000000000000027721415442050100263300ustar00rootroot00000000000000from __future__ import unicode_literals from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class AzureAccount(ProviderAccount): # TODO: # - avatar_url: # https://developer.microsoft.com/en-us/graph/docs/api-reference/beta/api/profilephoto_get # noqa def get_username(self): return self.account.extra_data["email"] def to_str(self): name = "{0} {1}".format( self.account.extra_data.get("first_name", ""), self.account.extra_data.get("last_name", ""), ) if name.strip() != "": return name return super(AzureAccount, self).to_str() class AzureProvider(OAuth2Provider): id = str("azure") name = "Azure" account_class = AzureAccount def get_default_scope(self): """ Doc on scopes available at https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-v2-scopes # noqa """ return ["User.Read", "openid"] def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): email = data.get("mail") if not email and "userPrincipalName" in data: email = data.get("userPrincipalName") return dict( email=email, username=email, last_name=data.get("surname"), first_name=data.get("givenName"), ) provider_classes = [AzureProvider] django-allauth-0.47.0/allauth/socialaccount/providers/azure/tests.py000066400000000000000000000014371415442050100256350ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import AzureProvider class AzureTests(OAuth2TestsMixin, TestCase): provider_id = AzureProvider.id def get_mocked_response(self): return MockedResponse( 200, """ {"displayName": "John Smith", "mobilePhone": null, "preferredLanguage": "en-US", "jobTitle": "Director", "userPrincipalName": "john@smith.com", "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users/$entity", "officeLocation": "Paris", "businessPhones": [], "mail": "john@smith.com", "surname": "Smith", "givenName": "John", "id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"} """, ) django-allauth-0.47.0/allauth/socialaccount/providers/azure/urls.py000066400000000000000000000002441415442050100254530ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import AzureProvider urlpatterns = default_urlpatterns(AzureProvider) django-allauth-0.47.0/allauth/socialaccount/providers/azure/views.py000066400000000000000000000041741415442050100256310ustar00rootroot00000000000000from __future__ import unicode_literals import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import AzureProvider LOGIN_URL = "https://login.microsoftonline.com/common/oauth2/v2.0" GRAPH_URL = "https://graph.microsoft.com/v1.0" class AzureOAuth2Adapter(OAuth2Adapter): """ Docs available at: https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-v2-protocols """ provider_id = AzureProvider.id access_token_url = LOGIN_URL + "/token" authorize_url = LOGIN_URL + "/authorize" profile_url = "https://graph.microsoft.com/v1.0/me" # Can be used later to obtain group data. Needs 'Group.Read.All' or # similar. # # See https://developer.microsoft.com/en-us/graph/docs/api-reference/beta/api/user_list_memberof # noqa groups_url = GRAPH_URL + "/me/memberOf?$select=displayName" def complete_login(self, request, app, token, **kwargs): headers = {"Authorization": "Bearer {0}".format(token.token)} extra_data = {} resp = requests.get(self.profile_url, headers=headers) # See: # # https://developer.microsoft.com/en-us/graph/docs/api-reference/v1.0/api/user_get # noqa # # example of what's returned (in python format) # # {u'displayName': u'John Smith', u'mobilePhone': None, # u'preferredLanguage': u'en-US', u'jobTitle': u'Director', # u'userPrincipalName': u'john@smith.com', # u'@odata.context': # u'https://graph.microsoft.com/v1.0/$metadata#users/$entity', # u'officeLocation': u'Paris', u'businessPhones': [], # u'mail': u'john@smith.com', u'surname': u'Smith', # u'givenName': u'John', u'id': u'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee'} profile_data = resp.json() extra_data.update(profile_data) return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(AzureOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(AzureOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/baidu/000077500000000000000000000000001415442050100240525ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/baidu/__init__.py000066400000000000000000000000001415442050100261510ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/baidu/provider.py000066400000000000000000000016201415442050100262550ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class BaiduAccount(ProviderAccount): def get_profile_url(self): return "http://www.baidu.com/p/" + self.account.extra_data.get("uname") def get_avatar_url(self): return ( "http://tb.himg.baidu.com/sys/portraitn/item/" + self.account.extra_data.get("portrait") ) def to_str(self): dflt = super(BaiduAccount, self).to_str() return self.account.extra_data.get("uname", dflt) class BaiduProvider(OAuth2Provider): id = "baidu" name = "Baidu" account_class = BaiduAccount def extract_uid(self, data): return data["uid"] def extract_common_fields(self, data): return dict(username=data.get("uid"), name=data.get("uname")) provider_classes = [BaiduProvider] django-allauth-0.47.0/allauth/socialaccount/providers/baidu/tests.py000066400000000000000000000006651415442050100255750ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import BaiduProvider class BaiduTests(OAuth2TestsMixin, TestCase): provider_id = BaiduProvider.id def get_mocked_response(self): return MockedResponse( 200, """ {"portrait": "78c0e9839de59bbde7859ccf43", "uname": "\u90dd\u56fd\u715c", "uid": "3225892368"}""", ) django-allauth-0.47.0/allauth/socialaccount/providers/baidu/urls.py000066400000000000000000000002441415442050100254110ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import BaiduProvider urlpatterns = default_urlpatterns(BaiduProvider) django-allauth-0.47.0/allauth/socialaccount/providers/baidu/views.py000066400000000000000000000016031415442050100255610ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import BaiduProvider class BaiduOAuth2Adapter(OAuth2Adapter): provider_id = BaiduProvider.id access_token_url = "https://openapi.baidu.com/oauth/2.0/token" authorize_url = "https://openapi.baidu.com/oauth/2.0/authorize" profile_url = ( "https://openapi.baidu.com/rest/2.0/passport/users/getLoggedInUser" # noqa ) def complete_login(self, request, app, token, **kwargs): resp = requests.get(self.profile_url, params={"access_token": token.token}) extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(BaiduOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(BaiduOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/base/000077500000000000000000000000001415442050100237005ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/base/__init__.py000066400000000000000000000002151415442050100260070ustar00rootroot00000000000000from .constants import AuthAction, AuthError, AuthProcess # noqa from .provider import Provider, ProviderAccount, ProviderException # noqa django-allauth-0.47.0/allauth/socialaccount/providers/base/constants.py000066400000000000000000000005721415442050100262720ustar00rootroot00000000000000class AuthProcess(object): LOGIN = "login" CONNECT = "connect" REDIRECT = "redirect" class AuthAction(object): AUTHENTICATE = "authenticate" REAUTHENTICATE = "reauthenticate" REREQUEST = "rerequest" class AuthError(object): UNKNOWN = "unknown" CANCELLED = "cancelled" # Cancelled on request of user DENIED = "denied" # Denied by server django-allauth-0.47.0/allauth/socialaccount/providers/base/mixins.py000066400000000000000000000012241415442050100255600ustar00rootroot00000000000000from django.shortcuts import render from allauth.socialaccount import app_settings class OAuthLoginMixin: def dispatch(self, request, *args, **kwargs): provider = self.adapter.get_provider() if (not app_settings.LOGIN_ON_GET) and request.method == "GET": return render( request, "socialaccount/login.html", { "provider": provider, "process": request.GET.get("process"), }, ) return self.login(request, *args, **kwargs) def login(self, request, *args, **kwargs): raise NotImplementedError django-allauth-0.47.0/allauth/socialaccount/providers/base/provider.py000066400000000000000000000130241415442050100261040ustar00rootroot00000000000000from allauth.account.models import EmailAddress from allauth.socialaccount import app_settings from allauth.socialaccount.adapter import get_adapter class ProviderException(Exception): pass class Provider(object): slug = None def __init__(self, request): self.request = request @classmethod def get_slug(cls): return cls.slug or cls.id def get_login_url(self, request, next=None, **kwargs): """ Builds the URL to redirect to when initiating a login for this provider. """ raise NotImplementedError("get_login_url() for " + self.name) def get_app(self, request): adapter = get_adapter(request) return adapter.get_app(request, self.id) def media_js(self, request): """ Some providers may require extra scripts (e.g. a Facebook connect) """ return "" def wrap_account(self, social_account): return self.account_class(social_account) def get_settings(self): return app_settings.PROVIDERS.get(self.id, {}) def sociallogin_from_response(self, request, response): """ Instantiates and populates a `SocialLogin` model based on the data retrieved in `response`. The method does NOT save the model to the DB. Data for `SocialLogin` will be extracted from `response` with the help of the `.extract_uid()`, `.extract_extra_data()`, `.extract_common_fields()`, and `.extract_email_addresses()` methods. :param request: a Django `HttpRequest` object. :param response: object retrieved via the callback response of the social auth provider. :return: A populated instance of the `SocialLogin` model (unsaved). """ # NOTE: Avoid loading models at top due to registry boot... from allauth.socialaccount.models import SocialAccount, SocialLogin adapter = get_adapter(request) uid = self.extract_uid(response) extra_data = self.extract_extra_data(response) common_fields = self.extract_common_fields(response) socialaccount = SocialAccount(extra_data=extra_data, uid=uid, provider=self.id) email_addresses = self.extract_email_addresses(response) self.cleanup_email_addresses(common_fields.get("email"), email_addresses) sociallogin = SocialLogin( account=socialaccount, email_addresses=email_addresses ) user = sociallogin.user = adapter.new_user(request, sociallogin) user.set_unusable_password() adapter.populate_user(request, sociallogin, common_fields) return sociallogin def extract_uid(self, data): """ Extracts the unique user ID from `data` """ raise NotImplementedError( "The provider must implement the `extract_uid()` method" ) def extract_extra_data(self, data): """ Extracts fields from `data` that will be stored in `SocialAccount`'s `extra_data` JSONField. :return: any JSON-serializable Python structure. """ return data def extract_common_fields(self, data): """ Extracts fields from `data` that will be used to populate the `User` model in the `SOCIALACCOUNT_ADAPTER`'s `populate_user()` method. For example: {'first_name': 'John'} :return: dictionary of key-value pairs. """ return {} def cleanup_email_addresses(self, email, addresses): # Move user.email over to EmailAddress if email and email.lower() not in [a.email.lower() for a in addresses]: addresses.append(EmailAddress(email=email, verified=False, primary=True)) # Force verified emails settings = self.get_settings() verified_email = settings.get("VERIFIED_EMAIL", False) if verified_email: for address in addresses: address.verified = True def extract_email_addresses(self, data): """ For example: [EmailAddress(email='john@example.com', verified=True, primary=True)] """ return [] @classmethod def get_package(cls): pkg = getattr(cls, "package", None) if not pkg: pkg = cls.__module__.rpartition(".")[0] return pkg class ProviderAccount(object): def __init__(self, social_account): self.account = social_account def get_profile_url(self): return None def get_avatar_url(self): return None def get_brand(self): """ Returns a dict containing an id and name identifying the brand. Useful when displaying logos next to accounts in templates. For most providers, these are identical to the provider. For OpenID however, the brand can derived from the OpenID identity url. """ provider = self.account.get_provider() return dict(id=provider.id, name=provider.name) def __str__(self): return self.to_str() def to_str(self): """ This did not use to work in the past due to py2 compatibility: class GoogleAccount(ProviderAccount): def __str__(self): dflt = super(GoogleAccount, self).__str__() return self.account.extra_data.get('name', dflt) So we have this method `to_str` that can be overriden in a conventional fashion, without having to worry about it. """ return self.get_brand()["name"] django-allauth-0.47.0/allauth/socialaccount/providers/basecamp/000077500000000000000000000000001415442050100245415ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/basecamp/__init__.py000066400000000000000000000000001415442050100266400ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/basecamp/provider.py000066400000000000000000000022251415442050100267460ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class BasecampAccount(ProviderAccount): def get_avatar_url(self): return None def to_str(self): dflt = super(BasecampAccount, self).to_str() return self.account.extra_data.get("name", dflt) class BasecampProvider(OAuth2Provider): id = "basecamp" name = "Basecamp" account_class = BasecampAccount def get_auth_params(self, request, action): data = super(BasecampProvider, self).get_auth_params(request, action) data["type"] = "web_server" return data def extract_uid(self, data): data = data["identity"] return str(data["id"]) def extract_common_fields(self, data): data = data["identity"] return dict( email=data.get("email_address"), username=data.get("email_address"), first_name=data.get("first_name"), last_name=data.get("last_name"), name="%s %s" % (data.get("first_name"), data.get("last_name")), ) provider_classes = [BasecampProvider] django-allauth-0.47.0/allauth/socialaccount/providers/basecamp/tests.py000066400000000000000000000025231415442050100262570ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import BasecampProvider class BasecampTests(OAuth2TestsMixin, TestCase): provider_id = BasecampProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "expires_at": "2012-03-22T16:56:48-05:00", "identity": { "id": 9999999, "first_name": "Jason Fried", "last_name": "Jason Fried", "email_address": "jason@example.com" }, "accounts": [ { "product": "bcx", "id": 88888888, "name": "Wayne Enterprises, Ltd.", "href": "https://basecamp.com/88888888/api/v1" }, { "product": "bcx", "id": 77777777, "name": "Veidt, Inc", "href": "https://basecamp.com/77777777/api/v1" }, { "product": "campfire", "id": 44444444, "name": "Acme Shipping Co.", "href": "https://acme4444444.campfirenow.com" } ] }""", ) django-allauth-0.47.0/allauth/socialaccount/providers/basecamp/urls.py000066400000000000000000000002521415442050100260770ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import BasecampProvider urlpatterns = default_urlpatterns(BasecampProvider) django-allauth-0.47.0/allauth/socialaccount/providers/basecamp/views.py000066400000000000000000000017221415442050100262520ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import BasecampProvider class BasecampOAuth2Adapter(OAuth2Adapter): provider_id = BasecampProvider.id access_token_url = ( "https://launchpad.37signals.com/authorization/token?type=web_server" # noqa ) authorize_url = "https://launchpad.37signals.com/authorization/new" profile_url = "https://launchpad.37signals.com/authorization.json" def complete_login(self, request, app, token, **kwargs): headers = {"Authorization": "Bearer {0}".format(token.token)} resp = requests.get(self.profile_url, headers=headers) extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(BasecampOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(BasecampOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/battlenet/000077500000000000000000000000001415442050100247505ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/battlenet/__init__.py000066400000000000000000000000001415442050100270470ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/battlenet/models.py000066400000000000000000000000001415442050100265730ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/battlenet/provider.py000066400000000000000000000016451415442050100271620ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class BattleNetAccount(ProviderAccount): def to_str(self): battletag = self.account.extra_data.get("battletag") return battletag or super(BattleNetAccount, self).to_str() class BattleNetProvider(OAuth2Provider): id = "battlenet" name = "Battle.net" account_class = BattleNetAccount def extract_uid(self, data): uid = str(data["id"]) if data.get("region") == "cn": # China is on a different account system. UIDs can clash with US. return uid + "-cn" return uid def extract_common_fields(self, data): return {"username": data.get("battletag")} def get_default_scope(self): # Optional scopes: "sc2.profile", "wow.profile" return [] provider_classes = [BattleNetProvider] django-allauth-0.47.0/allauth/socialaccount/providers/battlenet/tests.py000066400000000000000000000044601415442050100264700ustar00rootroot00000000000000import json from allauth.socialaccount.models import SocialAccount from allauth.socialaccount.providers.oauth2.client import OAuth2Error from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import BattleNetProvider from .views import _check_errors class BattleNetTests(OAuth2TestsMixin, TestCase): provider_id = BattleNetProvider.id _uid = 123456789 _battletag = "LuckyDragon#1953" def get_mocked_response(self): data = {"battletag": self._battletag, "id": self._uid} return MockedResponse(200, json.dumps(data)) def test_valid_response_no_battletag(self): data = {"id": 12345} response = MockedResponse(200, json.dumps(data)) self.assertEqual(_check_errors(response), data) def test_invalid_data(self): response = MockedResponse(200, json.dumps({})) with self.assertRaises(OAuth2Error): # No id, raises _check_errors(response) def test_profile_invalid_response(self): data = {"code": 403, "type": "Forbidden", "detail": "Account Inactive"} response = MockedResponse(401, json.dumps(data)) with self.assertRaises(OAuth2Error): # no id, 4xx code, raises _check_errors(response) def test_error_response(self): body = json.dumps({"error": "invalid_token"}) response = MockedResponse(400, body) with self.assertRaises(OAuth2Error): # no id, 4xx code, raises _check_errors(response) def test_service_not_found(self): response = MockedResponse(596, "

596 Service Not Found

") with self.assertRaises(OAuth2Error): # bad json, 5xx code, raises _check_errors(response) def test_invalid_response(self): response = MockedResponse(200, "invalid json data") with self.assertRaises(OAuth2Error): # bad json, raises _check_errors(response) def test_extra_data(self): self.login(self.get_mocked_response()) account = SocialAccount.objects.get(uid=str(self._uid)) self.assertEqual(account.extra_data["battletag"], self._battletag) self.assertEqual(account.extra_data["id"], self._uid) self.assertEqual(account.extra_data["region"], "us") django-allauth-0.47.0/allauth/socialaccount/providers/battlenet/urls.py000066400000000000000000000002541415442050100263100ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import BattleNetProvider urlpatterns = default_urlpatterns(BattleNetProvider) django-allauth-0.47.0/allauth/socialaccount/providers/battlenet/validators.py000066400000000000000000000001611415442050100274700ustar00rootroot00000000000000from django.core.validators import RegexValidator BattletagUsernameValidator = RegexValidator(r"^[\w.]+#\d+$") django-allauth-0.47.0/allauth/socialaccount/providers/battlenet/views.py000066400000000000000000000110111415442050100264510ustar00rootroot00000000000000""" OAuth2 Adapter for Battle.net Resources: * Battle.net OAuth2 documentation: https://dev.battle.net/docs/read/oauth * Battle.net API documentation: https://dev.battle.net/io-docs * Original announcement: https://us.battle.net/en/forum/topic/13979297799 * The Battle.net API forum: https://us.battle.net/en/forum/15051532/ """ import requests from django.conf import settings from allauth.socialaccount.providers.oauth2.client import OAuth2Error from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import BattleNetProvider class Region: APAC = "apac" CN = "cn" EU = "eu" KR = "kr" SEA = "sea" TW = "tw" US = "us" def _check_errors(response): try: data = response.json() except ValueError: # JSONDecodeError on py3 raise OAuth2Error("Invalid JSON from Battle.net API: %r" % (response.text)) if response.status_code >= 400 or "error" in data: # For errors, we expect the following format: # {"error": "error_name", "error_description": "Oops!"} # For example, if the token is not valid, we will get: # { # "error": "invalid_token", # "error_description": "Invalid access token: abcdef123456" # } # For the profile API, this may also look like the following: # {"code": 403, "type": "Forbidden", "detail": "Account Inactive"} error = data.get("error", "") or data.get("type", "") desc = data.get("error_description", "") or data.get("detail", "") raise OAuth2Error("Battle.net error: %s (%s)" % (error, desc)) # The expected output from the API follows this format: # {"id": 12345, "battletag": "Example#12345"} # The battletag is optional. if "id" not in data: # If the id is not present, the output is not usable (no UID) raise OAuth2Error("Invalid data from Battle.net API: %r" % (data)) return data class BattleNetOAuth2Adapter(OAuth2Adapter): """ OAuth2 adapter for Battle.net https://dev.battle.net/docs/read/oauth Region is set to us by default, but can be overridden with the `region` GET parameter when performing a login. Can be any of eu, us, kr, sea, tw or cn """ provider_id = BattleNetProvider.id valid_regions = ( Region.APAC, Region.CN, Region.EU, Region.KR, Region.SEA, Region.TW, Region.US, ) @property def battlenet_region(self): # Check by URI query parameter first. region = self.request.GET.get("region", "").lower() if region == Region.SEA: # South-East Asia uses the same region as US everywhere return Region.US if region in self.valid_regions: return region # Second, check the provider settings. region = ( getattr(settings, "SOCIALACCOUNT_PROVIDERS", {}) .get("battlenet", {}) .get("REGION", "us") ) if region in self.valid_regions: return region return Region.US @property def battlenet_base_url(self): region = self.battlenet_region if region == Region.CN: return "https://www.battlenet.com.cn" return "https://%s.battle.net" % (region) @property def access_token_url(self): return self.battlenet_base_url + "/oauth/token" @property def authorize_url(self): return self.battlenet_base_url + "/oauth/authorize" @property def profile_url(self): return self.battlenet_base_url + "/oauth/userinfo" def complete_login(self, request, app, token, **kwargs): params = {"access_token": token.token} response = requests.get(self.profile_url, params=params) data = _check_errors(response) # Add the region to the data so that we can have it in `extra_data`. data["region"] = self.battlenet_region return self.get_provider().sociallogin_from_response(request, data) def get_callback_url(self, request, app): r = super(BattleNetOAuth2Adapter, self).get_callback_url(request, app) region = request.GET.get("region", "").lower() # Pass the region down to the callback URL if we specified it if region and region in self.valid_regions: r += "?region=%s" % (region) return r oauth2_login = OAuth2LoginView.adapter_view(BattleNetOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(BattleNetOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/bitbucket/000077500000000000000000000000001415442050100247425ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/bitbucket/__init__.py000066400000000000000000000000001415442050100270410ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/bitbucket/provider.py000066400000000000000000000017341415442050100271530ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth.provider import OAuthProvider class BitbucketAccount(ProviderAccount): def get_profile_url(self): return "http://bitbucket.org/" + self.account.extra_data["username"] def get_avatar_url(self): return self.account.extra_data.get("avatar") def get_username(self): return self.account.extra_data["username"] def to_str(self): return self.get_username() class BitbucketProvider(OAuthProvider): id = "bitbucket" name = "Bitbucket" account_class = BitbucketAccount def extract_uid(self, data): return data["username"] def extract_common_fields(self, data): return dict( email=data.get("email"), first_name=data.get("first_name"), username=data.get("username"), last_name=data.get("last_name"), ) provider_classes = [BitbucketProvider] django-allauth-0.47.0/allauth/socialaccount/providers/bitbucket/tests.py000066400000000000000000000026601415442050100264620ustar00rootroot00000000000000# -*- coding: utf-8 -*- from allauth.socialaccount.tests import OAuthTestsMixin from allauth.tests import MockedResponse, TestCase from .provider import BitbucketProvider class BitbucketTests(OAuthTestsMixin, TestCase): provider_id = BitbucketProvider.id def get_mocked_response(self): # FIXME: Replace with actual/complete Bitbucket response return [ MockedResponse( 200, r""" [{"active": true, "email": "raymond.penners@example.com", "primary": true}, {"active": true, "email": "raymond.penners@example.org", "primary": false} ] """, ), MockedResponse( 200, r""" {"repositories": [], "user": {"avatar": "https://secure.gravatar.com/avatar.jpg", "display_name": "pennersr", "first_name": "", "is_team": false, "last_name": "", "resource_uri": "/1.0/users/pennersr", "username": "pennersr"}} """, ), ] # noqa def test_login(self): account = super(BitbucketTests, self).test_login() bb_account = account.get_provider_account() self.assertEqual(bb_account.get_username(), "pennersr") self.assertEqual( bb_account.get_avatar_url(), "https://secure.gravatar.com/avatar.jpg", ) self.assertEqual(bb_account.get_profile_url(), "http://bitbucket.org/pennersr") django-allauth-0.47.0/allauth/socialaccount/providers/bitbucket/urls.py000066400000000000000000000002531415442050100263010ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth.urls import default_urlpatterns from .provider import BitbucketProvider urlpatterns = default_urlpatterns(BitbucketProvider) django-allauth-0.47.0/allauth/socialaccount/providers/bitbucket/views.py000066400000000000000000000030231415442050100264470ustar00rootroot00000000000000import json from allauth.socialaccount.providers.oauth.client import OAuth from allauth.socialaccount.providers.oauth.views import ( OAuthAdapter, OAuthCallbackView, OAuthLoginView, ) from .provider import BitbucketProvider class BitbucketAPI(OAuth): emails_url = "https://bitbucket.org/api/1.0/emails/" users_url = "https://bitbucket.org/api/1.0/users/" def get_user_info(self): # TODO: Actually turn these into EmailAddress emails = json.loads(self.query(self.emails_url)) for address in reversed(emails): if address["active"]: email = address["email"] if address["primary"]: break data = json.loads(self.query(self.users_url + email)) user = data["user"] return user class BitbucketOAuthAdapter(OAuthAdapter): provider_id = BitbucketProvider.id request_token_url = "https://bitbucket.org/api/1.0/oauth/request_token" access_token_url = "https://bitbucket.org/api/1.0/oauth/access_token" authorize_url = "https://bitbucket.org/api/1.0/oauth/authenticate" def complete_login(self, request, app, token, response): client = BitbucketAPI( request, app.client_id, app.secret, self.request_token_url ) extra_data = client.get_user_info() return self.get_provider().sociallogin_from_response(request, extra_data) oauth_login = OAuthLoginView.adapter_view(BitbucketOAuthAdapter) oauth_callback = OAuthCallbackView.adapter_view(BitbucketOAuthAdapter) django-allauth-0.47.0/allauth/socialaccount/providers/bitbucket_oauth2/000077500000000000000000000000001415442050100262245ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/bitbucket_oauth2/__init__.py000066400000000000000000000000001415442050100303230ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/bitbucket_oauth2/provider.py000066400000000000000000000017771415442050100304440ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class BitbucketOAuth2Account(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("links", {}).get("html", {}).get("href") def get_avatar_url(self): return self.account.extra_data.get("links", {}).get("avatar", {}).get("href") def to_str(self): dflt = super(BitbucketOAuth2Account, self).to_str() return self.account.extra_data.get("display_name", dflt) class BitbucketOAuth2Provider(OAuth2Provider): id = "bitbucket_oauth2" name = "Bitbucket" account_class = BitbucketOAuth2Account def extract_uid(self, data): return data["username"] def extract_common_fields(self, data): return dict( email=data.get("email"), username=data.get("username"), name=data.get("display_name"), ) provider_classes = [BitbucketOAuth2Provider] django-allauth-0.47.0/allauth/socialaccount/providers/bitbucket_oauth2/tests.py000066400000000000000000000132471415442050100277470ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals from unittest import mock from django.test.utils import override_settings from allauth.socialaccount.models import SocialAccount from allauth.socialaccount.providers import registry from allauth.socialaccount.tests import create_oauth2_tests from allauth.tests import MockedResponse, patch from .provider import BitbucketOAuth2Provider @override_settings(SOCIALACCOUNT_QUERY_EMAIL=True) class BitbucketOAuth2Tests( create_oauth2_tests(registry.by_id(BitbucketOAuth2Provider.id)) ): response_data = """ { "created_on": "2011-12-20T16:34:07.132459+00:00", "display_name": "tutorials account", "links": { "avatar": { "href": "https://bitbucket-assetroot.s3.amazonaws.com/c/photos/2013/Nov/25/tutorials-avatar-1563784409-6_avatar.png" }, "followers": { "href": "https://api.bitbucket.org/2.0/users/tutorials/followers" }, "following": { "href": "https://api.bitbucket.org/2.0/users/tutorials/following" }, "html": { "href": "https://bitbucket.org/tutorials" }, "repositories": { "href": "https://api.bitbucket.org/2.0/repositories/tutorials" }, "self": { "href": "https://api.bitbucket.org/2.0/users/tutorials" } }, "location": "Santa Monica, CA", "type": "user", "username": "tutorials", "uuid": "{c788b2da-b7a2-404c-9e26-d3f077557007}", "website": "https://tutorials.bitbucket.org/" } """ # noqa email_response_data = """ { "page": 1, "pagelen": 10, "size": 1, "values": [ { "email": "tutorials@bitbucket.org", "is_confirmed": true, "is_primary": true, "links": { "self": { "href": "https://api.bitbucket.org/2.0/user/emails/tutorials@bitbucket.org" } }, "type": "email" }, { "email": "tutorials+secondary@bitbucket.org", "is_confirmed": true, "is_primary": true, "links": { "self": { "href": "https://api.bitbucket.org/2.0/user/emails/tutorials+secondary@bitbucket.org" } }, "type": "email" } ] } """ # noqa def setUp(self): super(BitbucketOAuth2Tests, self).setUp() self.mocks = { "requests": patch( "allauth.socialaccount.providers.bitbucket_oauth2.views.requests" ) } self.patches = {name: mocked.start() for (name, mocked) in self.mocks.items()} self.patches["requests"].get.side_effect = [ MockedResponse(200, self.response_data), MockedResponse(200, self.email_response_data), ] def tearDown(self): for (_, mocked) in self.mocks.items(): mocked.stop() def get_mocked_response(self): return [MockedResponse(200, self.response_data)] def test_account_tokens(self, multiple_login=False): if multiple_login: self.patches["requests"].get.side_effect = [ MockedResponse(200, self.response_data), MockedResponse(200, self.email_response_data), MockedResponse(200, self.response_data), MockedResponse(200, self.email_response_data), ] super(BitbucketOAuth2Tests, self).test_account_tokens(multiple_login) calls = [ mock.call("https://api.bitbucket.org/2.0/user", params=mock.ANY), mock.call("https://api.bitbucket.org/2.0/user/emails", params=mock.ANY), ] if multiple_login: calls.extend( [ mock.call("https://api.bitbucket.org/2.0/user", params=mock.ANY), mock.call( "https://api.bitbucket.org/2.0/user/emails", params=mock.ANY, ), ] ) self.patches["requests"].get.assert_has_calls(calls) def test_provider_account(self): self.login(self.get_mocked_response()) socialaccount = SocialAccount.objects.get(uid="tutorials") self.assertEqual(socialaccount.user.username, "tutorials") self.assertEqual(socialaccount.user.email, "tutorials@bitbucket.org") account = socialaccount.get_provider_account() self.assertEqual(account.to_str(), "tutorials account") self.assertEqual(account.get_profile_url(), "https://bitbucket.org/tutorials") self.assertEqual( account.get_avatar_url(), "https://bitbucket-assetroot.s3.amazonaws.com/c/photos/2013/Nov/25/tutorials-avatar-1563784409-6_avatar.png", # noqa ) self.patches["requests"].get.assert_has_calls( [ mock.call("https://api.bitbucket.org/2.0/user", params=mock.ANY), mock.call( "https://api.bitbucket.org/2.0/user/emails", params=mock.ANY, ), ] ) django-allauth-0.47.0/allauth/socialaccount/providers/bitbucket_oauth2/urls.py000066400000000000000000000002671415442050100275700ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth.urls import default_urlpatterns from .provider import BitbucketOAuth2Provider urlpatterns = default_urlpatterns(BitbucketOAuth2Provider) django-allauth-0.47.0/allauth/socialaccount/providers/bitbucket_oauth2/views.py000066400000000000000000000031641415442050100277370ustar00rootroot00000000000000import requests from allauth.socialaccount import app_settings from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import BitbucketOAuth2Provider class BitbucketOAuth2Adapter(OAuth2Adapter): provider_id = BitbucketOAuth2Provider.id access_token_url = "https://bitbucket.org/site/oauth2/access_token" authorize_url = "https://bitbucket.org/site/oauth2/authorize" profile_url = "https://api.bitbucket.org/2.0/user" emails_url = "https://api.bitbucket.org/2.0/user/emails" def complete_login(self, request, app, token, **kwargs): resp = requests.get(self.profile_url, params={"access_token": token.token}) extra_data = resp.json() if app_settings.QUERY_EMAIL and not extra_data.get("email"): extra_data["email"] = self.get_email(token) return self.get_provider().sociallogin_from_response(request, extra_data) def get_email(self, token): """Fetches email address from email API endpoint""" resp = requests.get(self.emails_url, params={"access_token": token.token}) emails = resp.json().get("values", []) email = "" try: email = emails[0].get("email") primary_emails = [e for e in emails if e.get("is_primary", False)] email = primary_emails[0].get("email") except (IndexError, TypeError, KeyError): return "" finally: return email oauth_login = OAuth2LoginView.adapter_view(BitbucketOAuth2Adapter) oauth_callback = OAuth2CallbackView.adapter_view(BitbucketOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/bitly/000077500000000000000000000000001415442050100241115ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/bitly/__init__.py000066400000000000000000000000001415442050100262100ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/bitly/provider.py000066400000000000000000000015541415442050100263220ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class BitlyAccount(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("profile_url") def get_avatar_url(self): return self.account.extra_data.get("profile_image") def to_str(self): dflt = super(BitlyAccount, self).to_str() return "%s (%s)" % ( self.account.extra_data.get("full_name", ""), dflt, ) class BitlyProvider(OAuth2Provider): id = "bitly" name = "Bitly" account_class = BitlyAccount def extract_uid(self, data): return str(data["login"]) def extract_common_fields(self, data): return dict(username=data["login"], name=data.get("full_name")) provider_classes = [BitlyProvider] django-allauth-0.47.0/allauth/socialaccount/providers/bitly/tests.py000066400000000000000000000017701415442050100256320ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import BitlyProvider class BitlyTests(OAuth2TestsMixin, TestCase): provider_id = BitlyProvider.id def get_mocked_response(self): return MockedResponse( 200, """{ "data": { "apiKey": "R_f6397a37e765574f2e198dba5bb59522", "custom_short_domain": null, "display_name": null, "full_name": "Bitly API Oauth Demo Account", "is_enterprise": false, "login": "bitlyapioauthdemo", "member_since": 1331567982, "profile_image": "http://bitly.com/u/bitlyapioauthdemo.png", "profile_url": "http://bitly.com/u/bitlyapioauthdemo", "share_accounts": [], "tracking_domains": [] }, "status_code": 200, "status_txt": "OK" }""", ) django-allauth-0.47.0/allauth/socialaccount/providers/bitly/urls.py000066400000000000000000000002441415442050100254500ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import BitlyProvider urlpatterns = default_urlpatterns(BitlyProvider) django-allauth-0.47.0/allauth/socialaccount/providers/bitly/views.py000066400000000000000000000015521415442050100256230ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import BitlyProvider class BitlyOAuth2Adapter(OAuth2Adapter): provider_id = BitlyProvider.id access_token_url = "https://api-ssl.bitly.com/oauth/access_token" authorize_url = "https://bitly.com/oauth/authorize" profile_url = "https://api-ssl.bitly.com/v3/user/info" supports_state = False def complete_login(self, request, app, token, **kwargs): resp = requests.get(self.profile_url, params={"access_token": token.token}) extra_data = resp.json()["data"] return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(BitlyOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(BitlyOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/box/000077500000000000000000000000001415442050100235565ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/box/__init__.py000066400000000000000000000000001415442050100256550ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/box/provider.py000066400000000000000000000010151415442050100257570ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class BoxOAuth2Account(ProviderAccount): pass class BoxOAuth2Provider(OAuth2Provider): id = "box" name = "Box" account_class = BoxOAuth2Account def extract_uid(self, data): return data["id"] def extract_common_fields(self, data): return dict(name=data.get("display_name"), email=data.get("email")) provider_classes = [BoxOAuth2Provider] django-allauth-0.47.0/allauth/socialaccount/providers/box/tests.py000066400000000000000000000020631415442050100252730ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import BoxOAuth2Provider class BoxOAuth2Tests(OAuth2TestsMixin, TestCase): provider_id = BoxOAuth2Provider.id def get_mocked_response(self): return [ MockedResponse( 200, """{ "type": "user", "id": "1185237519", "name": "Balls Johnson", "login": "balls@example.com", "created_at": "2017-02-18T21:16:39-08:00", "modified_at": "2017-02-18T21:19:11-08:00", "language": "en", "timezone": "America/Los_Angeles", "space_amount": 10737418240, "space_used": 0, "max_upload_size": 2147483648, "status": "active", "job_title": "", "phone": "123-345-5555", "address": "", "avatar_url": "https://app.box.com/api/avatar/large/1185237519" }""", ) ] django-allauth-0.47.0/allauth/socialaccount/providers/box/urls.py000066400000000000000000000002531415442050100251150ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth.urls import default_urlpatterns from .provider import BoxOAuth2Provider urlpatterns = default_urlpatterns(BoxOAuth2Provider) django-allauth-0.47.0/allauth/socialaccount/providers/box/views.py000066400000000000000000000017741415442050100252760ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import BoxOAuth2Provider class BoxOAuth2Adapter(OAuth2Adapter): provider_id = BoxOAuth2Provider.id access_token_url = "https://api.box.com/oauth2/token" authorize_url = "https://account.box.com/api/oauth2/authorize" profile_url = "https://api.box.com/2.0/users/me" redirect_uri_protocol = None def complete_login(self, request, app, token, **kwargs): extra_data = requests.get( self.profile_url, params={"access_token": token.token} ) # This only here because of weird response from the test suite if isinstance(extra_data, list): extra_data = extra_data[0] return self.get_provider().sociallogin_from_response(request, extra_data.json()) oauth_login = OAuth2LoginView.adapter_view(BoxOAuth2Adapter) oauth_callback = OAuth2CallbackView.adapter_view(BoxOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/cern/000077500000000000000000000000001415442050100237155ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/cern/__init__.py000066400000000000000000000000001415442050100260140ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/cern/provider.py000066400000000000000000000017201415442050100261210ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class CernAccount(ProviderAccount): def to_str(self): dflt = super(CernAccount, self).to_str() return self.account.extra_data.get("name", dflt) class CernProvider(OAuth2Provider): id = "cern" name = "Cern" account_class = CernAccount def get_auth_params(self, request, action): data = super(CernProvider, self).get_auth_params(request, action) data["scope"] = "read:user" return data def extract_uid(self, data): return str(data.get("id")) def extract_common_fields(self, data): return dict( email=data.get("email"), username=data.get("username"), first_name=data.get("first_name"), last_name=data.get("last_name"), name=data.get("name"), ) provider_classes = [CernProvider] django-allauth-0.47.0/allauth/socialaccount/providers/cern/tests.py000066400000000000000000000013501415442050100254300ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import CernProvider class CernTests(OAuth2TestsMixin, TestCase): provider_id = CernProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "name":"Max Mustermann", "username":"mmuster", "id":8173921, "personid":924225, "email":"max.mustermann@cern.ch", "first_name":"Max", "last_name":"Mustermann", "identityclass":"CERN Registered", "federation":"CERN", "phone":null, "mobile":null } """, ) django-allauth-0.47.0/allauth/socialaccount/providers/cern/urls.py000066400000000000000000000002421415442050100252520ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import CernProvider urlpatterns = default_urlpatterns(CernProvider) django-allauth-0.47.0/allauth/socialaccount/providers/cern/views.py000066400000000000000000000022051415442050100254230ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import CernProvider class CernOAuth2Adapter(OAuth2Adapter): provider_id = CernProvider.id access_token_url = "https://oauth.web.cern.ch/OAuth/Token" authorize_url = "https://oauth.web.cern.ch/OAuth/Authorize" profile_url = "https://oauthresource.web.cern.ch/api/User" groups_url = "https://oauthresource.web.cern.ch/api/Groups" supports_state = False redirect_uri_protocol = "https" def complete_login(self, request, app, token, **kwargs): headers = {"Authorization": "Bearer {0}".format(token.token)} user_response = requests.get(self.profile_url, headers=headers) groups_response = requests.get(self.groups_url, headers=headers) extra_data = user_response.json() extra_data.update(groups_response.json()) return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(CernOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(CernOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/cilogon/000077500000000000000000000000001415442050100244205ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/cilogon/__init__.py000066400000000000000000000000001415442050100265170ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/cilogon/provider.py000066400000000000000000000032341415442050100266260ustar00rootroot00000000000000from allauth.account.models import EmailAddress from allauth.socialaccount.app_settings import QUERY_EMAIL from allauth.socialaccount.providers.base import AuthAction, ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class Scope(object): OPENID = "openid" EMAIL = "email" PROFILE = "profile" USERINFO = "org.cilogon.userinfo" class CILogonAccount(ProviderAccount): def to_str(self): dflt = super(CILogonAccount, self).to_str() return self.account.extra_data.get("name", dflt) class CILogonProvider(OAuth2Provider): id = "cilogon" name = "CILogon" account_class = CILogonAccount def get_default_scope(self): scope = [Scope.PROFILE, Scope.USERINFO, Scope.OPENID] if QUERY_EMAIL: scope.append(Scope.EMAIL) return scope def get_auth_params(self, request, action): ret = super(CILogonProvider, self).get_auth_params(request, action) if action == AuthAction.REAUTHENTICATE: ret["prompt"] = "select_account consent" return ret def extract_uid(self, data): return str(data.get("sub")) def extract_common_fields(self, data): return dict( email=data.get("email"), last_name=data.get("family_name"), first_name=data.get("given_name"), eppn=data.get("eppn"), ) def extract_email_addresses(self, data): ret = [] email = data.get("email") if email and data.get("verified_email"): ret.append(EmailAddress(email=email, verified=True, primary=True)) return ret provider_classes = [CILogonProvider] django-allauth-0.47.0/allauth/socialaccount/providers/cilogon/tests.py000066400000000000000000000013061415442050100261340ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import absolute_import, unicode_literals from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import CILogonProvider class CILogonTests(OAuth2TestsMixin, TestCase): provider_id = CILogonProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "email": "johndoe@example.edu", "eppn": "u1234567@example.edu", "firstname": "John", "lastname": "Doe", "idp_name": "Example University", "sub": "http://cilogon.org/serverA/users/1234567" }""", ) django-allauth-0.47.0/allauth/socialaccount/providers/cilogon/urls.py000066400000000000000000000002501415442050100257540ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import CILogonProvider urlpatterns = default_urlpatterns(CILogonProvider) django-allauth-0.47.0/allauth/socialaccount/providers/cilogon/views.py000066400000000000000000000016461415442050100261360ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import CILogonProvider class CILogonOAuth2Adapter(OAuth2Adapter): provider_id = CILogonProvider.id access_token_url = "https://cilogon.org/oauth2/token" authorize_url = "https://cilogon.org/authorize" profile_url = "https://cilogon.org/oauth2/userinfo" def complete_login(self, request, app, token, **kwargs): resp = requests.get( self.profile_url, params={"access_token": token.token, "alt": "json"}, ) resp.raise_for_status() extra_data = resp.json() login = self.get_provider().sociallogin_from_response(request, extra_data) return login oauth2_login = OAuth2LoginView.adapter_view(CILogonOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(CILogonOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/coinbase/000077500000000000000000000000001415442050100245515ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/coinbase/__init__.py000066400000000000000000000000001415442050100266500ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/coinbase/provider.py000066400000000000000000000015541415442050100267620ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class CoinbaseAccount(ProviderAccount): def get_avatar_url(self): return None def to_str(self): return self.account.extra_data.get( "name", super(CoinbaseAccount, self).to_str() ) class CoinbaseProvider(OAuth2Provider): id = "coinbase" name = "Coinbase" account_class = CoinbaseAccount def get_default_scope(self): # See: https://coinbase.com/docs/api/permissions return ["user"] def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): # See: https://coinbase.com/api/doc/1.0/users/index.html return dict(name=data["name"], email=data["email"]) provider_classes = [CoinbaseProvider] django-allauth-0.47.0/allauth/socialaccount/providers/coinbase/tests.py000066400000000000000000000022631415442050100262700ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import CoinbaseProvider class CoinbaseTests(OAuth2TestsMixin, TestCase): provider_id = CoinbaseProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "users": [ { "user": { "id": "512db383f8182bd24d000001", "name": "User One", "email": "user1@example.com", "time_zone": "Pacific Time (US & Canada)", "native_currency": "USD", "balance": { "amount": "49.76000000", "currency": "BTC" }, "merchant": { "company_name": "Company Name, Inc.", "logo": { "small": "http://smalllogo.example", "medium": "http://mediumlogo.example", "url": "http://logo.example" } }, "buy_level": 1, "sell_level": 1, "buy_limit": { "amount": "10.00000000", "currency": "BTC" }, "sell_limit": { "amount": "100.00000000", "currency": "BTC" } } } ] } """, ) django-allauth-0.47.0/allauth/socialaccount/providers/coinbase/urls.py000066400000000000000000000002521415442050100261070ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import CoinbaseProvider urlpatterns = default_urlpatterns(CoinbaseProvider) django-allauth-0.47.0/allauth/socialaccount/providers/coinbase/views.py000066400000000000000000000017231415442050100262630ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import CoinbaseProvider class CoinbaseOAuth2Adapter(OAuth2Adapter): provider_id = CoinbaseProvider.id @property def authorize_url(self): return "https://coinbase.com/oauth/authorize" @property def access_token_url(self): return "https://coinbase.com/oauth/token" @property def profile_url(self): return "https://coinbase.com/api/v1/users" def complete_login(self, request, app, token, **kwargs): response = requests.get(self.profile_url, params={"access_token": token}) extra_data = response.json()["users"][0]["user"] return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(CoinbaseOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(CoinbaseOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/dataporten/000077500000000000000000000000001415442050100251275ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/dataporten/__init__.py000066400000000000000000000000001415442050100272260ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/dataporten/models.py000066400000000000000000000000001415442050100267520ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/dataporten/provider.py000066400000000000000000000064051415442050100273400ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class DataportenAccount(ProviderAccount): def get_avatar_url(self): """ Returns a valid URL to an 128x128 .png photo of the user """ # Documentation for user profile photos can be found here: # https://docs.dataporten.no/docs/oauth-authentication/ base_url = "https://api.dataporten.no/userinfo/v1/user/media/" return base_url + self.account.extra_data["profilephoto"] def to_str(self): """ Returns string representation of a social account. Includes the name of the user. """ dflt = super(DataportenAccount, self).to_str() return "%s (%s)" % ( self.account.extra_data.get("name", ""), dflt, ) class DataportenProvider(OAuth2Provider): id = "dataporten" name = "Dataporten" account_class = DataportenAccount def extract_uid(self, data): """ Returns the primary user identifier, an UUID string See: https://docs.dataporten.no/docs/userid/ """ return data["userid"] def extract_extra_data(self, data): """ Extracts fields from `data` that will be stored in `SocialAccount`'s `extra_data` JSONField. All the necessary data extraction has already been done in the complete_login()-view, so we can just return the data. PS: This is default behaviour, so we did not really need to define this function, but it is included for documentation purposes. Typical return dict: { "userid": "76a7a061-3c55-430d-8ee0-6f82ec42501f", "userid_sec": ["feide:andreas@uninett.no"], "name": "Andreas \u00c5kre Solberg", "email": "andreas.solberg@uninett.no", "profilephoto": "p:a3019954-902f-45a3-b4ee-bca7b48ab507", } """ return data def extract_common_fields(self, data): """ This function extracts information from the /userinfo endpoint which will be consumed by allauth.socialaccount.adapter.populate_user(). Look there to find which key-value pairs that should be saved in the returned dict. Typical return dict: { "userid": "76a7a061-3c55-430d-8ee0-6f82ec42501f", "userid_sec": ["feide:andreas@uninett.no"], "name": "Andreas \u00c5kre Solberg", "email": "andreas.solberg@uninett.no", "profilephoto": "p:a3019954-902f-45a3-b4ee-bca7b48ab507", "username": "andreas", } """ # Make shallow copy to prevent possible mutability issues data = dict(data) # If a Feide username is available, use it. If not, use the "username" # of the email-address for userid in data.get("userid_sec"): usertype, username = userid.split(":") if usertype == "feide": data["username"] = username.split("@")[0] break else: # Only entered if break is not executed above data["username"] = data.get("email").split("@")[0] return data provider_classes = [DataportenProvider] django-allauth-0.47.0/allauth/socialaccount/providers/dataporten/tests.py000066400000000000000000000052071415442050100266470ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import DataportenProvider class DataportenTest(OAuth2TestsMixin, TestCase): provider_id = DataportenProvider.id def setUp(self): super(DataportenTest, self).setUp() self.mock_data = { "userid": "76a7a061-3c55-430d-8ee0-6f82ec42501f", "userid_sec": ["feide:andreas@uninett.no"], "name": "Andreas \u00c5kre Solberg", "email": "andreas.solberg@uninett.no", "profilephoto": "p:a3019954-902f-45a3-b4ee-bca7b48ab507", "groups": [{}], } def get_login_response_json(self, with_refresh_token=True): rt = "" if with_refresh_token: rt = ',"refresh_token": "testrf"' return ( """{ "access_token":"testac", "expires_in":3600, "scope": "userid profile groups" %s }""" % rt ) def get_mocked_response(self): return MockedResponse( status_code=200, content="""{ "user": { "userid": "76a7a061-3c55-430d-8ee0-6f82ec42501f", "userid_sec": ["feide:andreas@uninett.no"], "name": "Andreas \u00c5kre Solberg", "email": "andreas.solberg@uninett.no", "profilephoto": "p:a3019954-902f-45a3-b4ee-bca7b48ab507" }, "audience": "app123id" }""", headers={"content-type": "application/json"}, ) def test_extract_uid(self): uid = self.provider.extract_uid(self.mock_data) self.assertEqual(uid, self.mock_data["userid"]) def test_extract_extra_data(self): # All the processing is done in the complete_login view, and thus # the data should be returned unaltered extra_data = self.provider.extract_extra_data(self.mock_data) self.assertEqual(extra_data, self.mock_data) def test_extract_common_fields(self): # The main task of this function is to parse the data in order to # find the Feide username, and if not, use the email common_fields = self.provider.extract_common_fields(self.mock_data) self.assertEqual(common_fields["username"], "andreas") # Test correct behaviour when Feide username is unavailable new_mock_data = dict(self.mock_data) new_mock_data["userid_sec"] = [] new_common_fields = self.provider.extract_common_fields(new_mock_data) self.assertEqual(new_common_fields["username"], "andreas.solberg") django-allauth-0.47.0/allauth/socialaccount/providers/dataporten/urls.py000066400000000000000000000002561415442050100264710ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import DataportenProvider urlpatterns = default_urlpatterns(DataportenProvider) django-allauth-0.47.0/allauth/socialaccount/providers/dataporten/views.py000066400000000000000000000046501415442050100266430ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.base import ProviderException from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import DataportenProvider class DataportenAdapter(OAuth2Adapter): provider_id = DataportenProvider.id access_token_url = "https://auth.dataporten.no/oauth/token" authorize_url = "https://auth.dataporten.no/oauth/authorization" profile_url = "https://auth.dataporten.no/userinfo" groups_url = "https://groups-api.dataporten.no/groups/" def complete_login(self, request, app, token, **kwargs): """ Arguments: request - The get request to the callback URL /accounts/dataporten/login/callback. app - The corresponding SocialApp model instance token - A token object with access token given in token.token Returns: Should return a dict with user information intended for parsing by the methods of the DataportenProvider view, i.e. extract_uid(), extract_extra_data(), and extract_common_fields() """ # The athentication header headers = {"Authorization": "Bearer " + token.token} # Userinfo endpoint, for documentation see: # https://docs.dataporten.no/docs/oauth-authentication/ userinfo_response = requests.get( self.profile_url, headers=headers, ) # Raise exception for 4xx and 5xx response codes userinfo_response.raise_for_status() # The endpoint returns json-data and it needs to be decoded extra_data = userinfo_response.json()["user"] # Finally test that the audience property matches the client id # for validification reasons, as instructed by the Dataporten docs # if the userinfo-response is used for authentication if userinfo_response.json()["audience"] != app.client_id: raise ProviderException( "Dataporten returned a user with an audience field \ which does not correspond to the client id of the \ application." ) return self.get_provider().sociallogin_from_response( request, extra_data, ) oauth2_login = OAuth2LoginView.adapter_view(DataportenAdapter) oauth2_callback = OAuth2CallbackView.adapter_view(DataportenAdapter) django-allauth-0.47.0/allauth/socialaccount/providers/daum/000077500000000000000000000000001415442050100237145ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/daum/__init__.py000066400000000000000000000000001415442050100260130ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/daum/models.py000066400000000000000000000000001415442050100255370ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/daum/provider.py000066400000000000000000000010741415442050100261220ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class DaumAccount(ProviderAccount): def get_avatar_url(self): return self.account.extra_data.get("bigImagePath") def to_str(self): return self.account.extra_data.get("nickname", self.account.uid) class DaumProvider(OAuth2Provider): id = "Daum" name = "Daum" account_class = DaumAccount def extract_uid(self, data): return str(data.get("id")) provider_classes = [DaumProvider] django-allauth-0.47.0/allauth/socialaccount/providers/daum/tests.py000066400000000000000000000012641415442050100254330ustar00rootroot00000000000000import json from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import DaumProvider class DaumTests(OAuth2TestsMixin, TestCase): provider_id = DaumProvider.id def get_mocked_response(self): result = {} result["userid"] = "38DTh" result["id"] = 46287445 result["nickname"] = "xncbf" result["bigImagePath"] = "https://img1.daumcdn.net/thumb/" result["openProfile"] = "https://img1.daumcdn.net/thumb/" body = {} body["code"] = 200 body["message"] = "OK" body["result"] = result return MockedResponse(200, json.dumps(body)) django-allauth-0.47.0/allauth/socialaccount/providers/daum/urls.py000066400000000000000000000002421415442050100252510ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import DaumProvider urlpatterns = default_urlpatterns(DaumProvider) django-allauth-0.47.0/allauth/socialaccount/providers/daum/views.py000066400000000000000000000015141415442050100254240ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import DaumProvider class DaumOAuth2Adapter(OAuth2Adapter): provider_id = DaumProvider.id access_token_url = "https://apis.daum.net/oauth2/token" authorize_url = "https://apis.daum.net/oauth2/authorize" profile_url = "https://apis.daum.net/user/v1/show.json" def complete_login(self, request, app, token, **kwargs): resp = requests.get(self.profile_url, params={"access_token": token.token}) extra_data = resp.json().get("result") return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(DaumOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(DaumOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/digitalocean/000077500000000000000000000000001415442050100254115ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/digitalocean/__init__.py000066400000000000000000000000001415442050100275100ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/digitalocean/provider.py000066400000000000000000000010451415442050100276150ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class DigitalOceanAccount(ProviderAccount): pass class DigitalOceanProvider(OAuth2Provider): id = "digitalocean" name = "DigitalOcean" account_class = DigitalOceanAccount def extract_uid(self, data): return str(data["account"]["uuid"]) def extract_common_fields(self, data): return dict(email=data["account"]["email"]) provider_classes = [DigitalOceanProvider] django-allauth-0.47.0/allauth/socialaccount/providers/digitalocean/tests.py000066400000000000000000000022151415442050100271250ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import DigitalOceanProvider class DigitalOceanTests(OAuth2TestsMixin, TestCase): provider_id = DigitalOceanProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "account": { "droplet_limit": 25, "floating_ip_limit": 5, "email": "sammy@example.com", "uuid": "b6fr89dbf6d9156cace5f3c78dc9851d957381ef", "email_verified": true, "status": "active", "status_message": "" } } """, ) def get_login_response_json(self, with_refresh_token=True): return """ { "access_token": "testac", "token_type": "bearer", "expires_in": 2592000, "refresh_token": "00a3aae641658d", "scope": "read write", "info": { "name": "Sammy the Shark", "email":"sammy@example.com", "uuid":"b6fr89dbf6d9156cace5f3c78dc9851d957381ef" } }""" django-allauth-0.47.0/allauth/socialaccount/providers/digitalocean/urls.py000066400000000000000000000002621415442050100267500ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import DigitalOceanProvider urlpatterns = default_urlpatterns(DigitalOceanProvider) django-allauth-0.47.0/allauth/socialaccount/providers/digitalocean/views.py000066400000000000000000000016551415442050100271270ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import DigitalOceanProvider class DigitalOceanOAuth2Adapter(OAuth2Adapter): provider_id = DigitalOceanProvider.id access_token_url = "https://cloud.digitalocean.com/v1/oauth/token" authorize_url = "https://cloud.digitalocean.com/v1/oauth/authorize" profile_url = "https://api.digitalocean.com/v2/account" def complete_login(self, request, app, token, **kwargs): headers = {"Authorization": "Bearer {0}".format(token.token)} resp = requests.get(self.profile_url, headers=headers) extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(DigitalOceanOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(DigitalOceanOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/discord/000077500000000000000000000000001415442050100244155ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/discord/__init__.py000066400000000000000000000000001415442050100265140ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/discord/provider.py000066400000000000000000000031541415442050100266240ustar00rootroot00000000000000from allauth.account.models import EmailAddress from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class DiscordAccount(ProviderAccount): def to_str(self): dflt = super(DiscordAccount, self).to_str() username = self.account.extra_data.get("username") discriminator = self.account.extra_data.get("discriminator") if username and discriminator: return "{}#{}".format(username, discriminator) elif username: return username else: return dflt def get_avatar_url(self): if ( "id" in self.account.extra_data.keys() and "avatar" in self.account.extra_data.keys() ): return "https://cdn.discordapp.com/avatars/{id}/{avatar}.png".format( **self.account.extra_data ) class DiscordProvider(OAuth2Provider): id = "discord" name = "Discord" account_class = DiscordAccount def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): return dict( email=data.get("email"), username=data.get("username"), name=data.get("username"), ) def get_default_scope(self): return ["email", "identify"] def extract_email_addresses(self, data): ret = [] email = data.get("email") if email and data.get("verified"): ret.append(EmailAddress(email=email, verified=True, primary=True)) return ret provider_classes = [DiscordProvider] django-allauth-0.47.0/allauth/socialaccount/providers/discord/tests.py000066400000000000000000000011731415442050100261330ustar00rootroot00000000000000from allauth.socialaccount.providers.discord.provider import DiscordProvider from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase class DiscordTests(OAuth2TestsMixin, TestCase): provider_id = DiscordProvider.id def get_mocked_response(self): return MockedResponse( 200, """{ "id": "80351110224678912", "username": "Nelly", "discriminator": "1337", "avatar": "8342729096ea3675442027381ff50dfe", "verified": true, "email": "nelly@example.com" }""", ) django-allauth-0.47.0/allauth/socialaccount/providers/discord/urls.py000066400000000000000000000003161415442050100257540ustar00rootroot00000000000000from allauth.socialaccount.providers.discord.provider import DiscordProvider from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns urlpatterns = default_urlpatterns(DiscordProvider) django-allauth-0.47.0/allauth/socialaccount/providers/discord/views.py000066400000000000000000000017261415442050100261320ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.discord.provider import DiscordProvider from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) class DiscordOAuth2Adapter(OAuth2Adapter): provider_id = DiscordProvider.id access_token_url = "https://discord.com/api/oauth2/token" authorize_url = "https://discord.com/api/oauth2/authorize" profile_url = "https://discord.com/api/users/@me" def complete_login(self, request, app, token, **kwargs): headers = { "Authorization": "Bearer {0}".format(token.token), "Content-Type": "application/json", } extra_data = requests.get(self.profile_url, headers=headers) return self.get_provider().sociallogin_from_response(request, extra_data.json()) oauth2_login = OAuth2LoginView.adapter_view(DiscordOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(DiscordOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/disqus/000077500000000000000000000000001415442050100242765ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/disqus/__init__.py000066400000000000000000000000001415442050100263750ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/disqus/provider.py000066400000000000000000000025311415442050100265030ustar00rootroot00000000000000from allauth.account.models import EmailAddress from allauth.socialaccount.app_settings import QUERY_EMAIL from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class DisqusAccount(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("profileUrl") def get_avatar_url(self): return self.account.extra_data.get("avatar", {}).get("permalink") def to_str(self): dflt = super(DisqusAccount, self).to_str() return self.account.extra_data.get("name", dflt) class DisqusProvider(OAuth2Provider): id = "disqus" name = "Disqus" account_class = DisqusAccount def get_default_scope(self): scope = ["read"] if QUERY_EMAIL: scope += ["email"] return scope def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): return { "username": data.get("username"), "email": data.get("email"), "name": data.get("name"), } def extract_email_addresses(self, data): ret = [] email = data.get("email") if email: ret.append(EmailAddress(email=email, verified=True, primary=True)) return ret provider_classes = [DisqusProvider] django-allauth-0.47.0/allauth/socialaccount/providers/disqus/tests.py000066400000000000000000000041051415442050100260120ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import absolute_import, unicode_literals from django.contrib.auth.models import User from django.test.utils import override_settings from allauth.account import app_settings as account_settings from allauth.account.models import EmailAddress from allauth.socialaccount.models import SocialAccount from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import DisqusProvider @override_settings( SOCIALACCOUNT_AUTO_SIGNUP=True, ACCOUNT_SIGNUP_FORM_CLASS=None, ACCOUNT_EMAIL_VERIFICATION=account_settings.EmailVerificationMethod.MANDATORY, ) class DisqusTests(OAuth2TestsMixin, TestCase): provider_id = DisqusProvider.id def get_mocked_response( self, name="Raymond Penners", email="raymond.penners@example.com" ): return MockedResponse( 200, """ {"response": {"name": "%s", "avatar": { "permalink": "https://lh5.googleusercontent.com/photo.jpg" }, "email": "%s", "profileUrl": "https://plus.google.com/108204268033311374519", "id": "108204268033311374519" }} """ % (name, email), ) def test_account_connect(self): email = "user@example.com" user = User.objects.create(username="user", is_active=True, email=email) user.set_password("test") user.save() EmailAddress.objects.create(user=user, email=email, primary=True, verified=True) self.client.login(username=user.username, password="test") self.login(self.get_mocked_response(), process="connect") # Check if we connected... self.assertTrue( SocialAccount.objects.filter(user=user, provider=DisqusProvider.id).exists() ) # For now, we do not pick up any new e-mail addresses on connect self.assertEqual(EmailAddress.objects.filter(user=user).count(), 1) self.assertEqual(EmailAddress.objects.filter(user=user, email=email).count(), 1) django-allauth-0.47.0/allauth/socialaccount/providers/disqus/urls.py000066400000000000000000000002461415442050100256370ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import DisqusProvider urlpatterns = default_urlpatterns(DisqusProvider) django-allauth-0.47.0/allauth/socialaccount/providers/disqus/views.py000066400000000000000000000021271415442050100260070ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import DisqusProvider class DisqusOAuth2Adapter(OAuth2Adapter): provider_id = DisqusProvider.id access_token_url = "https://disqus.com/api/oauth/2.0/access_token/" authorize_url = "https://disqus.com/api/oauth/2.0/authorize/" profile_url = "https://disqus.com/api/3.0/users/details.json" scope_delimiter = "," def complete_login(self, request, app, token, **kwargs): resp = requests.get( self.profile_url, params={ "access_token": token.token, "api_key": app.client_id, "api_secret": app.secret, }, ) resp.raise_for_status() extra_data = resp.json().get("response") login = self.get_provider().sociallogin_from_response(request, extra_data) return login oauth2_login = OAuth2LoginView.adapter_view(DisqusOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(DisqusOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/douban/000077500000000000000000000000001415442050100242365ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/douban/__init__.py000077500000000000000000000000001415442050100263400ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/douban/provider.py000077500000000000000000000024331415442050100264470ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class DoubanAccount(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("alt") def get_avatar_url(self): return self.account.extra_data.get("large_avatar") def to_str(self): dflt = super(DoubanAccount, self).to_str() return self.account.extra_data.get("name", dflt) class DoubanProvider(OAuth2Provider): id = "douban" name = "Douban" account_class = DoubanAccount def extract_uid(self, data): return data["id"] def extract_common_fields(self, data): """ Extract data from profile json to populate user instance. In Douban profile API: - id: a digital string, will never change - uid: defaults to id, but can be changed once, used in profile url, like slug - name: display name, can be changed every 30 days So we should use `id` as username here, other than `uid`. Also use `name` as `first_name` for displaying purpose. """ return { "username": data["id"], "first_name": data.get("name", ""), } provider_classes = [DoubanProvider] django-allauth-0.47.0/allauth/socialaccount/providers/douban/tests.py000077500000000000000000000015511415442050100257570ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import DoubanProvider class DoubanTests(OAuth2TestsMixin, TestCase): provider_id = DoubanProvider.id def get_mocked_response(self): return MockedResponse( 200, """ {"name": "guoqiao", "created": "2009-02-18 01:07:52", "is_suicide": false, "alt": "http://www.douban.com/people/qguo/", "avatar": "http://img3.douban.com/icon/u3659811-3.jpg", "signature": "", "uid": "qguo", "is_banned": false, "desc": "\u4e0d\u662f\u5f88\u7231\u8bfb\u4e66", "type": "user", "id": "3659811", "large_avatar": "http://img3.douban.com/icon/up3659811-3.jpg"} """, ) django-allauth-0.47.0/allauth/socialaccount/providers/douban/urls.py000077500000000000000000000002461415442050100256020ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import DoubanProvider urlpatterns = default_urlpatterns(DoubanProvider) django-allauth-0.47.0/allauth/socialaccount/providers/douban/views.py000077500000000000000000000025011415442050100257460ustar00rootroot00000000000000import requests from django.utils.translation import gettext_lazy as _ from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from ..base import ProviderException from .provider import DoubanProvider class DoubanOAuth2Adapter(OAuth2Adapter): provider_id = DoubanProvider.id access_token_url = "https://www.douban.com/service/auth2/token" authorize_url = "https://www.douban.com/service/auth2/auth" profile_url = "https://api.douban.com/v2/user/~me" def complete_login(self, request, app, token, **kwargs): headers = {"Authorization": "Bearer %s" % token.token} resp = requests.get(self.profile_url, headers=headers) extra_data = resp.json() """ Douban may return data like this: { 'code': 128, 'request': 'GET /v2/user/~me', 'msg': 'user_is_locked:53358092' } """ if "id" not in extra_data: msg = extra_data.get("msg", _("Invalid profile data")) raise ProviderException(msg) return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(DoubanOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(DoubanOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/doximity/000077500000000000000000000000001415442050100246345ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/doximity/__init__.py000066400000000000000000000000001415442050100267330ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/doximity/provider.py000066400000000000000000000020501415442050100270350ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class DoximityAccount(ProviderAccount): def get_profile_url(self): return None def get_avatar_url(self): return self.account.extra_data.get("profile_photo") def to_str(self): dflt = super(DoximityAccount, self).to_str() return self.account.extra_data.get("full_name", dflt) class DoximityProvider(OAuth2Provider): id = "doximity" name = "Doximity" account_class = DoximityAccount def extract_uid(self, data): return data[str("id")] # the Doximity id is long def extract_common_fields(self, data): return dict( username=data.get("email"), first_name=data.get("firstname"), last_name=data.get("lastname"), email=data.get("email"), name=data.get("full_name"), ) def get_default_scope(self): return ["basic", "email"] provider_classes = [DoximityProvider] django-allauth-0.47.0/allauth/socialaccount/providers/doximity/tests.py000066400000000000000000000041651415442050100263560ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import DoximityProvider class DoximityTests(OAuth2TestsMixin, TestCase): provider_id = DoximityProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "id": 41993552342, "npi": 1952635229, "firstname": "John", "middlename": "Henry", "maiden_name": null, "lastname": "Smith", "full_name": "Ahmed S Belal, MD", "gender": "M", "city": "San Francisco", "state": "CA", "zip": "94107", "phone": "(650) 200-3901", "fax": "888-416-8572", "email": "abelalmd@example.com", "address_1": "500 3rd St.", "address_2": "Suite 510", "lat": 42.3663926, "lon": -71.051395, "additional_locations": [{ "address_1": "12 Main st", "address_2": null, "city": "Cambridge", "state": "MA", "phone": "555-555-5555", "fax": null, "zip": "02138" }], "credentials": "MD", "verified": true, "description": "Chief of Cardiology", "medical_school": "UCSF School of Medicine", "residencies": ["Stanford Medical Center", "Mt Sinai Hospital"], "specialty": "Cardiology", "specialty_details": { "abbr": "Cards", "code": "CA00", "credential_id": 4, "name": "Cardiology", "id": "CA00" }, "hospitals": [{ "name": "Mills-Peninsula Health Services", "aha_id": "6930315" }], "subspecialties": ["General Cardiology", "Cardiac Disease"], "profile_photo": "https://s3.amazonaws.com/doximity_prod_uploads\ /profile_photos/7969/normal/profile.png", "colleague_count": 142 } """, ) django-allauth-0.47.0/allauth/socialaccount/providers/doximity/urls.py000066400000000000000000000002521415442050100261720ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import DoximityProvider urlpatterns = default_urlpatterns(DoximityProvider) django-allauth-0.47.0/allauth/socialaccount/providers/doximity/views.py000066400000000000000000000016101415442050100263410ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import DoximityProvider class DoximityOAuth2Adapter(OAuth2Adapter): provider_id = DoximityProvider.id access_token_url = "https://auth.doximity.com/oauth/token" authorize_url = "https://auth.doximity.com/oauth/authorize" profile_url = "https://www.doximity.com/api/v1/users/current" def complete_login(self, request, app, token, **kwargs): headers = {"Authorization": "Bearer %s" % token.token} resp = requests.get(self.profile_url, headers=headers) extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(DoximityOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(DoximityOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/draugiem/000077500000000000000000000000001415442050100245635ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/draugiem/__init__.py000066400000000000000000000000001415442050100266620ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/draugiem/provider.py000066400000000000000000000034061415442050100267720ustar00rootroot00000000000000from django.urls import reverse from django.utils.http import urlencode from allauth.socialaccount.providers.base import Provider, ProviderAccount class DraugiemAccount(ProviderAccount): def get_avatar_url(self): ret = None pic_small_url = self.account.extra_data.get("img") pic_icon_url = self.account.extra_data.get("imgi") pic_medium_url = self.account.extra_data.get("imgm") pic_large_url = self.account.extra_data.get("imgl") if pic_large_url: return pic_large_url elif pic_medium_url: return pic_medium_url elif pic_icon_url: return pic_icon_url elif pic_small_url: return pic_small_url else: return ret def to_str(self): default = super(DraugiemAccount, self).to_str() name = self.account.extra_data.get("name") surname = self.account.extra_data.get("surnname") if name and surname: return "%s %s" % (name, surname) return default class DraugiemProvider(Provider): id = "draugiem" name = "Draugiem" account_class = DraugiemAccount def get_login_url(self, request, **kwargs): url = reverse(self.id + "_login") if kwargs: url = url + "?" + urlencode(kwargs) return url def extract_uid(self, data): return str(data["uid"]) def extract_common_fields(self, data): uid = self.extract_uid(data) user_data = data["users"][uid] return dict( first_name=user_data.get("name"), last_name=user_data.get("surname"), ) def extract_extra_data(self, data): uid = self.extract_uid(data) return data["users"][uid] provider_classes = [DraugiemProvider] django-allauth-0.47.0/allauth/socialaccount/providers/draugiem/tests.py000066400000000000000000000112711415442050100263010ustar00rootroot00000000000000from hashlib import md5 from django.contrib.auth.models import User from django.contrib.sites.models import Site from django.urls import reverse from django.utils.http import urlencode from allauth.socialaccount import providers from allauth.socialaccount.models import SocialApp, SocialToken from allauth.tests import Mock, TestCase, patch from . import views from .provider import DraugiemProvider class DraugiemTests(TestCase): def setUp(self): # workaround to create a session. see: # https://code.djangoproject.com/ticket/11475 User.objects.create_user( "anakin", "skywalker@deathstar.example.com", "s1thrul3s" ) self.client.login(username="anakin", password="s1thrul3s") self.provider = providers.registry.by_id(DraugiemProvider.id) app = SocialApp.objects.create( provider=self.provider.id, name=self.provider.id, client_id="app123id", key=self.provider.id, secret="dummy", ) app.sites.add(Site.objects.get_current()) self.app = app def get_draugiem_login_response(self): """ Sample Draugiem.lv response """ return { "apikey": "12345", "uid": "42", "users": { "42": { "age": "266", "imgl": "http://cdn.memegenerator.net/instances/500x/23395689.jpg", "surname": "Skywalker", "url": "/user/42/", "imgi": "http://cdn.memegenerator.net/instances/500x/23395689.jpg", "nick": "Sky Guy", "created": "09.11.1812 11:26:15", "deleted": "false", "imgm": "http://cdn.memegenerator.net/instances/500x/23395689.jpg", "sex": "M", "type": "User_Default", "uid": "42", "place": "London", "emailHash": "3f198f21434gfd2f2b4rs05939shk93f3815bc6aa", "name": "Anakin", "adult": "1", "birthday": "1750-09-13", "img": "http://cdn.memegenerator.net/instances/500x/23395689.jpg", } }, } def get_socialaccount(self, response, token): """ Returns SocialLogin based on the data from the request """ request = Mock() login = self.provider.sociallogin_from_response(request, response) login.token = token return login def mock_socialaccount_state(self): """ SocialLogin depends on Session state - a tuple of request params and a random string """ session = self.client.session session["socialaccount_state"] = ( {"process": "login", "scope": "", "auth_params": ""}, "12345", ) session.save() def test_login_redirect(self): response = self.client.get(reverse(views.login)) redirect_url = reverse(views.callback) full_redirect_url = "http://testserver" + redirect_url secret = self.app.secret + full_redirect_url redirect_url_hash = md5(secret.encode("utf-8")).hexdigest() params = { "app": self.app.client_id, "hash": redirect_url_hash, "redirect": full_redirect_url, } self.assertRedirects( response, "%s?%s" % (views.AUTHORIZE_URL, urlencode(params)), fetch_redirect_response=False, ) def test_callback_no_auth_status(self): response = self.client.get(reverse(views.callback)) self.assertTemplateUsed(response, "socialaccount/authentication_error.html") def test_callback_invalid_auth_status(self): response = self.client.get(reverse(views.callback), {"dr_auth_status": "fail"}) self.assertTemplateUsed(response, "socialaccount/authentication_error.html") def test_callback(self): with patch( "allauth.socialaccount.providers.draugiem.views.draugiem_complete_login" ) as draugiem_complete_login: self.mock_socialaccount_state() response_json = self.get_draugiem_login_response() token = SocialToken(app=self.app, token=response_json["apikey"]) login = self.get_socialaccount(response_json, token) draugiem_complete_login.return_value = login response = self.client.get( reverse(views.callback), {"dr_auth_status": "ok", "dr_auth_code": "42"}, ) self.assertRedirects( response, "/accounts/profile/", fetch_redirect_response=False ) django-allauth-0.47.0/allauth/socialaccount/providers/draugiem/urls.py000066400000000000000000000003211415442050100261160ustar00rootroot00000000000000from django.urls import path from . import views urlpatterns = [ path("draugiem/login/", views.login, name="draugiem_login"), path("draugiem/callback/", views.callback, name="draugiem_callback"), ] django-allauth-0.47.0/allauth/socialaccount/providers/draugiem/views.py000066400000000000000000000054051415442050100262760ustar00rootroot00000000000000import requests from hashlib import md5 from django.http import HttpResponseRedirect from django.urls import reverse from django.utils.http import urlencode from django.views.decorators.csrf import csrf_exempt from allauth.socialaccount import providers from allauth.socialaccount.helpers import ( complete_social_login, render_authentication_error, ) from allauth.socialaccount.models import SocialLogin, SocialToken from ..base import AuthError from .provider import DraugiemProvider class DraugiemApiError(Exception): pass ACCESS_TOKEN_URL = "http://api.draugiem.lv/json" AUTHORIZE_URL = "http://api.draugiem.lv/authorize" def login(request): app = providers.registry.by_id(DraugiemProvider.id, request).get_app(request) redirect_url = request.build_absolute_uri(reverse(callback)) redirect_url_hash = md5((app.secret + redirect_url).encode("utf-8")).hexdigest() params = { "app": app.client_id, "hash": redirect_url_hash, "redirect": redirect_url, } SocialLogin.stash_state(request) return HttpResponseRedirect("%s?%s" % (AUTHORIZE_URL, urlencode(params))) @csrf_exempt def callback(request): if "dr_auth_status" not in request.GET: return render_authentication_error( request, DraugiemProvider.id, error=AuthError.UNKNOWN ) if request.GET["dr_auth_status"] != "ok": return render_authentication_error( request, DraugiemProvider.id, error=AuthError.DENIED ) if "dr_auth_code" not in request.GET: return render_authentication_error( request, DraugiemProvider.id, error=AuthError.UNKNOWN ) ret = None auth_exception = None try: app = providers.registry.by_id(DraugiemProvider.id, request).get_app(request) login = draugiem_complete_login(request, app, request.GET["dr_auth_code"]) login.state = SocialLogin.unstash_state(request) ret = complete_social_login(request, login) except (requests.RequestException, DraugiemApiError) as e: auth_exception = e if not ret: ret = render_authentication_error( request, DraugiemProvider.id, exception=auth_exception ) return ret def draugiem_complete_login(request, app, code): provider = providers.registry.by_id(DraugiemProvider.id, request) response = requests.get( ACCESS_TOKEN_URL, {"action": "authorize", "app": app.secret, "code": code}, ) response.raise_for_status() response_json = response.json() if "error" in response_json: raise DraugiemApiError(response_json["error"]) token = SocialToken(app=app, token=response_json["apikey"]) login = provider.sociallogin_from_response(request, response_json) login.token = token return login django-allauth-0.47.0/allauth/socialaccount/providers/dropbox/000077500000000000000000000000001415442050100244435ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/dropbox/__init__.py000066400000000000000000000000001415442050100265420ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/dropbox/provider.py000066400000000000000000000011411415442050100266440ustar00rootroot00000000000000from allauth.socialaccount import providers from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class DropboxOAuth2Account(ProviderAccount): pass class DropboxOAuth2Provider(OAuth2Provider): id = "dropbox" name = "Dropbox" account_class = DropboxOAuth2Account def extract_uid(self, data): return data["account_id"] def extract_common_fields(self, data): return dict(name=data["name"]["display_name"], email=data["email"]) providers.registry.register(DropboxOAuth2Provider) django-allauth-0.47.0/allauth/socialaccount/providers/dropbox/tests.py000066400000000000000000000023571415442050100261660ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals import json from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import DropboxOAuth2Provider class DropboxOAuth2Tests(OAuth2TestsMixin, TestCase): provider_id = DropboxOAuth2Provider.id def get_mocked_response(self): payload = { "account_id": "dbid:ASDFasd3ASdfasdFAsd1AS2ASDF1aS-DfAs", "account_type": {".tag": "basic"}, "country": "US", "disabled": False, "email": "allauth@example.com", "email_verified": True, "is_paired": True, "locale": "en", "name": { "abbreviated_name": "AA", "display_name": "All Auth", "familiar_name": "All", "given_name": "All", "surname": "Auth", }, "profile_photo_url": ( "https://dl-web.dropbox.com/account_photo" "/get/dbid%ASDFasd3ASdfasdFAsd1AS2ASDF1aS" "-DfAs?size=128x128" ), "referral_link": "https://db.tt/ASDfAsDf", } return MockedResponse(200, json.dumps(payload)) django-allauth-0.47.0/allauth/socialaccount/providers/dropbox/urls.py000066400000000000000000000002631415442050100260030ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth.urls import default_urlpatterns from .provider import DropboxOAuth2Provider urlpatterns = default_urlpatterns(DropboxOAuth2Provider) django-allauth-0.47.0/allauth/socialaccount/providers/dropbox/views.py000066400000000000000000000017161415442050100261570ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import DropboxOAuth2Provider class DropboxOAuth2Adapter(OAuth2Adapter): provider_id = DropboxOAuth2Provider.id access_token_url = "https://api.dropbox.com/oauth2/token" authorize_url = "https://www.dropbox.com/oauth2/authorize" profile_url = "https://api.dropbox.com/2/users/get_current_account" redirect_uri_protocol = "https" def complete_login(self, request, app, token, **kwargs): response = requests.post( self.profile_url, headers={"Authorization": "Bearer %s" % (token.token,)}, ) response.raise_for_status() return self.get_provider().sociallogin_from_response(request, response.json()) oauth_login = OAuth2LoginView.adapter_view(DropboxOAuth2Adapter) oauth_callback = OAuth2CallbackView.adapter_view(DropboxOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/dwolla/000077500000000000000000000000001415442050100242505ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/dwolla/__init__.py000066400000000000000000000000001415442050100263470ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/dwolla/models.py000066400000000000000000000000001415442050100260730ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/dwolla/provider.py000066400000000000000000000011401415442050100264500ustar00rootroot00000000000000"""Provider for Dwolla""" from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class DwollaAccount(ProviderAccount): """Dwolla Account""" pass class DwollaProvider(OAuth2Provider): """Provider for Dwolla""" id = "dwolla" name = "Dwolla" account_class = DwollaAccount def extract_uid(self, data): return str(data.get("id", None)) def extract_common_fields(self, data): return dict( name=data.get("name"), ) provider_classes = [DwollaProvider] django-allauth-0.47.0/allauth/socialaccount/providers/dwolla/test.py000066400000000000000000000015051415442050100256020ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import DwollaProvider class DwollaTests(OAuth2TestsMixin, TestCase): provider_id = DwollaProvider.id def get_mocked_response(self): return MockedResponse( 200, """{ "id": "123", "_links":{"account":{"href":"http://localhost"}}, "name":"John Doe" }""", ) def get_login_response_json(self, with_refresh_token=True): rt = "" if with_refresh_token: rt = ',"refresh_token": "testrf"' return ( """{ "uid":"weibo", "access_token":"testac", "_links":{"account":{"href":"http://localhost"}} %s }""" % rt ) django-allauth-0.47.0/allauth/socialaccount/providers/dwolla/urls.py000066400000000000000000000002461415442050100256110ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import DwollaProvider urlpatterns = default_urlpatterns(DwollaProvider) django-allauth-0.47.0/allauth/socialaccount/providers/dwolla/views.py000066400000000000000000000027771415442050100257740ustar00rootroot00000000000000import requests from django.conf import settings from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import DwollaProvider ENVIRONMENTS = { "production": { "auth_url": "https://www.dwolla.com/oauth/v2/authenticate", "token_url": "https://www.dwolla.com/oauth/v2/token", }, "sandbox": { "auth_url": "https://uat.dwolla.com/oauth/v2/authenticate", "token_url": "https://uat.dwolla.com/oauth/v2/token", }, } ENV = ( getattr(settings, "SOCIALACCOUNT_PROVIDERS", {}) .get("dwolla", {}) .get("ENVIROMENT", "production") ) AUTH_URL = ENVIRONMENTS[ENV]["auth_url"] TOKEN_URL = ENVIRONMENTS[ENV]["token_url"] class DwollaOAuth2Adapter(OAuth2Adapter): """Dwolla Views Adapter""" scope_delimiter = "|" provider_id = DwollaProvider.id access_token_url = TOKEN_URL authorize_url = AUTH_URL def complete_login(self, request, app, token, response, **kwargs): resp = requests.get( response["_links"]["account"]["href"], headers={ "authorization": "Bearer %s" % token.token, "accept": "application/vnd.dwolla.v1.hal+json", }, ) extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(DwollaOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(DwollaOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/edmodo/000077500000000000000000000000001415442050100242355ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/edmodo/__init__.py000066400000000000000000000000001415442050100263340ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/edmodo/provider.py000066400000000000000000000020311415442050100264350ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class EdmodoAccount(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("profile_url") def get_avatar_url(self): return self.account.extra_data.get("avatar_url") class EdmodoProvider(OAuth2Provider): id = "edmodo" name = "Edmodo" account_class = EdmodoAccount def get_default_scope(self): return ["basic"] def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): return dict( first_name=data.get("first_name"), last_name=data.get("last_name"), email=data.get("email", ""), ) def extract_extra_data(self, data): return dict( user_type=data.get("type"), profile_url=data.get("url"), avatar_url=data.get("avatars").get("large"), ) provider_classes = [EdmodoProvider] django-allauth-0.47.0/allauth/socialaccount/providers/edmodo/tests.py000066400000000000000000000022361415442050100257540ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import EdmodoProvider class EdmodoTests(OAuth2TestsMixin, TestCase): provider_id = EdmodoProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "url": "https://api.edmodo.com/users/74721257", "id": 74721257, "type": "teacher", "username": "getacclaim-teacher1", "user_title": null, "first_name": "Edmodo Test", "last_name": "Teacher", "time_zone": "America/New_York", "utc_offset": -18000, "locale": "en", "gender": null, "start_level": null, "end_level": null, "about": null, "premium": false, "school": {"url": "https://api.edmodo.com/schools/559253", "id": 559253}, "verified_institution_member": true, "coppa_verified": false, "subjects": null, "avatars": { "small": "https://api.edmodo.com/users/74721257/avatar?type=small&u=670329ncqnf8fxv7tya24byn5", "large": "https://api.edmodo.com/users/74721257/avatar?type=large&u=670329ncqnf8fxv7tya24byn5" }, "email":"test@example.com", "sync_enabled": false } """, ) # noqa django-allauth-0.47.0/allauth/socialaccount/providers/edmodo/urls.py000066400000000000000000000002461415442050100255760ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import EdmodoProvider urlpatterns = default_urlpatterns(EdmodoProvider) django-allauth-0.47.0/allauth/socialaccount/providers/edmodo/views.py000066400000000000000000000015001415442050100257400ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import EdmodoProvider class EdmodoOAuth2Adapter(OAuth2Adapter): provider_id = EdmodoProvider.id access_token_url = "https://api.edmodo.com/oauth/token" authorize_url = "https://api.edmodo.com/oauth/authorize" profile_url = "https://api.edmodo.com/users/me" def complete_login(self, request, app, token, **kwargs): resp = requests.get(self.profile_url, params={"access_token": token.token}) extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(EdmodoOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(EdmodoOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/edx/000077500000000000000000000000001415442050100235465ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/edx/__init__.py000066400000000000000000000000001415442050100256450ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/edx/provider.py000066400000000000000000000015711415442050100257560ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class EdxAccount(ProviderAccount): def get_profile_url(self): if self.account.extra_data["profile_image"]["has_image"]: return self.account.extra_data["image_url_full"] class EdxProvider(OAuth2Provider): id = "edx" name = "Edx" account_class = EdxAccount def get_default_scope(self): return ["profile"] def extract_uid(self, data): """Extract uid ('id') and ensure it's a str.""" return str(data["username"]) def extract_common_fields(self, data): return dict( email=data.get("email"), username=data.get("username"), name=data.get("name"), user_id=data.get("user_id"), ) provider_classes = [EdxProvider] django-allauth-0.47.0/allauth/socialaccount/providers/edx/tests.py000066400000000000000000000022451415442050100252650ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import EdxProvider class EdxTests(OAuth2TestsMixin, TestCase): provider_id = EdxProvider.id def get_mocked_response(self): print(self) return MockedResponse( 200, """{ "username":"krzysztof", "bio":null, "requires_parental_consent":true, "language_proficiencies":[ ], "name":"Krzysztof Hoffmann", "country":null, "social_links":[ ], "is_active":true, "profile_image":{ "image_url_small":"http://draft.navoica.pl/static/images/profiles/default_30.png", "image_url_full":"http://draft.navoica.pl/static/images/profiles/default_500.png", "image_url_large":"http://draft.navoica.pl/static/images/profiles/default_120.png", "image_url_medium":"http://draft.navoica.pl/static/images/profiles/default_50.png", "has_image":false }, "extended_profile":[ ], "year_of_birth":null, "level_of_education":null, "goals":"", "accomplishments_shared":false, "gender":null, "date_joined":"2019-09-21T07:48:31Z", "mailing_address":"", "email":"krzysztof.hoffmann@opi.org.pl", "account_privacy":"private" }""", ) django-allauth-0.47.0/allauth/socialaccount/providers/edx/urls.py000066400000000000000000000002401415442050100251010ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import EdxProvider urlpatterns = default_urlpatterns(EdxProvider) django-allauth-0.47.0/allauth/socialaccount/providers/edx/views.py000066400000000000000000000027001415442050100252540ustar00rootroot00000000000000import requests from allauth.socialaccount import app_settings from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import EdxProvider class EdxOAuth2Adapter(OAuth2Adapter): provider_id = EdxProvider.id provider_default_url = "https://edx.org" settings = app_settings.PROVIDERS.get(provider_id, {}) provider_base_url = settings.get("EDX_URL", provider_default_url) access_token_url = "{0}/oauth2/access_token".format(provider_base_url) authorize_url = "{0}/oauth2/authorize/".format(provider_base_url) profile_url = "{0}/api/user/v1/me".format(provider_base_url) account_url = "{0}/api/user/v1/accounts/{1}" supports_state = False redirect_uri_protocol = "https" def complete_login(self, request, app, token, **kwargs): response = requests.get(self.profile_url, params={"access_token": token}) extra_data = response.json() if extra_data.get("email", None) is None: response = requests.get( self.account_url.format(self.provider_base_url, extra_data["username"]), params={"access_token": token}, ) extra_data = response.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(EdxOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(EdxOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/eventbrite/000077500000000000000000000000001415442050100251355ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/eventbrite/__init__.py000066400000000000000000000000001415442050100272340ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/eventbrite/provider.py000066400000000000000000000035571415442050100273530ustar00rootroot00000000000000"""Customise Provider classes for Eventbrite API v3.""" from allauth.account.models import EmailAddress from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class EventbriteAccount(ProviderAccount): """ProviderAccount subclass for Eventbrite.""" def get_avatar_url(self): """Return avatar url.""" return self.account.extra_data["image_id"] class EventbriteProvider(OAuth2Provider): """OAuth2Provider subclass for Eventbrite.""" id = "eventbrite" name = "Eventbrite" account_class = EventbriteAccount def extract_uid(self, data): """Extract uid ('id') and ensure it's a str.""" return str(data["id"]) def get_default_scope(self): """Ensure scope is null to fit their API.""" return [""] def extract_common_fields(self, data): """Extract fields from a basic user query.""" email = None for curr_email in data.get("emails", []): email = email or curr_email.get("email") if curr_email.get("verified", False) and curr_email.get("primary", False): email = curr_email.get("email") return dict( email=email, id=data.get("id"), name=data.get("name"), first_name=data.get("first_name"), last_name=data.get("last_name"), image_url=data.get("image_url"), ) def extract_email_addresses(self, data): addresses = [] for email in data.get("emails", []): addresses.append( EmailAddress( email=email.get("email"), verified=email.get("verfified"), primary=email.get("primary"), ) ) return addresses provider_classes = [EventbriteProvider] django-allauth-0.47.0/allauth/socialaccount/providers/eventbrite/tests.py000066400000000000000000000015151415442050100266530ustar00rootroot00000000000000"""Test Eventbrite OAuth2 v3 Flow.""" from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import EventbriteProvider class EventbriteTests(OAuth2TestsMixin, TestCase): """Test Class for Eventbrite OAuth2 v3.""" provider_id = EventbriteProvider.id def get_mocked_response(self): """Test authentication with an non-null image_id""" return MockedResponse( 200, """{ "emails": [{ "email": "test@example.com", "verified": "True", "primary": "True" }], "id": "999999999", "name": "Andrew Godwin", "first_name": "Andrew", "last_name": "Godwin", "image_id": "99999999" }""", ) django-allauth-0.47.0/allauth/socialaccount/providers/eventbrite/urls.py000066400000000000000000000003311415442050100264710ustar00rootroot00000000000000"""Register urls for EventbriteProvider""" from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import EventbriteProvider urlpatterns = default_urlpatterns(EventbriteProvider) django-allauth-0.47.0/allauth/socialaccount/providers/eventbrite/views.py000066400000000000000000000017231415442050100266470ustar00rootroot00000000000000"""Views for Eventbrite API v3.""" import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import EventbriteProvider class EventbriteOAuth2Adapter(OAuth2Adapter): """OAuth2Adapter for Eventbrite API v3.""" provider_id = EventbriteProvider.id authorize_url = "https://www.eventbrite.com/oauth/authorize" access_token_url = "https://www.eventbrite.com/oauth/token" profile_url = "https://www.eventbriteapi.com/v3/users/me/" def complete_login(self, request, app, token, **kwargs): """Complete login.""" resp = requests.get(self.profile_url, params={"token": token.token}) extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(EventbriteOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(EventbriteOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/eveonline/000077500000000000000000000000001415442050100247525ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/eveonline/__init__.py000066400000000000000000000000001415442050100270510ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/eveonline/provider.py000066400000000000000000000026551415442050100271660ustar00rootroot00000000000000from allauth.socialaccount.app_settings import STORE_TOKENS from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class EveOnlineAccount(ProviderAccount): def get_profile_url(self): return "https://gate.eveonline.com/Profile/{char_name}".format( char_name=self.account.extra_data.get("CharacterName") ) def get_avatar_url(self): return ("https://image.eveonline.com/Character/{char_id}_128.jpg").format( char_id=self.account.extra_data.get("CharacterID", 1) ) def to_str(self): dflt = super(EveOnlineAccount, self).to_str() return next( value for value in ( self.account.extra_data.get("CharacterName", None), self.account.extra_data.get("CharacterID", None), dflt, ) if value is not None ) class EveOnlineProvider(OAuth2Provider): id = "eveonline" name = "EVE Online" account_class = EveOnlineAccount def get_default_scope(self): scopes = [] if STORE_TOKENS: scopes.append("publicData") return scopes def extract_uid(self, data): return str(data["CharacterOwnerHash"]) def extract_common_fields(self, data): return dict(name=data.get("CharacterName")) provider_classes = [EveOnlineProvider] django-allauth-0.47.0/allauth/socialaccount/providers/eveonline/tests.py000066400000000000000000000011631415442050100264670ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import EveOnlineProvider class EveOnlineTests(OAuth2TestsMixin, TestCase): provider_id = EveOnlineProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "CharacterID": 273042051, "CharacterName": "CCP illurkall", "ExpiresOn": "2014-05-23T15:01:15.182864Z", "Scopes": " ", "TokenType": "Character", "CharacterOwnerHash": "XM4D...FoY=" }""", ) django-allauth-0.47.0/allauth/socialaccount/providers/eveonline/urls.py000066400000000000000000000002541415442050100263120ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import EveOnlineProvider urlpatterns = default_urlpatterns(EveOnlineProvider) django-allauth-0.47.0/allauth/socialaccount/providers/eveonline/views.py000066400000000000000000000016231415442050100264630ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import EveOnlineProvider class EveOnlineOAuth2Adapter(OAuth2Adapter): provider_id = EveOnlineProvider.id access_token_url = "https://login.eveonline.com/oauth/token" authorize_url = "https://login.eveonline.com/oauth/authorize" profile_url = "https://login.eveonline.com/oauth/verify" def complete_login(self, request, app, token, **kwargs): resp = requests.get( self.profile_url, headers={"Authorization": "Bearer " + token.token}, ) extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(EveOnlineOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(EveOnlineOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/evernote/000077500000000000000000000000001415442050100246155ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/evernote/__init__.py000066400000000000000000000000001415442050100267140ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/evernote/provider.py000066400000000000000000000011031415442050100270140ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth.provider import OAuthProvider class EvernoteAccount(ProviderAccount): def get_profile_url(self): return None def get_avatar_url(self): return None class EvernoteProvider(OAuthProvider): id = "evernote" name = "Evernote" account_class = EvernoteAccount def extract_uid(self, data): return str(data["edam_userId"]) def extract_common_fields(self, data): return data provider_classes = [EvernoteProvider] django-allauth-0.47.0/allauth/socialaccount/providers/evernote/tests.py000066400000000000000000000015701415442050100263340ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals from allauth.socialaccount.tests import OAuthTestsMixin from allauth.tests import MockedResponse, TestCase from .provider import EvernoteProvider class EvernoteTests(OAuthTestsMixin, TestCase): provider_id = EvernoteProvider.id def get_mocked_response(self): return [] def get_access_token_response(self): return MockedResponse( 200, "oauth_token=S%3Ds1%3AU%3D9876%3AE%3D999999b0c50%3AC%3D14c1f89dd18%3AP%3D81%3AA%3Dpennersr%3AV%3D2%3AH%3Ddeadf00dd2d6aba7b519923987b4bf77&oauth_token_secret=&edam_shard=s1&edam_userId=591969&edam_expires=1457994271824&edam_noteStoreUrl=https%3A%2F%2Fsandbox.evernote.com%2Fshard%2Fs1%2Fnotestore&edam_webApiUrlPrefix=https%3A%2F%2Fsandbox.evernote.com%2Fshard%2Fs1%2F", # noqa {"content-type": "text/plain"}, ) django-allauth-0.47.0/allauth/socialaccount/providers/evernote/urls.py000066400000000000000000000002511415442050100261520ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth.urls import default_urlpatterns from .provider import EvernoteProvider urlpatterns = default_urlpatterns(EvernoteProvider) django-allauth-0.47.0/allauth/socialaccount/providers/evernote/views.py000066400000000000000000000022611415442050100263250ustar00rootroot00000000000000from __future__ import absolute_import from datetime import datetime from allauth.socialaccount import app_settings from allauth.socialaccount.providers.oauth.views import ( OAuthAdapter, OAuthCallbackView, OAuthLoginView, ) from .provider import EvernoteProvider class EvernoteOAuthAdapter(OAuthAdapter): provider_id = EvernoteProvider.id settings = app_settings.PROVIDERS.get(provider_id, {}) request_token_url = "https://%s/oauth" % ( settings.get("EVERNOTE_HOSTNAME", "sandbox.evernote.com") ) access_token_url = "https://%s/oauth" % ( settings.get("EVERNOTE_HOSTNAME", "sandbox.evernote.com") ) authorize_url = "https://%s/OAuth.action" % ( settings.get("EVERNOTE_HOSTNAME", "sandbox.evernote.com") ) def complete_login(self, request, app, token, response): token.expires_at = datetime.fromtimestamp( int(response["edam_expires"]) / 1000.0 ) extra_data = response return self.get_provider().sociallogin_from_response(request, extra_data) oauth_login = OAuthLoginView.adapter_view(EvernoteOAuthAdapter) oauth_callback = OAuthCallbackView.adapter_view(EvernoteOAuthAdapter) django-allauth-0.47.0/allauth/socialaccount/providers/exist/000077500000000000000000000000001415442050100241225ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/exist/__init__.py000066400000000000000000000000001415442050100262210ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/exist/provider.py000066400000000000000000000022001415442050100263200ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class ExistAccount(ProviderAccount): def get_profile_url(self): username = self.account.extra_data.get("username") return "https://exist.io/api/1/users/{}/profile/".format(username) def get_avatar_url(self): return self.account.extra_data.get("avatar") def to_str(self): name = super(ExistAccount, self).to_str() return self.account.extra_data.get("name", name) class ExistProvider(OAuth2Provider): id = "exist" name = "Exist.io" account_class = ExistAccount def extract_uid(self, data): return data.get("id") def extract_common_fields(self, data): extra_common = super(ExistProvider, self).extract_common_fields(data) extra_common.update( username=data.get("username"), first_name=data.get("first_name"), last_name=data.get("last_name"), ) return extra_common def get_default_scope(self): return ["read"] provider_classes = [ExistProvider] django-allauth-0.47.0/allauth/socialaccount/providers/exist/tests.py000066400000000000000000000022561415442050100256430ustar00rootroot00000000000000# -*- coding: utf-8 -*- from allauth.socialaccount.providers.exist.provider import ExistProvider from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase class ExistTests(OAuth2TestsMixin, TestCase): provider_id = ExistProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "id": 1, "username": "josh", "first_name": "Josh", "last_name": "Sharp", "bio": "I made this thing you're using.", "url": "http://hellocode.co/", "avatar": "https://exist.io/static/media/avatars/josh_2.png", "timezone": "Australia/Melbourne", "local_time": "2020-07-31T22:33:49.359+10:00", "private": false, "imperial_units": false, "imperial_distance": false, "imperial_weight": false, "imperial_energy": false, "imperial_liquid": false, "imperial_temperature": false, "attributes": [] } """, ) django-allauth-0.47.0/allauth/socialaccount/providers/exist/urls.py000066400000000000000000000002441415442050100254610ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import ExistProvider urlpatterns = default_urlpatterns(ExistProvider) django-allauth-0.47.0/allauth/socialaccount/providers/exist/views.py000066400000000000000000000015651415442050100256400ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import ExistProvider class ExistOAuth2Adapter(OAuth2Adapter): provider_id = ExistProvider.id access_token_url = "https://exist.io/oauth2/access_token" authorize_url = "https://exist.io/oauth2/authorize" profile_url = "https://exist.io/api/1/users/$self/profile/" def complete_login(self, request, app, token, **kwargs): headers = {"Authorization": "Bearer {0}".format(token.token)} resp = requests.get(self.profile_url, headers=headers) extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(ExistOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(ExistOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/facebook/000077500000000000000000000000001415442050100245375ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/facebook/__init__.py000066400000000000000000000000001415442050100266360ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/facebook/data/000077500000000000000000000000001415442050100254505ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/facebook/data/FacebookLocales.xml000066400000000000000000000311061415442050100312070ustar00rootroot00000000000000 Afrikaans FB af_ZA Arabic FB ar_AR Azerbaijani FB az_AZ Belarusian FB be_BY Bulgarian FB bg_BG Bengali FB bn_IN Bosnian FB bs_BA Catalan FB ca_ES Czech FB cs_CZ Welsh FB cy_GB Danish FB da_DK German FB de_DE Greek FB el_GR English (UK) FB en_GB English (Pirate) FB en_PI English (Upside Down) FB en_UD English (US) FB en_US Esperanto FB eo_EO Spanish (Spain) FB es_ES Spanish FB es_LA Estonian FB et_EE Basque FB eu_ES Persian FB fa_IR Leet Speak FB fb_LT Finnish FB fi_FI Faroese FB fo_FO French (Canada) FB fr_CA French (France) FB fr_FR Frisian FB fy_NL Irish FB ga_IE Galician FB gl_ES Hebrew FB he_IL Hindi FB hi_IN Croatian FB hr_HR Hungarian FB hu_HU Armenian FB hy_AM Indonesian FB id_ID Icelandic FB is_IS Italian FB it_IT Japanese FB ja_JP Georgian FB ka_GE Khmer FB km_KH Korean FB ko_KR Kurdish FB ku_TR Latin FB la_VA Lithuanian FB lt_LT Latvian FB lv_LV Macedonian FB mk_MK Malayalam FB ml_IN Malay FB ms_MY Norwegian (bokmal) FB nb_NO Nepali FB ne_NP Dutch FB nl_NL Norwegian (nynorsk) FB nn_NO Punjabi FB pa_IN Polish FB pl_PL Pashto FB ps_AF Portuguese (Brazil) FB pt_BR Portuguese (Portugal) FB pt_PT Romanian FB ro_RO Russian FB ru_RU Slovak FB sk_SK Slovenian FB sl_SI Albanian FB sq_AL Serbian FB sr_RS Swedish FB sv_SE Swahili FB sw_KE Tamil FB ta_IN Telugu FB te_IN Thai FB th_TH Filipino FB tl_PH Turkish FB tr_TR Ukrainian FB uk_UA Vietnamese FB vi_VN Simplified Chinese (China) FB zh_CN Traditional Chinese (Hong Kong) FB zh_HK Traditional Chinese (Taiwan) FB zh_TW django-allauth-0.47.0/allauth/socialaccount/providers/facebook/forms.py000066400000000000000000000001641415442050100262400ustar00rootroot00000000000000from django import forms class FacebookConnectForm(forms.Form): access_token = forms.CharField(required=True) django-allauth-0.47.0/allauth/socialaccount/providers/facebook/locale.py000066400000000000000000000045341415442050100263560ustar00rootroot00000000000000# Default locale mapping for the Facebook JS SDK # The list of supported locales is at # https://www.facebook.com/translations/FacebookLocales.xml import os from django.utils.translation import get_language, to_locale def _build_locale_table(filename_or_file): """ Parses the FacebookLocales.xml file and builds a dict relating every available language ('en, 'es, 'zh', ...) with a list of available regions for that language ('en' -> 'US', 'EN') and an (arbitrary) default region. """ # Require the XML parser module only if we want the default mapping from xml.dom.minidom import parse dom = parse(filename_or_file) reps = dom.getElementsByTagName("representation") locs = map(lambda r: r.childNodes[0].data, reps) locale_map = {} for loc in locs: lang, _, reg = loc.partition("_") lang_map = locale_map.setdefault(lang, {"regs": [], "default": reg}) lang_map["regs"].append(reg) # Default region overrides (arbitrary) locale_map["en"]["default"] = "US" # Special case: Use es_ES for Spain and es_LA for everything else locale_map["es"]["default"] = "LA" locale_map["zh"]["default"] = "CN" locale_map["fr"]["default"] = "FR" locale_map["pt"]["default"] = "PT" return locale_map def get_default_locale_callable(): """ Wrapper function so that the default mapping is only built when needed """ exec_dir = os.path.dirname(os.path.realpath(__file__)) xml_path = os.path.join(exec_dir, "data", "FacebookLocales.xml") fb_locales = _build_locale_table(xml_path) def default_locale(request): """ Guess an appropriate FB locale based on the active Django locale. If the active locale is available, it is returned. Otherwise, it tries to return another locale with the same language. If there isn't one avaible, 'en_US' is returned. """ chosen = "en_US" language = get_language() if language: locale = to_locale(language) lang, _, reg = locale.partition("_") lang_map = fb_locales.get(lang) if lang_map is not None: if reg in lang_map["regs"]: chosen = lang + "_" + reg else: chosen = lang + "_" + lang_map["default"] return chosen return default_locale django-allauth-0.47.0/allauth/socialaccount/providers/facebook/provider.py000066400000000000000000000166171415442050100267560ustar00rootroot00000000000000import json import string from urllib.parse import quote from django.conf import settings from django.core.exceptions import ImproperlyConfigured from django.middleware.csrf import get_token from django.template.loader import render_to_string from django.urls import reverse from django.utils.crypto import get_random_string from django.utils.html import escapejs, mark_safe from allauth.account.models import EmailAddress from allauth.socialaccount.app_settings import QUERY_EMAIL from allauth.socialaccount.providers.base import ( AuthAction, AuthProcess, ProviderAccount, ) from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider from allauth.utils import import_callable from .locale import get_default_locale_callable GRAPH_API_VERSION = ( getattr(settings, "SOCIALACCOUNT_PROVIDERS", {}) .get("facebook", {}) .get("VERSION", "v7.0") ) GRAPH_API_URL = "https://graph.facebook.com/" + GRAPH_API_VERSION NONCE_SESSION_KEY = "allauth_facebook_nonce" NONCE_LENGTH = 32 class FacebookAccount(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("link") def get_avatar_url(self): uid = self.account.uid # ask for a 600x600 pixel image. We might get smaller but # image will always be highest res possible and square return ( GRAPH_API_URL + "/%s/picture?type=square&height=600&width=600&return_ssl_resources=1" % uid ) # noqa def to_str(self): dflt = super(FacebookAccount, self).to_str() return self.account.extra_data.get("name", dflt) class FacebookProvider(OAuth2Provider): id = "facebook" name = "Facebook" account_class = FacebookAccount def __init__(self, request): self._locale_callable_cache = None super(FacebookProvider, self).__init__(request) def get_method(self): return self.get_settings().get("METHOD", "oauth2") def get_login_url(self, request, **kwargs): method = kwargs.pop("method", self.get_method()) if method == "js_sdk": next = "'%s'" % escapejs(kwargs.get("next") or "") process = "'%s'" % escapejs(kwargs.get("process") or AuthProcess.LOGIN) action = "'%s'" % escapejs(kwargs.get("action") or AuthAction.AUTHENTICATE) scope = "'%s'" % escapejs(kwargs.get("scope", "")) js = "allauth.facebook.login(%s, %s, %s, %s)" % ( next, action, process, scope, ) ret = "javascript:%s" % (quote(js),) elif method == "oauth2": ret = super(FacebookProvider, self).get_login_url(request, **kwargs) else: raise RuntimeError("Invalid method specified: %s" % method) return ret def _get_locale_callable(self): settings = self.get_settings() func = settings.get("LOCALE_FUNC") return import_callable(func) if func else get_default_locale_callable() def get_locale_for_request(self, request): if not self._locale_callable_cache: self._locale_callable_cache = self._get_locale_callable() return self._locale_callable_cache(request) def get_default_scope(self): scope = [] if QUERY_EMAIL: scope.append("email") return scope def get_fields(self): settings = self.get_settings() default_fields = [ "id", "email", "name", "first_name", "last_name", "verified", "locale", "timezone", "link", "gender", "updated_time", ] return settings.get("FIELDS", default_fields) def get_auth_params(self, request, action): ret = super(FacebookProvider, self).get_auth_params(request, action) if action == AuthAction.REAUTHENTICATE: ret["auth_type"] = "reauthenticate" elif action == AuthAction.REREQUEST: ret["auth_type"] = "rerequest" return ret def get_init_params(self, request, app): init_params = {"appId": app.client_id, "version": GRAPH_API_VERSION} settings = self.get_settings() init_params.update(settings.get("INIT_PARAMS", {})) return init_params def get_fb_login_options(self, request): ret = self.get_auth_params(request, "authenticate") ret["scope"] = ",".join(self.get_scope(request)) if ret.get("auth_type") == "reauthenticate": ret["auth_nonce"] = self.get_nonce(request, or_create=True) return ret def get_sdk_url(self, request): settings = self.get_settings() sdk_url = settings.get("SDK_URL", "//connect.facebook.net/{locale}/sdk.js") field_names = [ tup[1] for tup in string.Formatter().parse(sdk_url) if tup[1] is not None ] if "locale" in field_names: locale = self.get_locale_for_request(request) sdk_url = sdk_url.format(locale=locale) return sdk_url def media_js(self, request): # NOTE: Avoid loading models at top due to registry boot... from allauth.socialaccount.models import SocialApp try: app = self.get_app(request) except SocialApp.DoesNotExist: raise ImproperlyConfigured( "No Facebook app configured: please" " add a SocialApp using the Django" " admin" ) def abs_uri(name): return request.build_absolute_uri(reverse(name)) fb_data = { "appId": app.client_id, "version": GRAPH_API_VERSION, "sdkUrl": self.get_sdk_url(request), "initParams": self.get_init_params(request, app), "loginOptions": self.get_fb_login_options(request), "loginByTokenUrl": abs_uri("facebook_login_by_token"), "cancelUrl": abs_uri("socialaccount_login_cancelled"), "logoutUrl": abs_uri("account_logout"), "loginUrl": request.build_absolute_uri( self.get_login_url(request, method="oauth2") ), "errorUrl": abs_uri("socialaccount_login_error"), "csrfToken": get_token(request), } ctx = {"fb_data": mark_safe(json.dumps(fb_data))} return render_to_string("facebook/fbconnect.html", ctx, request=request) def get_nonce(self, request, or_create=False, pop=False): if pop: nonce = request.session.pop(NONCE_SESSION_KEY, None) else: nonce = request.session.get(NONCE_SESSION_KEY) if not nonce and or_create: nonce = get_random_string(NONCE_LENGTH) request.session[NONCE_SESSION_KEY] = nonce return nonce def extract_uid(self, data): return data["id"] def extract_common_fields(self, data): return dict( email=data.get("email"), username=data.get("username"), first_name=data.get("first_name"), last_name=data.get("last_name"), name=data.get("name"), ) def extract_email_addresses(self, data): ret = [] email = data.get("email") if email: # data['verified'] does not imply the email address is # verified. ret.append(EmailAddress(email=email, verified=False, primary=True)) return ret provider_classes = [FacebookProvider] django-allauth-0.47.0/allauth/socialaccount/providers/facebook/static/000077500000000000000000000000001415442050100260265ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/facebook/static/facebook/000077500000000000000000000000001415442050100275775ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/facebook/static/facebook/js/000077500000000000000000000000001415442050100302135ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/facebook/static/facebook/js/fbconnect.js000066400000000000000000000064401415442050100325160ustar00rootroot00000000000000/* global document, window, FB */ (function () { 'use strict' function postForm (action, data) { var f = document.createElement('form') f.method = 'POST' f.action = action for (var key in data) { var d = document.createElement('input') d.type = 'hidden' d.name = key d.value = data[key] f.appendChild(d) } document.body.appendChild(f) f.submit() } function setLocationHref (url) { if (typeof (url) === 'function') { // Deprecated -- instead, override // allauth.facebook.onLoginError et al directly. url() } else { window.location.href = url } } var allauth = window.allauth = window.allauth || {} var fbSettings = JSON.parse(document.getElementById('allauth-facebook-settings').innerHTML) var fbInitialized = false allauth.facebook = { init: function (opts) { this.opts = opts window.fbAsyncInit = function () { FB.init(opts.initParams) fbInitialized = true allauth.facebook.onInit() }; (function (d) { var js var id = 'facebook-jssdk' if (d.getElementById(id)) { return } js = d.createElement('script'); js.id = id; js.async = true js.src = opts.sdkUrl d.getElementsByTagName('head')[0].appendChild(js) }(document)) }, onInit: function () { }, login: function (nextUrl, action, process, scope) { var self = this if (!fbInitialized) { var url = this.opts.loginUrl + '?next=' + encodeURIComponent(nextUrl) + '&action=' + encodeURIComponent(action) + '&process=' + encodeURIComponent(process) + '&scope=' + encodeURIComponent(scope) setLocationHref(url) return } if (action === 'reauthenticate' || action === 'rerequest') { this.opts.loginOptions.auth_type = action } if (scope !== '') { this.opts.loginOptions.scope = scope } FB.login(function (response) { if (response.authResponse) { self.onLoginSuccess(response, nextUrl, process) } else if (response && response.status && ['not_authorized', 'unknown'].indexOf(response.status) > -1) { self.onLoginCanceled(response) } else { self.onLoginError(response) } }, self.opts.loginOptions) }, onLoginCanceled: function (/* response */) { setLocationHref(this.opts.cancelUrl) }, onLoginError: function (/* response */) { setLocationHref(this.opts.errorUrl) }, onLoginSuccess: function (response, nextUrl, process) { var data = { next: nextUrl || '', process: process, access_token: response.authResponse.accessToken, expires_in: response.authResponse.expiresIn, csrfmiddlewaretoken: this.opts.csrfToken } postForm(this.opts.loginByTokenUrl, data) }, logout: function (nextUrl) { var self = this if (!fbInitialized) { return } FB.logout(function (response) { self.onLogoutSuccess(response, nextUrl) }) }, onLogoutSuccess: function (response, nextUrl) { var data = { next: nextUrl || '', csrfmiddlewaretoken: this.opts.csrfToken } postForm(this.opts.logoutUrl, data) } } allauth.facebook.init(fbSettings) })() django-allauth-0.47.0/allauth/socialaccount/providers/facebook/templates/000077500000000000000000000000001415442050100265355ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/facebook/templates/facebook/000077500000000000000000000000001415442050100303065ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/facebook/templates/facebook/fbconnect.html000066400000000000000000000003321415442050100331330ustar00rootroot00000000000000{% load static %}
django-allauth-0.47.0/allauth/socialaccount/providers/facebook/tests.py000066400000000000000000000116321415442050100262560ustar00rootroot00000000000000import json from django.test.client import RequestFactory from django.test.utils import override_settings from django.urls import reverse from allauth.account import app_settings as account_settings from allauth.account.models import EmailAddress from allauth.socialaccount import providers from allauth.socialaccount.models import SocialAccount from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase, patch from allauth.utils import get_user_model from .provider import FacebookProvider @override_settings( SOCIALACCOUNT_AUTO_SIGNUP=True, ACCOUNT_SIGNUP_FORM_CLASS=None, LOGIN_REDIRECT_URL="/accounts/profile/", ACCOUNT_EMAIL_VERIFICATION=account_settings.EmailVerificationMethod.NONE, SOCIALACCOUNT_PROVIDERS={"facebook": {"AUTH_PARAMS": {}, "VERIFIED_EMAIL": False}}, ) class FacebookTests(OAuth2TestsMixin, TestCase): provider_id = FacebookProvider.id facebook_data = """ { "id": "630595557", "name": "Raymond Penners", "first_name": "Raymond", "last_name": "Penners", "email": "raymond.penners@example.com", "link": "https://www.facebook.com/raymond.penners", "username": "raymond.penners", "birthday": "07/17/1973", "work": [ { "employer": { "id": "204953799537777", "name": "IntenCT" } } ], "timezone": 1, "locale": "nl_NL", "verified": true, "updated_time": "2012-11-30T20:40:33+0000" }""" def get_mocked_response(self, data=None): if data is None: data = self.facebook_data return MockedResponse(200, data) def test_username_conflict(self): User = get_user_model() User.objects.create(username="raymond.penners") self.login(self.get_mocked_response()) socialaccount = SocialAccount.objects.get(uid="630595557") self.assertEqual(socialaccount.user.username, "raymond") def test_username_based_on_provider(self): self.login(self.get_mocked_response()) socialaccount = SocialAccount.objects.get(uid="630595557") self.assertEqual(socialaccount.user.username, "raymond.penners") def test_username_based_on_provider_with_simple_name(self): data = '{"id": "1234567", "name": "Harvey McGillicuddy"}' self.login(self.get_mocked_response(data=data)) socialaccount = SocialAccount.objects.get(uid="1234567") self.assertEqual(socialaccount.user.username, "harvey") def test_media_js(self): provider = providers.registry.by_id(FacebookProvider.id) request = RequestFactory().get(reverse("account_login")) request.session = {} script = provider.media_js(request) self.assertTrue('"appId": "app123id"' in script) def test_login_by_token(self): resp = self.client.get(reverse("account_login")) with patch( "allauth.socialaccount.providers.facebook.views.requests" ) as requests_mock: mocks = [self.get_mocked_response().json()] requests_mock.get.return_value.json = lambda: mocks.pop() resp = self.client.post( reverse("facebook_login_by_token"), data={"access_token": "dummy"}, ) self.assertRedirects( resp, "/accounts/profile/", fetch_redirect_response=False ) @override_settings( SOCIALACCOUNT_PROVIDERS={ "facebook": { "AUTH_PARAMS": {"auth_type": "reauthenticate"}, "VERIFIED_EMAIL": False, } } ) def test_login_by_token_reauthenticate(self): resp = self.client.get(reverse("account_login")) nonce = json.loads(resp.context["fb_data"])["loginOptions"]["auth_nonce"] with patch( "allauth.socialaccount.providers.facebook.views.requests" ) as requests_mock: mocks = [self.get_mocked_response().json(), {"auth_nonce": nonce}] requests_mock.get.return_value.json = lambda: mocks.pop() resp = self.client.post( reverse("facebook_login_by_token"), data={"access_token": "dummy"}, ) self.assertRedirects( resp, "/accounts/profile/", fetch_redirect_response=False ) @override_settings(SOCIALACCOUNT_PROVIDERS={"facebook": {"VERIFIED_EMAIL": True}}) def test_login_verified(self): emailaddress = self._login_verified() self.assertTrue(emailaddress.verified) def test_login_unverified(self): emailaddress = self._login_verified() self.assertFalse(emailaddress.verified) def _login_verified(self): self.login(self.get_mocked_response()) return EmailAddress.objects.get(email="raymond.penners@example.com") django-allauth-0.47.0/allauth/socialaccount/providers/facebook/urls.py000066400000000000000000000005501415442050100260760ustar00rootroot00000000000000from django.urls import path from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from . import views from .provider import FacebookProvider urlpatterns = default_urlpatterns(FacebookProvider) urlpatterns += [ path( "facebook/login/token/", views.login_by_token, name="facebook_login_by_token", ), ] django-allauth-0.47.0/allauth/socialaccount/providers/facebook/views.py000066400000000000000000000112341415442050100262470ustar00rootroot00000000000000import hashlib import hmac import logging import requests from datetime import timedelta from django.utils import timezone from allauth.socialaccount import app_settings, providers from allauth.socialaccount.helpers import ( complete_social_login, render_authentication_error, ) from allauth.socialaccount.models import SocialLogin, SocialToken from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .forms import FacebookConnectForm from .provider import GRAPH_API_URL, GRAPH_API_VERSION, FacebookProvider logger = logging.getLogger(__name__) def compute_appsecret_proof(app, token): # Generate an appsecret_proof parameter to secure the Graph API call # see https://developers.facebook.com/docs/graph-api/securing-requests msg = token.token.encode("utf-8") key = app.secret.encode("utf-8") appsecret_proof = hmac.new(key, msg, digestmod=hashlib.sha256).hexdigest() return appsecret_proof def fb_complete_login(request, app, token): provider = providers.registry.by_id(FacebookProvider.id, request) resp = requests.get( GRAPH_API_URL + "/me", params={ "fields": ",".join(provider.get_fields()), "access_token": token.token, "appsecret_proof": compute_appsecret_proof(app, token), }, ) resp.raise_for_status() extra_data = resp.json() login = provider.sociallogin_from_response(request, extra_data) return login class FacebookOAuth2Adapter(OAuth2Adapter): provider_id = FacebookProvider.id provider_default_auth_url = "https://www.facebook.com/{}/dialog/oauth".format( GRAPH_API_VERSION ) settings = app_settings.PROVIDERS.get(provider_id, {}) scope_delimiter = "," authorize_url = settings.get("AUTHORIZE_URL", provider_default_auth_url) access_token_url = GRAPH_API_URL + "/oauth/access_token" expires_in_key = "expires_in" def complete_login(self, request, app, access_token, **kwargs): return fb_complete_login(request, app, access_token) oauth2_login = OAuth2LoginView.adapter_view(FacebookOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(FacebookOAuth2Adapter) def login_by_token(request): ret = None auth_exception = None if request.method == "POST": form = FacebookConnectForm(request.POST) if form.is_valid(): try: provider = providers.registry.by_id(FacebookProvider.id, request) login_options = provider.get_fb_login_options(request) app = provider.get_app(request) access_token = form.cleaned_data["access_token"] expires_at = None if login_options.get("auth_type") == "reauthenticate": info = requests.get( GRAPH_API_URL + "/oauth/access_token_info", params={ "client_id": app.client_id, "access_token": access_token, }, ).json() nonce = provider.get_nonce(request, pop=True) ok = nonce and nonce == info.get("auth_nonce") else: ok = True if ok and provider.get_settings().get("EXCHANGE_TOKEN"): resp = requests.get( GRAPH_API_URL + "/oauth/access_token", params={ "grant_type": "fb_exchange_token", "client_id": app.client_id, "client_secret": app.secret, "fb_exchange_token": access_token, }, ).json() access_token = resp["access_token"] expires_in = resp.get("expires_in") if expires_in: expires_at = timezone.now() + timedelta(seconds=int(expires_in)) if ok: token = SocialToken( app=app, token=access_token, expires_at=expires_at ) login = fb_complete_login(request, app, token) login.token = token login.state = SocialLogin.state_from_request(request) ret = complete_social_login(request, login) except requests.RequestException as e: logger.exception("Error accessing FB user profile") auth_exception = e if not ret: ret = render_authentication_error( request, FacebookProvider.id, exception=auth_exception ) return ret django-allauth-0.47.0/allauth/socialaccount/providers/feedly/000077500000000000000000000000001415442050100242365ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/feedly/__init__.py000066400000000000000000000000001415442050100263350ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/feedly/provider.py000066400000000000000000000021261415442050100264430ustar00rootroot00000000000000from __future__ import unicode_literals from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class FeedlyAccount(ProviderAccount): def get_avatar_url(self): return self.account.extra_data.get("picture") def to_str(self): name = "{0} {1}".format( self.account.extra_data.get("givenName", ""), self.account.extra_data.get("familyName", ""), ) if name.strip() != "": return name return super(FeedlyAccount, self).to_str() class FeedlyProvider(OAuth2Provider): id = str("feedly") name = "Feedly" account_class = FeedlyAccount def get_default_scope(self): return ["https://cloud.feedly.com/subscriptions"] def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): return dict( email=data.get("email"), last_name=data.get("familyName"), first_name=data.get("givenName"), ) provider_classes = [FeedlyProvider] django-allauth-0.47.0/allauth/socialaccount/providers/feedly/tests.py000066400000000000000000000013251415442050100257530ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import FeedlyProvider class FeedlyTests(OAuth2TestsMixin, TestCase): provider_id = FeedlyProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "id": "c805fcbf-3acf-4302-a97e-d82f9d7c897f", "email": "jim.smith@example.com", "givenName": "Jim", "familyName": "Smith", "picture": "https://www.google.com/profile_images/1771656873/bigger.jpg", "gender": "male", "locale": "en", "reader": "9080770707070700", "google": "115562565652656565656", "twitter": "jimsmith", "facebook": "", "wave": "2013.7" }""", ) django-allauth-0.47.0/allauth/socialaccount/providers/feedly/urls.py000066400000000000000000000002461415442050100255770ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import FeedlyProvider urlpatterns = default_urlpatterns(FeedlyProvider) django-allauth-0.47.0/allauth/socialaccount/providers/feedly/views.py000066400000000000000000000020211415442050100257400ustar00rootroot00000000000000from __future__ import unicode_literals import requests from allauth.socialaccount import app_settings from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import FeedlyProvider class FeedlyOAuth2Adapter(OAuth2Adapter): provider_id = FeedlyProvider.id host = app_settings.PROVIDERS.get(provider_id, {}).get("HOST", "cloud.feedly.com") access_token_url = "https://%s/v3/auth/token" % host authorize_url = "https://%s/v3/auth/auth" % host profile_url = "https://%s/v3/profile" % host def complete_login(self, request, app, token, **kwargs): headers = {"Authorization": "OAuth {0}".format(token.token)} resp = requests.get(self.profile_url, headers=headers) extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(FeedlyOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(FeedlyOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/feishu/000077500000000000000000000000001415442050100242515ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/feishu/__init__.py000066400000000000000000000000301415442050100263530ustar00rootroot00000000000000# -*- coding: utf-8 -*- django-allauth-0.47.0/allauth/socialaccount/providers/feishu/client.py000066400000000000000000000047241415442050100261100ustar00rootroot00000000000000# -*- coding: utf-8 -*- import json import requests from collections import OrderedDict from django.utils.http import urlencode from allauth.socialaccount.providers.oauth2.client import ( OAuth2Client, OAuth2Error, ) class FeishuOAuth2Client(OAuth2Client): app_access_token_url = ( "https://open.feishu.cn/open-apis/auth/v3/app_access_token/internal/" ) def get_redirect_url(self, authorization_url, extra_params): params = { "app_id": self.consumer_key, "redirect_uri": self.callback_url, "scope": self.scope, "response_type": "code", } if self.state: params["state"] = self.state params.update(extra_params) sorted_params = OrderedDict() for param in sorted(params): sorted_params[param] = params[param] return "%s?%s" % (authorization_url, urlencode(sorted_params)) def app_access_token(self): data = { "app_id": self.consumer_key, "app_secret": self.consumer_secret, } self._strip_empty_keys(data) url = self.app_access_token_url # TODO: Proper exception handling resp = requests.request("POST", url, data=data) resp.raise_for_status() access_token = resp.json() if not access_token or "app_access_token" not in access_token: raise OAuth2Error("Error retrieving app access token: %s" % resp.content) return access_token["app_access_token"] def get_access_token(self, code): data = { "grant_type": "authorization_code", "code": code, "app_access_token": self.app_access_token(), } params = None self._strip_empty_keys(data) url = self.access_token_url if self.access_token_method == "GET": params = data data = None # TODO: Proper exception handling resp = requests.request( self.access_token_method, url, params=params, data=json.dumps(data), headers={"Content-Type": "application/json"}, ) resp.raise_for_status() access_token = resp.json() if ( not access_token or "data" not in access_token or "access_token" not in access_token["data"] ): raise OAuth2Error("Error retrieving access token: %s" % resp.content) return access_token["data"] django-allauth-0.47.0/allauth/socialaccount/providers/feishu/provider.py000066400000000000000000000013341415442050100264560ustar00rootroot00000000000000# -*- coding: utf-8 -*- from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class FeishuAccount(ProviderAccount): def get_avatar_url(self): return self.account.extra_data.get("avatar_big") def to_str(self): return self.account.extra_data.get("name", super(FeishuAccount, self).to_str()) class FeishuProvider(OAuth2Provider): id = "feishu" name = "feishu" account_class = FeishuAccount def extract_uid(self, data): return data["open_id"] def extract_common_fields(self, data): return dict(username=data.get("name"), name=data.get("name")) provider_classes = [FeishuProvider] django-allauth-0.47.0/allauth/socialaccount/providers/feishu/tests.py000066400000000000000000000032431415442050100257670ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals from allauth.socialaccount.providers import registry from allauth.socialaccount.tests import create_oauth2_tests from allauth.tests import MockedResponse from .provider import FeishuProvider class FeishuTests(create_oauth2_tests(registry.by_id(FeishuProvider.id))): def get_mocked_response(self): return [ MockedResponse( 0, """ {"data": {"access_token": "testac"}} """, ), MockedResponse( 0, """ { "code": 0, "data": { "access_token": "u-6U1SbDiM6XIH2DcTCPyeub", "avatar_url": "www.feishu.cn/avatar/icon", "avatar_thumb": "www.feishu.cn/avatar/icon_thumb", "avatar_middle": "www.feishu.cn/avatar/icon_middle", "avatar_big": "www.feishu.cn/avatar/icon_big", "expires_in": 7140, "name": "zhangsan", "en_name": "Three Zhang", "open_id": "ou-caecc734c2e3328a62489fe0648c4b98779515d3", "tenant_key": "736588c92lxf175d", "refresh_expires_in": 2591940, "refresh_token": "ur-t9HHgRCjMqGqIU9v05Zhos", "token_type": "Bearer" } } """, ), ] def get_login_response_json(self, with_refresh_token=True): return """{"app_access_token":"testac"}""" django-allauth-0.47.0/allauth/socialaccount/providers/feishu/urls.py000066400000000000000000000002771415442050100256160ustar00rootroot00000000000000# -*- coding: utf-8 -*- from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import FeishuProvider urlpatterns = default_urlpatterns(FeishuProvider) django-allauth-0.47.0/allauth/socialaccount/providers/feishu/views.py000066400000000000000000000051431415442050100257630ustar00rootroot00000000000000# -*- coding: utf-8 -*- import requests from django.urls import reverse from allauth.account import app_settings from allauth.socialaccount.providers.oauth2.client import OAuth2Error from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from allauth.utils import build_absolute_uri from .client import FeishuOAuth2Client from .provider import FeishuProvider class FeishuOAuth2Adapter(OAuth2Adapter): provider_id = FeishuProvider.id authorization_url = "https://open.feishu.cn/open-apis/authen/v1/index" access_token_url = "https://open.feishu.cn/open-apis/authen/v1/access_token" app_access_token_url = ( "https://open.feishu.cn/open-apis/auth/v3/app_access_token/internal/" ) user_info_url = "https://open.feishu.cn/open-apis/authen/v1/user_info" @property def authorize_url(self): settings = self.get_provider().get_settings() url = settings.get("AUTHORIZE_URL", self.authorization_url) return url def complete_login(self, request, app, token, **kwargs): resp = requests.get( self.user_info_url, headers={ "Content-Type": "application/json", "Authorization": "Bearer " + token.token, }, ) resp.raise_for_status() extra_data = resp.json() if extra_data["code"] != 0: raise OAuth2Error("Error retrieving code: %s" % resp.content) extra_data = extra_data["data"] return self.get_provider().sociallogin_from_response(request, extra_data) class FeishuOAuth2ClientMixin(object): def get_client(self, request, app): callback_url = reverse(self.adapter.provider_id + "_callback") protocol = ( self.adapter.redirect_uri_protocol or app_settings.DEFAULT_HTTP_PROTOCOL ) callback_url = build_absolute_uri(request, callback_url, protocol=protocol) provider = self.adapter.get_provider() scope = provider.get_scope(request) client = FeishuOAuth2Client( request, app.client_id, app.secret, self.adapter.access_token_method, self.adapter.access_token_url, callback_url, scope, ) return client class FeishuOAuth2LoginView(FeishuOAuth2ClientMixin, OAuth2LoginView): pass class FeishuOAuth2CallbackView(FeishuOAuth2ClientMixin, OAuth2CallbackView): pass oauth2_login = FeishuOAuth2LoginView.adapter_view(FeishuOAuth2Adapter) oauth2_callback = FeishuOAuth2CallbackView.adapter_view(FeishuOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/figma/000077500000000000000000000000001415442050100240515ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/figma/__init__.py000066400000000000000000000000001415442050100261500ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/figma/provider.py000066400000000000000000000017601415442050100262610ustar00rootroot00000000000000from allauth.account.models import EmailAddress from allauth.socialaccount import providers from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class FigmaAccount(ProviderAccount): def to_str(self): return self.account.extra_data.get("handle", "") def get_avatar_url(self): return self.account.extra_data.get("img_url", "") class FigmaProvider(OAuth2Provider): id = "figma" name = "Figma" account_class = FigmaAccount def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): return { "email": data.get("email"), "name": data.get("handle"), } def extract_email_addresses(self, data): email = EmailAddress( email=data.get("email"), primary=True, verified=False, ) return [email] providers.registry.register(FigmaProvider) django-allauth-0.47.0/allauth/socialaccount/providers/figma/tests.py000066400000000000000000000011021415442050100255570ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import FigmaProvider class FigmaTests(OAuth2TestsMixin, TestCase): provider_id = FigmaProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "id": "2600", "email": "johndoe@example.com", "handle": "John Doe", "img_url": "https://www.example.com/image.png" } """, ) django-allauth-0.47.0/allauth/socialaccount/providers/figma/urls.py000066400000000000000000000002441415442050100254100ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import FigmaProvider urlpatterns = default_urlpatterns(FigmaProvider) django-allauth-0.47.0/allauth/socialaccount/providers/figma/views.py000066400000000000000000000016141415442050100255620ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import FigmaProvider class FigmaOAuth2Adapter(OAuth2Adapter): provider_id = FigmaProvider.id authorize_url = "https://www.figma.com/oauth" access_token_url = "https://www.figma.com/api/oauth/token" userinfo_url = "https://api.figma.com/v1/me" def complete_login(self, request, app, token, **kwargs): resp = requests.get( self.userinfo_url, headers={"Authorization": "Bearer {0}".format(token.token)}, ) resp.raise_for_status() extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(FigmaOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(FigmaOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/fivehundredpx/000077500000000000000000000000001415442050100256415ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/fivehundredpx/__init__.py000066400000000000000000000000001415442050100277400ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/fivehundredpx/models.py000066400000000000000000000000001415442050100274640ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/fivehundredpx/provider.py000066400000000000000000000021561415442050100300510ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth.provider import OAuthProvider class FiveHundredPxAccount(ProviderAccount): def get_profile_url(self): return "https://500px.com/%s" % self.account.extra_data.get("username") def get_avatar_url(self): return self.account.extra_data.get("userpic_url") def to_str(self): dflt = super(FiveHundredPxAccount, self).to_str() name = self.account.extra_data.get("fullname", dflt) return name class FiveHundredPxProvider(OAuthProvider): id = "500px" name = "500px" package = "allauth.socialaccount.providers.fivehundredpx" account_class = FiveHundredPxAccount def get_default_scope(self): return [] def extract_uid(self, data): return data["id"] def extract_common_fields(self, data): return dict( username=data.get("username"), email=data.get("email"), first_name=data.get("firstname"), last_name=data.get("lastname"), ) provider_classes = [FiveHundredPxProvider] django-allauth-0.47.0/allauth/socialaccount/providers/fivehundredpx/tests.py000066400000000000000000000063641415442050100273660ustar00rootroot00000000000000# -*- coding: utf-8 -*- from allauth.socialaccount.tests import OAuthTestsMixin from allauth.tests import MockedResponse, TestCase from .provider import FiveHundredPxProvider class FiveHundredPxTests(OAuthTestsMixin, TestCase): provider_id = FiveHundredPxProvider.id def get_mocked_response(self): return [ MockedResponse( 200, """{ "user": { "id": 5751454, "username": "testuser", "firstname": "Test", "lastname": "User", "birthday": null, "sex": 0, "city": "San Francisco", "state": "California", "country": "United States", "registration_date": "2015-12-12T03:20:31-05:00", "about": "About me.", "usertype": 0, "fotomoto_on": true, "locale": "en", "show_nude": false, "allow_sale_requests": 1, "fullname": "Test User", "userpic_url": "https://pacdn.500px.org/10599609/8e20991262c468a866918dcbe2f7e9a30e2c2c9c/1.jpg?1", "userpic_https_url": "https://pacdn.500px.org/10599609/8e20991262c468a866918dcbe2f7e9a30e2c2c9c/1.jpg?1", "cover_url": "https://pacdn.500px.org/10599609/8e20991262c468a866918dcbe2f7e9a30e2c2c9c/cover_2048.jpg?7", "upgrade_status": 2, "store_on": true, "photos_count": 68, "galleries_count": 2, "affection": 1888, "in_favorites_count": 340, "friends_count": 181, "followers_count": 150, "analytics_code": null, "invite_pending": false, "invite_accepted": false, "email": "test@example.com", "shadow_email": "test@example.com", "upload_limit": null, "upload_limit_expiry": "2016-12-01T13:33:55-05:00", "upgrade_type": 2, "upgrade_status_expiry": "2017-05-27", "auth": { "facebook": 0, "twitter": 0, "google_oauth2": 0 }, "presubmit_for_licensing": null, "avatars": { "default": { "http": "https://pacdn.500px.org/10599609/8e20991262c468a866918dcbe2f7e9a30e2c2c9c/1.jpg?1", "https": "https://pacdn.500px.org/10599609/8e20991262c468a866918dcbe2f7e9a30e2c2c9c/1.jpg?1" }, "large": { "http": "https://pacdn.500px.org/10599609/8e20991262c468a866918dcbe2f7e9a30e2c2c9c/2.jpg?1", "https": "https://pacdn.500px.org/10599609/8e20991262c468a866918dcbe2f7e9a30e2c2c9c/2.jpg?1" }, "small": { "http": "https://pacdn.500px.org/10599609/8e20991262c468a866918dcbe2f7e9a30e2c2c9c/1.jpg?1", "https": "https://pacdn.500px.org/10599609/8e20991262c468a866918dcbe2f7e9a30e2c2c9c/1.jpg?1" }, "tiny": { "http": "https://pacdn.500px.org/10599609/8e20991262c468a866918dcbe2f7e9a30e2c2c9c/4.jpg?1", "https": "https://pacdn.500px.org/10599609/8e20991262c468a866918dcbe2f7e9a30e2c2c9c/4.jpg?1" } } } }""", ) ] # noqa django-allauth-0.47.0/allauth/socialaccount/providers/fivehundredpx/urls.py000066400000000000000000000002631415442050100272010ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth.urls import default_urlpatterns from .provider import FiveHundredPxProvider urlpatterns = default_urlpatterns(FiveHundredPxProvider) django-allauth-0.47.0/allauth/socialaccount/providers/fivehundredpx/views.py000066400000000000000000000022421415442050100273500ustar00rootroot00000000000000import json from allauth.socialaccount.providers.oauth.client import OAuth from allauth.socialaccount.providers.oauth.views import ( OAuthAdapter, OAuthCallbackView, OAuthLoginView, ) from .provider import FiveHundredPxProvider API_BASE = "https://api.500px.com/v1" class FiveHundredPxAPI(OAuth): """ Verifying 500px credentials """ url = API_BASE + "/users" def get_user_info(self): return json.loads(self.query(self.url))["user"] class FiveHundredPxOAuthAdapter(OAuthAdapter): provider_id = FiveHundredPxProvider.id request_token_url = API_BASE + "/oauth/request_token" access_token_url = API_BASE + "/oauth/access_token" authorize_url = API_BASE + "/oauth/authorize" def complete_login(self, request, app, token, response): client = FiveHundredPxAPI( request, app.client_id, app.secret, self.request_token_url ) extra_data = client.get_user_info() return self.get_provider().sociallogin_from_response(request, extra_data) oauth_login = OAuthLoginView.adapter_view(FiveHundredPxOAuthAdapter) oauth_callback = OAuthCallbackView.adapter_view(FiveHundredPxOAuthAdapter) django-allauth-0.47.0/allauth/socialaccount/providers/flickr/000077500000000000000000000000001415442050100242405ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/flickr/__init__.py000066400000000000000000000000001415442050100263370ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/flickr/provider.py000066400000000000000000000037371415442050100264560ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth.provider import OAuthProvider class FlickrAccount(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("person").get("profileurl").get("_content") def get_avatar_url(self): return self.account.extra_data.get("picture-url") def to_str(self): dflt = super(FlickrAccount, self).to_str() # Try to use name if it exists. If there is no name, the Flickr API # returns an empty stirng. name = ( self.account.extra_data.get("person").get("realname").get("_content", None) ) if name: return name # Default to username if name does not exist. return ( self.account.extra_data.get("person").get("username").get("_content", dflt) ) class FlickrProvider(OAuthProvider): id = "flickr" name = "Flickr" account_class = FlickrAccount def get_default_scope(self): scope = [] return scope def get_auth_params(self, request, action): ret = super(FlickrProvider, self).get_auth_params(request, action) if "perms" not in ret: ret["perms"] = "read" return ret def get_profile_fields(self): default_fields = [ "id", "first-name", "last-name", "email-address", "picture-url", "public-profile-url", ] fields = self.get_settings().get("PROFILE_FIELDS", default_fields) return fields def extract_uid(self, data): return data["person"]["nsid"] def extract_common_fields(self, data): person = data.get("person", {}) name = person.get("realname", {}).get("_content") username = person.get("username", {}).get("_content") return dict(email=data.get("email-address"), name=name, username=username) provider_classes = [FlickrProvider] django-allauth-0.47.0/allauth/socialaccount/providers/flickr/tests.py000066400000000000000000000066771415442050100257740ustar00rootroot00000000000000# -*- coding: utf-8 -*- from allauth.socialaccount.tests import OAuthTestsMixin from allauth.tests import MockedResponse, TestCase from .provider import FlickrProvider class FlickrTests(OAuthTestsMixin, TestCase): provider_id = FlickrProvider.id def get_mocked_response(self): # return [ MockedResponse( 200, r""" {"stat": "ok", "user": { "username": { "_content": "pennersr"}, "id": "12345678@N00"}} """, ), # noqa MockedResponse( 200, r""" {"person": {"username": {"_content": "pennersr"}, "photosurl": {"_content": "http://www.flickr.com/photos/12345678@N00/"}, "nsid": "12345678@N00", "path_alias": null, "photos": {"count": {"_content": 0}, "firstdatetaken": {"_content": null}, "views": {"_content": "28"}, "firstdate": {"_content": null}}, "iconserver": "0", "description": {"_content": ""}, "mobileurl": {"_content": "http://m.flickr.com/photostream.gne?id=6294613"}, "profileurl": { "_content": "http://www.flickr.com/people/12345678@N00/"}, "mbox_sha1sum": {"_content": "5e5b359c123e54f95236209c8808d607a5cdd21e"}, "ispro": 0, "location": {"_content": ""}, "id": "12345678@N00", "realname": {"_content": "raymond penners"}, "iconfarm": 0}, "stat": "ok"} """, ), ] # noqa def test_login(self): account = super(FlickrTests, self).test_login() f_account = account.get_provider_account() self.assertEqual(account.user.first_name, "raymond") self.assertEqual(account.user.last_name, "penners") self.assertEqual( f_account.get_profile_url(), "http://www.flickr.com/people/12345678@N00/", ) self.assertEqual(f_account.to_str(), "raymond penners") class FlickrWithoutRealNameTests(OAuthTestsMixin, TestCase): """Separate test for Flickr accounts without real names""" provider_id = FlickrProvider.id def get_mocked_response(self): # return [ MockedResponse( 200, r""" {"stat": "ok", "user": { "username": { "_content": "pennersr"}, "id": "12345678@N00"}} """, ), # noqa MockedResponse( 200, r""" {"person": {"username": {"_content": "pennersr"}, "photosurl": {"_content": "http://www.flickr.com/photos/12345678@N00/"}, "nsid": "12345678@N00", "path_alias": null, "photos": {"count": {"_content": 0}, "firstdatetaken": {"_content": null}, "views": {"_content": "28"}, "firstdate": {"_content": null}}, "iconserver": "0", "description": {"_content": ""}, "mobileurl": {"_content": "http://m.flickr.com/photostream.gne?id=6294613"}, "profileurl": { "_content": "http://www.flickr.com/people/12345678@N00/"}, "mbox_sha1sum": {"_content": "5e5b359c123e54f95236209c8808d607a5cdd21e"}, "ispro": 0, "location": {"_content": ""}, "id": "12345678@N00", "realname": {"_content": ""}, "iconfarm": 0}, "stat": "ok"} """, ), ] # noqa def test_login(self): account = super(FlickrWithoutRealNameTests, self).test_login() f_account = account.get_provider_account() self.assertEqual(account.user.first_name, "") self.assertEqual(account.user.last_name, "") self.assertEqual( f_account.get_profile_url(), "http://www.flickr.com/people/12345678@N00/", ) self.assertEqual(f_account.to_str(), "pennersr") django-allauth-0.47.0/allauth/socialaccount/providers/flickr/urls.py000066400000000000000000000002451415442050100256000ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth.urls import default_urlpatterns from .provider import FlickrProvider urlpatterns = default_urlpatterns(FlickrProvider) django-allauth-0.47.0/allauth/socialaccount/providers/flickr/views.py000066400000000000000000000027661415442050100257620ustar00rootroot00000000000000import json from django.utils.http import urlencode from allauth.socialaccount.providers.oauth.client import OAuth from allauth.socialaccount.providers.oauth.views import ( OAuthAdapter, OAuthCallbackView, OAuthLoginView, ) from .provider import FlickrProvider class FlickrAPI(OAuth): api_url = "https://api.flickr.com/services/rest" def get_user_info(self): default_params = {"nojsoncallback": "1", "format": "json"} p = dict({"method": "flickr.test.login"}, **default_params) u = json.loads(self.query(self.api_url + "?" + urlencode(p))) p = dict( {"method": "flickr.people.getInfo", "user_id": u["user"]["id"]}, **default_params, ) user = json.loads(self.query(self.api_url + "?" + urlencode(p))) return user class FlickrOAuthAdapter(OAuthAdapter): provider_id = FlickrProvider.id request_token_url = "http://www.flickr.com/services/oauth/request_token" access_token_url = "http://www.flickr.com/services/oauth/access_token" authorize_url = "http://www.flickr.com/services/oauth/authorize" def complete_login(self, request, app, token, response): client = FlickrAPI(request, app.client_id, app.secret, self.request_token_url) extra_data = client.get_user_info() return self.get_provider().sociallogin_from_response(request, extra_data) oauth_login = OAuthLoginView.adapter_view(FlickrOAuthAdapter) oauth_callback = OAuthCallbackView.adapter_view(FlickrOAuthAdapter) django-allauth-0.47.0/allauth/socialaccount/providers/foursquare/000077500000000000000000000000001415442050100251625ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/foursquare/__init__.py000066400000000000000000000000001415442050100272610ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/foursquare/provider.py000066400000000000000000000017071415442050100273730ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class FoursquareAccount(ProviderAccount): def get_profile_url(self): return "https://foursquare.com/user/" + self.account.extra_data.get("id") def get_avatar_url(self): return self.account.extra_data.get("photo") def to_str(self): dflt = super(FoursquareAccount, self).to_str() return self.account.extra_data.get("name", dflt) class FoursquareProvider(OAuth2Provider): id = "foursquare" name = "Foursquare" account_class = FoursquareAccount def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): return dict( first_name=data.get("firstname"), last_name=data.get("lastname"), email=data.get("contact").get("email"), ) provider_classes = [FoursquareProvider] django-allauth-0.47.0/allauth/socialaccount/providers/foursquare/tests.py000066400000000000000000000047401415442050100267030ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import FoursquareProvider class FoursquareTests(OAuth2TestsMixin, TestCase): provider_id = FoursquareProvider.id def get_mocked_response(self): return MockedResponse( 200, """ {"notifications": [{"item": {"unreadCount": 0}, "type": "notificationTray"}], "meta": {"code": 200}, "response": { "user": { "photo": { "prefix": "https://irs0.4sqi.net/img/user/", "suffix": "/blank_boy.png"}, "pings": false, "homeCity": "Athens, ESYE31", "id": "76077726", "badges": {"count": 0, "items": []}, "referralId": "u-76077726", "friends": { "count": 0, "groups": [{"count": 0, "items": [], "type": "friends", "name": "Mutual friends"}, {"count": 0, "items": [], "type": "others", "name": "Other friends"}] }, "createdAt": 1389624445, "tips": {"count": 0}, "type": "user", "bio": "", "relationship": "self", "lists": { "count": 1, "groups": [{"count": 1, "items": [{"description": "", "collaborative": false, "url": "/user/76077726/list/todos", "editable": false, "listItems": {"count": 0}, "id": "76077726/todos", "followers": {"count": 0}, "user": {"gender": "male", "firstName": "\u03a1\u03c9\u03bc\u03b1\u03bd\u03cc\u03c2", "relationship": "self", "photo": {"prefix": "https://irs0.4sqi.net/img/user/", "suffix": "/blank_boy.png"}, "lastName": "\u03a4\u03c3\u03bf\u03c5\u03c1\u03bf\u03c0\u03bb\u03ae\u03c2", "id": "76077726"}, "public": false, "canonicalUrl": "https://foursquare.com/user/76077726/list/todos", "name": "My to-do list"}], "type": "created"}, {"count": 0, "items": [], "type": "followed"}] }, "photos": {"count": 0, "items": []}, "checkinPings": "off", "scores": {"max": 0, "checkinsCount": 0, "goal": 50, "recent": 0}, "checkins": {"count": 0, "items": []}, "firstName": "\u03a1\u03c9\u03bc\u03b1\u03bd\u03cc\u03c2", "gender": "male", "contact": {"email": "romdimtsouroplis@example.com"}, "lastName": "\u03a4\u03c3\u03bf\u03c5\u03c1\u03bf\u03c0\u03bb\u03ae\u03c2", "following": {"count": 0, "groups": [{"count": 0, "items": [], "type": "following", "name": "Mutual following"}, {"count": 0, "items": [], "type": "others", "name": "Other following"}]}, "requests": {"count": 0}, "mayorships": {"count": 0, "items": []}} } } """, ) django-allauth-0.47.0/allauth/socialaccount/providers/foursquare/urls.py000066400000000000000000000002561415442050100265240ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import FoursquareProvider urlpatterns = default_urlpatterns(FoursquareProvider) django-allauth-0.47.0/allauth/socialaccount/providers/foursquare/views.py000066400000000000000000000023171415442050100266740ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import FoursquareProvider class FoursquareOAuth2Adapter(OAuth2Adapter): provider_id = FoursquareProvider.id access_token_url = "https://foursquare.com/oauth2/access_token" # Issue ?? -- this one authenticates over and over again... # authorize_url = 'https://foursquare.com/oauth2/authorize' authorize_url = "https://foursquare.com/oauth2/authenticate" profile_url = "https://api.foursquare.com/v2/users/self" def complete_login(self, request, app, token, **kwargs): # Foursquare needs a version number for their API requests as # documented here # https://developer.foursquare.com/overview/versioning resp = requests.get( self.profile_url, params={"oauth_token": token.token, "v": "20140116"}, ) extra_data = resp.json()["response"]["user"] return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(FoursquareOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(FoursquareOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/frontier/000077500000000000000000000000001415442050100246165ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/frontier/__init__.py000066400000000000000000000000001415442050100267150ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/frontier/provider.py000066400000000000000000000031441415442050100270240ustar00rootroot00000000000000import hashlib from urllib.parse import urlencode from allauth.account.models import EmailAddress from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class FrontierAccount(ProviderAccount): def get_profile_url(self): return None def get_avatar_url(self): return "https://www.gravatar.com/avatar/%s?%s" % ( hashlib.md5( self.account.extra_data.get("email").lower().encode("utf-8") ).hexdigest(), urlencode({"d": "mp"}), ) def to_str(self): dflt = super(FrontierAccount, self).to_str() full_name = "%s %s" % ( self.account.extra_data.get("firstname", dflt), self.account.extra_data.get("lastname", dflt), ) return full_name class FrontierProvider(OAuth2Provider): id = "frontier" name = "Frontier" account_class = FrontierAccount def get_default_scope(self): scope = ["auth", "capi"] return scope def extract_uid(self, data): return str(data["customer_id"]) def extract_common_fields(self, data): return dict( email=data.get("email"), username=data.get("email"), last_name=data.get("lastname"), first_name=data.get("firstname"), ) def extract_email_addresses(self, data): ret = [] email = data.get("email") if email: ret.append(EmailAddress(email=email, verified=True, primary=True)) return ret provider_classes = [FrontierProvider] django-allauth-0.47.0/allauth/socialaccount/providers/frontier/tests.py000066400000000000000000000043131415442050100263330ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import FrontierProvider class FrontierTests(OAuth2TestsMixin, TestCase): provider_id = FrontierProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "email": "johndoe@example.com", "customer_id": "1234567", "firstname": "John", "developer": false, "lastname": "Doe", "allowedDownloads": ["FORC-FDEV-D-1010", "FORC-FDEV-D-1012", "COMBAT_TUTORIAL_DEMO", "FORC-FDEV-D-1013", "PUBLIC_TEST_SERVER", "FORC_FDEV_V_ADDER_LRPO", "FORC_FDEV_V_CHALLENGER_LRPO", "FORC_FDEV_V_CHIEFTAIN_LRPO", "FORC_FDEV_V_CRUSADER_LRPO", "FORC_FDEV_V_ANACONDA_LRPO", "FORC_FDEV_V_ASP_LRPO", "FORC_FDEV_V_ASP_SCOUT_LRPO", "FORC_FDEV_V_BELUGA_LRPO", "FORC_FDEV_V_COBRA_MKIII_LRPO", "FORC_FDEV_V_DIAMOND_EXPLORER_LRPO", "FORC_FDEV_V_COBRA_MKIV_LRPO", "FORC_FDEV_V_DIAMOND_SCOUT_LRPO", "FORC_FDEV_V_DOLPHIN_LRPO", "FORC_FDEV_V_EAGLE_LRPO", "FORC_FDEV_V_FEDERAL_ASSAULT_LRPO", "FORC_FDEV_V_FEDERAL_CORVETTE_LRPO", "FORC_FDEV_V_FEDDROP_LRPO", "FORC_FDEV_V_FEDERAL_FIGHTER_LRPO", "FORC_FDEV_V_FEDERAL_GUNSHIP_LRPO", "FORC_FDEV_V_FERDELANCE_LRPO", "FORC_FDEV_V_HAULER_LRPO", "FORC_FDEV_V_CLIPPER_LRPO", "FORC_FDEV_V_IMPERIAL_COURIER_LRPO", "FORC_FDEV_V_IMPERIAL_CUTTER_LRPO", "FORC_FDEV_V_IMPERIAL_EAGLE_LRPO", "FORC_FDEV_V_IMPERIAL_FIGHTER_LRPO", "FORC_FDEV_V_KEELBACK_LRPO", "FORC_FDEV_V_KRAIT_LRPO", "FORC_FDEV_V_KRAIT_LITE_LRPO", "FORC_FDEV_V_MAMBA_LRPO", "FORC_FDEV_V_ORCA_LRPO", "FORC_FDEV_V_PYTHON_LRPO", "FORC_FDEV_V_SIDEWINDER_LRPO", "FORC_FDEV_V_TAIPAN_LRPO", "FORC_FDEV_V_MAMMOTH_LRPO", "FORC_FDEV_V_TYPE6_LRPO", "FORC_FDEV_V_TYPE7_LRPO", "FORC_FDEV_V_TYPE9_LRPO", "FORC_FDEV_V_VIPER_MKIII_LRPO", "FORC_FDEV_V_VIPER_MKIV_LRPO", "FORC_FDEV_V_VULTURE_LRPO", "FORC-FDEV-D-1022", "FORC_FDEV_V_DECAL_1091", "FORC_FDEV_V_DECAL_1100", "FORC_FDEV_V_DECAL_1149", "FORC_FDEV_V_DECAL_1150", "FORC_FDEV_V_DECAL_1151", "FORC_FDEV_V_DECAL_1176", "FORC_FDEV_V_DECAL_1177", "FORC-FDEV-DO-1000", "FORC-FDEV-DO-1003", "FORC-FDEV-DO-1006", "PUBLIC_TEST_SERVER_OD"], "platform": "frontier" }""", ) django-allauth-0.47.0/allauth/socialaccount/providers/frontier/urls.py000066400000000000000000000002521415442050100261540ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import FrontierProvider urlpatterns = default_urlpatterns(FrontierProvider) django-allauth-0.47.0/allauth/socialaccount/providers/frontier/views.py000066400000000000000000000016231415442050100263270ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import FrontierProvider class FrontierOAuth2Adapter(OAuth2Adapter): provider_id = FrontierProvider.id AUTH_API = "https://auth.frontierstore.net" access_token_url = AUTH_API + "/token" authorize_url = AUTH_API + "/auth" profile_url = AUTH_API + "/me" def complete_login(self, request, app, token, **kwargs): resp = requests.get( self.profile_url, headers={"Authorization": "Bearer " + token.token}, ) resp.raise_for_status() extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(FrontierOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(FrontierOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/fxa/000077500000000000000000000000001415442050100235445ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/fxa/__init__.py000066400000000000000000000000001415442050100256430ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/fxa/models.py000066400000000000000000000000001415442050100253670ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/fxa/provider.py000066400000000000000000000017151415442050100257540ustar00rootroot00000000000000from django.conf import settings from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider _FXA_SETTINGS = getattr(settings, "SOCIALACCOUNT_PROVIDERS", {}).get("fxa", {}) FXA_OAUTH_ENDPOINT = _FXA_SETTINGS.get( "OAUTH_ENDPOINT", "https://oauth.accounts.firefox.com/v1" ) FXA_PROFILE_ENDPOINT = _FXA_SETTINGS.get( "PROFILE_ENDPOINT", "https://profile.accounts.firefox.com/v1" ) class FirefoxAccountsAccount(ProviderAccount): def to_str(self): return self.account.uid class FirefoxAccountsProvider(OAuth2Provider): id = "fxa" name = "Firefox Accounts" account_class = FirefoxAccountsAccount def get_default_scope(self): return ["profile"] def extract_uid(self, data): return str(data["uid"]) def extract_common_fields(self, data): return dict(email=data.get("email")) provider_classes = [FirefoxAccountsProvider] django-allauth-0.47.0/allauth/socialaccount/providers/fxa/tests.py000066400000000000000000000007451415442050100252660ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import FirefoxAccountsProvider class FirefoxAccountsTests(OAuth2TestsMixin, TestCase): provider_id = FirefoxAccountsProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "uid":"6d940dd41e636cc156074109b8092f96", "email":"user@example.com" }""", ) django-allauth-0.47.0/allauth/socialaccount/providers/fxa/urls.py000066400000000000000000000002701415442050100251020ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import FirefoxAccountsProvider urlpatterns = default_urlpatterns(FirefoxAccountsProvider) django-allauth-0.47.0/allauth/socialaccount/providers/fxa/views.py000066400000000000000000000017171415442050100252610ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import ( FXA_OAUTH_ENDPOINT, FXA_PROFILE_ENDPOINT, FirefoxAccountsProvider, ) class FirefoxAccountsOAuth2Adapter(OAuth2Adapter): provider_id = FirefoxAccountsProvider.id access_token_url = FXA_OAUTH_ENDPOINT + "/token" authorize_url = FXA_OAUTH_ENDPOINT + "/authorization" profile_url = FXA_PROFILE_ENDPOINT + "/profile" def complete_login(self, request, app, token, **kwargs): headers = {"Authorization": "Bearer {0}".format(token.token)} resp = requests.get(self.profile_url, headers=headers) extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(FirefoxAccountsOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(FirefoxAccountsOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/gitea/000077500000000000000000000000001415442050100240575ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/gitea/__init__.py000066400000000000000000000000001415442050100261560ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/gitea/provider.py000066400000000000000000000022151415442050100262630ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class GiteaAccount(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("html_url") def get_avatar_url(self): return self.account.extra_data.get("avatar_url") def to_str(self): dflt = super(GiteaAccount, self).to_str() return next( value for value in ( self.account.extra_data.get("username", None), self.account.extra_data.get("login", None), dflt, ) if value is not None ) class GiteaProvider(OAuth2Provider): id = "gitea" name = "Gitea" account_class = GiteaAccount def get_default_scope(self): scope = [] return scope def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): return dict( email=data.get("email"), username=data.get("login"), name=data.get("name"), ) provider_classes = [GiteaProvider] django-allauth-0.47.0/allauth/socialaccount/providers/gitea/tests.py000066400000000000000000000034011415442050100255710ustar00rootroot00000000000000from allauth.socialaccount.models import SocialAccount from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import GiteaProvider class GiteaTests(OAuth2TestsMixin, TestCase): provider_id = GiteaProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "id": 4940, "login": "giteauser", "full_name": "", "email": "giteauser@example.com", "avatar_url": "https://gitea.com/user/avatar/giteauser/-1", "language": "en-US", "is_admin": true, "last_login": "2021-08-20T20:07:39Z", "created": "2018-05-03T16:04:34Z", "restricted": false, "active": true, "prohibit_login": false, "location": "", "website": "", "description": "", "visibility": "public", "followers_count": 0, "following_count": 0, "starred_repos_count": 0, "username": "giteauser" }""", ) def test_account_name_null(self): """String conversion when Gitea responds with empty username""" data = """{ "id": 4940, "login": "giteauser", "username": null }""" self.login(MockedResponse(200, data)) socialaccount = SocialAccount.objects.get(uid="4940") self.assertIsNone(socialaccount.extra_data.get("name")) account = socialaccount.get_provider_account() self.assertIsNotNone(account.to_str()) self.assertEqual(account.to_str(), "giteauser") django-allauth-0.47.0/allauth/socialaccount/providers/gitea/urls.py000066400000000000000000000002441415442050100254160ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import GiteaProvider urlpatterns = default_urlpatterns(GiteaProvider) django-allauth-0.47.0/allauth/socialaccount/providers/gitea/views.py000066400000000000000000000023751415442050100255750ustar00rootroot00000000000000import requests from allauth.socialaccount import app_settings from allauth.socialaccount.providers.gitea.provider import GiteaProvider from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) class GiteaOAuth2Adapter(OAuth2Adapter): provider_id = GiteaProvider.id settings = app_settings.PROVIDERS.get(provider_id, {}) if "GITEA_URL" in settings: web_url = settings.get("GITEA_URL").rstrip("/") api_url = "{0}/api/v1".format(web_url) else: web_url = "https://gitea.com" api_url = "https://gitea.com" access_token_url = "{0}/login/oauth/access_token".format(web_url) authorize_url = "{0}/login/oauth/authorize".format(web_url) profile_url = "{0}/user".format(api_url) def complete_login(self, request, app, token, **kwargs): headers = {"Authorization": "token {}".format(token.token)} resp = requests.get(self.profile_url, headers=headers) resp.raise_for_status() extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(GiteaOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(GiteaOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/github/000077500000000000000000000000001415442050100242505ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/github/__init__.py000066400000000000000000000000001415442050100263470ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/github/provider.py000066400000000000000000000024131415442050100264540ustar00rootroot00000000000000from allauth.socialaccount import app_settings from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class GitHubAccount(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("html_url") def get_avatar_url(self): return self.account.extra_data.get("avatar_url") def to_str(self): dflt = super(GitHubAccount, self).to_str() return next( value for value in ( self.account.extra_data.get("name", None), self.account.extra_data.get("login", None), dflt, ) if value is not None ) class GitHubProvider(OAuth2Provider): id = "github" name = "GitHub" account_class = GitHubAccount def get_default_scope(self): scope = [] if app_settings.QUERY_EMAIL: scope.append("user:email") return scope def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): return dict( email=data.get("email"), username=data.get("login"), name=data.get("name"), ) provider_classes = [GitHubProvider] django-allauth-0.47.0/allauth/socialaccount/providers/github/tests.py000066400000000000000000000050701415442050100257660ustar00rootroot00000000000000from allauth.socialaccount.models import SocialAccount from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import GitHubProvider class GitHubTests(OAuth2TestsMixin, TestCase): provider_id = GitHubProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "type":"User", "organizations_url":"https://api.github.com/users/pennersr/orgs", "gists_url":"https://api.github.com/users/pennersr/gists{/gist_id}", "received_events_url":"https://api.github.com/users/pennersr/received_events", "gravatar_id":"8639768262b8484f6a3380f8db2efa5b", "followers":16, "blog":"http://www.intenct.info", "avatar_url":"https://secure.gravatar.com/avatar/8639768262b8484f6a3380f8db2efa5b?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png", "login":"pennersr", "created_at":"2010-02-10T12:50:51Z", "company":"IntenCT", "subscriptions_url":"https://api.github.com/users/pennersr/subscriptions", "public_repos":14, "hireable":false, "url":"https://api.github.com/users/pennersr", "public_gists":0, "starred_url":"https://api.github.com/users/pennersr/starred{/owner}{/repo}", "html_url":"https://github.com/pennersr", "location":"The Netherlands", "bio":null, "name":"Raymond Penners", "repos_url":"https://api.github.com/users/pennersr/repos", "followers_url":"https://api.github.com/users/pennersr/followers", "id":201022, "following":0, "email":"raymond.penners@intenct.nl", "events_url":"https://api.github.com/users/pennersr/events{/privacy}", "following_url":"https://api.github.com/users/pennersr/following" }""", ) def test_account_name_null(self): """String conversion when GitHub responds with empty name""" data = """{ "type": "User", "id": 201022, "login": "pennersr", "name": null }""" self.login(MockedResponse(200, data)) socialaccount = SocialAccount.objects.get(uid="201022") self.assertIsNone(socialaccount.extra_data.get("name")) account = socialaccount.get_provider_account() self.assertIsNotNone(account.to_str()) self.assertEqual(account.to_str(), "pennersr") django-allauth-0.47.0/allauth/socialaccount/providers/github/urls.py000066400000000000000000000002461415442050100256110ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import GitHubProvider urlpatterns = default_urlpatterns(GitHubProvider) django-allauth-0.47.0/allauth/socialaccount/providers/github/views.py000066400000000000000000000037601415442050100257650ustar00rootroot00000000000000import requests from allauth.socialaccount import app_settings from allauth.socialaccount.providers.github.provider import GitHubProvider from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) class GitHubOAuth2Adapter(OAuth2Adapter): provider_id = GitHubProvider.id settings = app_settings.PROVIDERS.get(provider_id, {}) if "GITHUB_URL" in settings: web_url = settings.get("GITHUB_URL").rstrip("/") api_url = "{0}/api/v3".format(web_url) else: web_url = "https://github.com" api_url = "https://api.github.com" access_token_url = "{0}/login/oauth/access_token".format(web_url) authorize_url = "{0}/login/oauth/authorize".format(web_url) profile_url = "{0}/user".format(api_url) emails_url = "{0}/user/emails".format(api_url) def complete_login(self, request, app, token, **kwargs): headers = {"Authorization": "token {}".format(token.token)} resp = requests.get(self.profile_url, headers=headers) resp.raise_for_status() extra_data = resp.json() if app_settings.QUERY_EMAIL and not extra_data.get("email"): extra_data["email"] = self.get_email(headers) return self.get_provider().sociallogin_from_response(request, extra_data) def get_email(self, headers): email = None resp = requests.get(self.emails_url, headers=headers) resp.raise_for_status() emails = resp.json() if resp.status_code == 200 and emails: email = emails[0] primary_emails = [ e for e in emails if not isinstance(e, dict) or e.get("primary") ] if primary_emails: email = primary_emails[0] if isinstance(email, dict): email = email.get("email", "") return email oauth2_login = OAuth2LoginView.adapter_view(GitHubOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(GitHubOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/gitlab/000077500000000000000000000000001415442050100242305ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/gitlab/__init__.py000066400000000000000000000000001415442050100263270ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/gitlab/provider.py000066400000000000000000000017201415442050100264340ustar00rootroot00000000000000# -*- coding: utf-8 -*- from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class GitLabAccount(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("web_url") def get_avatar_url(self): return self.account.extra_data.get("avatar_url") def to_str(self): dflt = super(GitLabAccount, self).to_str() return self.account.extra_data.get("name", dflt) class GitLabProvider(OAuth2Provider): id = "gitlab" name = "GitLab" account_class = GitLabAccount def get_default_scope(self): return ["read_user"] def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): return dict( email=data.get("email"), username=data.get("username"), name=data.get("name"), ) provider_classes = [GitLabProvider] django-allauth-0.47.0/allauth/socialaccount/providers/gitlab/tests.py000066400000000000000000000031701415442050100257450ustar00rootroot00000000000000# -*- coding: utf-8 -*- from allauth.socialaccount.providers.gitlab.provider import GitLabProvider from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase class GitLabTests(OAuth2TestsMixin, TestCase): provider_id = GitLabProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "avatar_url": "https://secure.gravatar.com/avatar/123", "bio": null, "can_create_group": true, "can_create_project": true, "color_scheme_id": 5, "confirmed_at": "2015-03-02T16:53:58.370Z", "created_at": "2015-03-02T16:53:58.885Z", "current_sign_in_at": "2018-06-12T18:44:49.985Z", "email": "mr.bob@gitlab.example.com", "external": false, "id": 2, "identities": [], "last_activity_on": "2018-06-11", "last_sign_in_at": "2018-05-31T14:59:44.527Z", "linkedin": "", "location": null, "name": "Mr Bob", "organization": null, "projects_limit": 10, "shared_runners_minutes_limit": 2000, "skype": "", "state": "active", "theme_id": 6, "twitter": "mrbob", "two_factor_enabled": true, "username": "mr.bob", "web_url": "https://gitlab.example.com/u/mr.bob", "website_url": "" } """, ) django-allauth-0.47.0/allauth/socialaccount/providers/gitlab/urls.py000066400000000000000000000003431415442050100255670ustar00rootroot00000000000000# -*- coding: utf-8 -*- from allauth.socialaccount.providers.gitlab.provider import GitLabProvider from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns urlpatterns = default_urlpatterns(GitLabProvider) django-allauth-0.47.0/allauth/socialaccount/providers/gitlab/views.py000066400000000000000000000022641415442050100257430ustar00rootroot00000000000000# -*- coding: utf-8 -*- import requests from allauth.socialaccount import app_settings from allauth.socialaccount.providers.gitlab.provider import GitLabProvider from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) class GitLabOAuth2Adapter(OAuth2Adapter): provider_id = GitLabProvider.id provider_default_url = "https://gitlab.com" provider_api_version = "v4" settings = app_settings.PROVIDERS.get(provider_id, {}) provider_base_url = settings.get("GITLAB_URL", provider_default_url) access_token_url = "{0}/oauth/token".format(provider_base_url) authorize_url = "{0}/oauth/authorize".format(provider_base_url) profile_url = "{0}/api/{1}/user".format(provider_base_url, provider_api_version) def complete_login(self, request, app, token, response): extra_data = requests.get( self.profile_url, params={"access_token": token.token} ) return self.get_provider().sociallogin_from_response(request, extra_data.json()) oauth2_login = OAuth2LoginView.adapter_view(GitLabOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(GitLabOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/globus/000077500000000000000000000000001415442050100242615ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/globus/__init__.py000066400000000000000000000000001415442050100263600ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/globus/provider.py000066400000000000000000000023671415442050100264750ustar00rootroot00000000000000from allauth.socialaccount import app_settings from allauth.socialaccount.providers.base import ( ProviderAccount, ProviderException, ) from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class GlobusAccount(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("web_url", "dflt") def get_avatar_url(self): return self.account.extra_data.get("avatar_url", "dflt") def to_str(self): dflt = super(GlobusAccount, self).to_str() return self.account.extra_data.get("name", dflt) class GlobusProvider(OAuth2Provider): id = "globus" name = "Globus" account_class = GlobusAccount def extract_uid(self, data): if "sub" not in data: raise ProviderException("Globus OAuth error", data) return str(data["sub"]) def extract_common_fields(self, data): return dict( email=data.get("email"), username=data.get("preferred_username"), name=data.get("name"), ) def get_default_scope(self): scope = ["openid", "profile", "offline_access"] if app_settings.QUERY_EMAIL: scope.append("email") return scope provider_classes = [GlobusProvider] django-allauth-0.47.0/allauth/socialaccount/providers/globus/tests.py000066400000000000000000000015421415442050100257770ustar00rootroot00000000000000from django.test.utils import override_settings from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import GlobusProvider class GlobusTests(OAuth2TestsMixin, TestCase): provider_id = GlobusProvider.id @override_settings(SOCIALACCOUNT_QUERY_EMAIL=True) def get_mocked_response(self): return MockedResponse( 200, """ { "identity_provider_display_name": "University of Gozorpazorp", "sub": "a6fc81e-4a6c1-97ac-b4c6-84ff6a8ce662", "preferred_username": "morty@ugz.edu", "identity_provider": "9a4c8312f-9432-9a7c-1654-6a987c6531fa", "organization": "University of Gozorpazorp", "email": "morty@ugz.edu", "name": "Morty Smith" } """, ) django-allauth-0.47.0/allauth/socialaccount/providers/globus/urls.py000066400000000000000000000003131415442050100256150ustar00rootroot00000000000000from allauth.socialaccount.providers.globus.provider import GlobusProvider from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns urlpatterns = default_urlpatterns(GlobusProvider) django-allauth-0.47.0/allauth/socialaccount/providers/globus/views.py000066400000000000000000000021101415442050100257620ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.globus.provider import GlobusProvider from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) class GlobusAdapter(OAuth2Adapter): provider_id = GlobusProvider.id provider_default_url = "https://auth.globus.org/v2/oauth2" provider_base_url = "https://auth.globus.org/v2/oauth2" access_token_url = "{0}/token".format(provider_base_url) authorize_url = "{0}/authorize".format(provider_base_url) profile_url = "{0}/userinfo".format(provider_base_url) def complete_login(self, request, app, token, response): extra_data = requests.get( self.profile_url, params={"access_token": token.token}, headers={ "Authorization": "Bearer " + token.token, }, ) return self.get_provider().sociallogin_from_response(request, extra_data.json()) oauth2_login = OAuth2LoginView.adapter_view(GlobusAdapter) oauth2_callback = OAuth2CallbackView.adapter_view(GlobusAdapter) django-allauth-0.47.0/allauth/socialaccount/providers/google/000077500000000000000000000000001415442050100242425ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/google/__init__.py000066400000000000000000000000001415442050100263410ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/google/provider.py000066400000000000000000000032721415442050100264520ustar00rootroot00000000000000from allauth.account.models import EmailAddress from allauth.socialaccount.app_settings import QUERY_EMAIL from allauth.socialaccount.providers.base import AuthAction, ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class Scope(object): EMAIL = "email" PROFILE = "profile" class GoogleAccount(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("link") def get_avatar_url(self): return self.account.extra_data.get("picture") def to_str(self): dflt = super(GoogleAccount, self).to_str() return self.account.extra_data.get("name", dflt) class GoogleProvider(OAuth2Provider): id = "google" name = "Google" account_class = GoogleAccount def get_default_scope(self): scope = [Scope.PROFILE] if QUERY_EMAIL: scope.append(Scope.EMAIL) return scope def get_auth_params(self, request, action): ret = super(GoogleProvider, self).get_auth_params(request, action) if action == AuthAction.REAUTHENTICATE: ret["prompt"] = "select_account consent" return ret def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): return dict( email=data.get("email"), last_name=data.get("family_name"), first_name=data.get("given_name"), ) def extract_email_addresses(self, data): ret = [] email = data.get("email") if email and data.get("verified_email"): ret.append(EmailAddress(email=email, verified=True, primary=True)) return ret provider_classes = [GoogleProvider] django-allauth-0.47.0/allauth/socialaccount/providers/google/tests.py000066400000000000000000000207131415442050100257610ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import absolute_import, unicode_literals from importlib import import_module from requests.exceptions import HTTPError from django.conf import settings from django.contrib.auth.models import User from django.core import mail from django.test.client import RequestFactory from django.test.utils import override_settings from django.urls import reverse from allauth.account import app_settings as account_settings from allauth.account.adapter import get_adapter from allauth.account.models import EmailAddress, EmailConfirmation from allauth.account.signals import user_signed_up from allauth.socialaccount.models import SocialAccount, SocialToken from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase, patch from .provider import GoogleProvider @override_settings( SOCIALACCOUNT_AUTO_SIGNUP=True, ACCOUNT_SIGNUP_FORM_CLASS=None, ACCOUNT_EMAIL_VERIFICATION=account_settings.EmailVerificationMethod.MANDATORY, ) class GoogleTests(OAuth2TestsMixin, TestCase): provider_id = GoogleProvider.id def get_mocked_response( self, family_name="Penners", given_name="Raymond", name="Raymond Penners", email="raymond.penners@example.com", verified_email=True, ): return MockedResponse( 200, """ {"family_name": "%s", "name": "%s", "picture": "https://lh5.googleusercontent.com/photo.jpg", "locale": "nl", "gender": "male", "email": "%s", "link": "https://plus.google.com/108204268033311374519", "given_name": "%s", "id": "108204268033311374519", "verified_email": %s } """ % ( family_name, name, email, given_name, (repr(verified_email).lower()), ), ) def test_google_compelete_login_401(self): from allauth.socialaccount.providers.google.views import ( GoogleOAuth2Adapter, ) class LessMockedResponse(MockedResponse): def raise_for_status(self): if self.status_code != 200: raise HTTPError(None) request = RequestFactory().get( reverse(self.provider.id + "_login"), dict(process="login") ) adapter = GoogleOAuth2Adapter(request) app = adapter.get_provider().get_app(request) token = SocialToken(token="some_token") response_with_401 = LessMockedResponse( 401, """ {"error": { "errors": [{ "domain": "global", "reason": "authError", "message": "Invalid Credentials", "locationType": "header", "location": "Authorization" } ], "code": 401, "message": "Invalid Credentials" } }""", ) with patch( "allauth.socialaccount.providers.google.views.requests" ) as patched_requests: patched_requests.get.return_value = response_with_401 with self.assertRaises(HTTPError): adapter.complete_login(request, app, token) def test_username_based_on_email(self): first_name = "明" last_name = "小" email = "raymond.penners@example.com" self.login( self.get_mocked_response( name=first_name + " " + last_name, email=email, given_name=first_name, family_name=last_name, verified_email=True, ) ) user = User.objects.get(email=email) self.assertEqual(user.username, "raymond.penners") def test_email_verified(self): test_email = "raymond.penners@example.com" self.login(self.get_mocked_response(verified_email=True)) email_address = EmailAddress.objects.get(email=test_email, verified=True) self.assertFalse( EmailConfirmation.objects.filter(email_address__email=test_email).exists() ) account = email_address.user.socialaccount_set.all()[0] self.assertEqual(account.extra_data["given_name"], "Raymond") def test_user_signed_up_signal(self): sent_signals = [] def on_signed_up(sender, request, user, **kwargs): sociallogin = kwargs["sociallogin"] self.assertEqual(sociallogin.account.provider, GoogleProvider.id) self.assertEqual(sociallogin.account.user, user) sent_signals.append(sender) user_signed_up.connect(on_signed_up) self.login(self.get_mocked_response(verified_email=True)) self.assertTrue(len(sent_signals) > 0) @override_settings(ACCOUNT_EMAIL_CONFIRMATION_HMAC=False) def test_email_unverified(self): test_email = "raymond.penners@example.com" resp = self.login(self.get_mocked_response(verified_email=False)) email_address = EmailAddress.objects.get(email=test_email) self.assertFalse(email_address.verified) self.assertTrue( EmailConfirmation.objects.filter(email_address__email=test_email).exists() ) self.assertTemplateUsed( resp, "account/email/email_confirmation_signup_subject.txt" ) def test_email_verified_stashed(self): # http://slacy.com/blog/2012/01/how-to-set-session-variables-in-django-unit-tests/ engine = import_module(settings.SESSION_ENGINE) store = engine.SessionStore() store.save() self.client.cookies[settings.SESSION_COOKIE_NAME] = store.session_key request = RequestFactory().get("/") request.session = self.client.session adapter = get_adapter(request) test_email = "raymond.penners@example.com" adapter.stash_verified_email(request, test_email) request.session.save() self.login(self.get_mocked_response(verified_email=False)) email_address = EmailAddress.objects.get(email=test_email) self.assertTrue(email_address.verified) self.assertFalse( EmailConfirmation.objects.filter(email_address__email=test_email).exists() ) def test_account_connect(self): email = "user@example.com" user = User.objects.create(username="user", is_active=True, email=email) user.set_password("test") user.save() EmailAddress.objects.create(user=user, email=email, primary=True, verified=True) self.client.login(username=user.username, password="test") self.login(self.get_mocked_response(verified_email=True), process="connect") # Check if we connected... self.assertTrue( SocialAccount.objects.filter(user=user, provider=GoogleProvider.id).exists() ) # For now, we do not pick up any new e-mail addresses on connect self.assertEqual(EmailAddress.objects.filter(user=user).count(), 1) self.assertEqual(EmailAddress.objects.filter(user=user, email=email).count(), 1) @override_settings( ACCOUNT_EMAIL_VERIFICATION=account_settings.EmailVerificationMethod.MANDATORY, SOCIALACCOUNT_EMAIL_VERIFICATION=account_settings.EmailVerificationMethod.NONE, ) def test_social_email_verification_skipped(self): test_email = "raymond.penners@example.com" self.login(self.get_mocked_response(verified_email=False)) email_address = EmailAddress.objects.get(email=test_email) self.assertFalse(email_address.verified) self.assertFalse( EmailConfirmation.objects.filter(email_address__email=test_email).exists() ) @override_settings( ACCOUNT_EMAIL_VERIFICATION=account_settings.EmailVerificationMethod.OPTIONAL, SOCIALACCOUNT_EMAIL_VERIFICATION=account_settings.EmailVerificationMethod.OPTIONAL, ) def test_social_email_verification_optional(self): self.login(self.get_mocked_response(verified_email=False)) self.assertEqual(len(mail.outbox), 1) self.login(self.get_mocked_response(verified_email=False)) self.assertEqual(len(mail.outbox), 1) @override_settings( SOCIALACCOUNT_PROVIDERS={ "google": { "APP": { "client_id": "app123id", "key": "google", "secret": "dummy", } } } ) class AppInSettingsTests(GoogleTests): """ Run the same set of tests but without having a SocialApp entry. """ pass django-allauth-0.47.0/allauth/socialaccount/providers/google/urls.py000066400000000000000000000002461415442050100256030ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import GoogleProvider urlpatterns = default_urlpatterns(GoogleProvider) django-allauth-0.47.0/allauth/socialaccount/providers/google/views.py000066400000000000000000000017011415442050100257500ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import GoogleProvider class GoogleOAuth2Adapter(OAuth2Adapter): provider_id = GoogleProvider.id access_token_url = "https://accounts.google.com/o/oauth2/token" authorize_url = "https://accounts.google.com/o/oauth2/auth" profile_url = "https://www.googleapis.com/oauth2/v1/userinfo" def complete_login(self, request, app, token, **kwargs): resp = requests.get( self.profile_url, params={"access_token": token.token, "alt": "json"}, ) resp.raise_for_status() extra_data = resp.json() login = self.get_provider().sociallogin_from_response(request, extra_data) return login oauth2_login = OAuth2LoginView.adapter_view(GoogleOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(GoogleOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/gumroad/000077500000000000000000000000001415442050100244245ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/gumroad/__init__.py000066400000000000000000000000001415442050100265230ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/gumroad/provider.py000066400000000000000000000021641415442050100266330ustar00rootroot00000000000000# -*- coding: utf-8 -*- from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class GumroadAccount(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("url") def to_str(self): dflt = super(GumroadAccount, self).to_str() return self.account.extra_data.get("name", dflt) class GumroadProvider(OAuth2Provider): id = "gumroad" name = "Gumroad" account_class = GumroadAccount def get_default_scope(self): return ["edit_products"] def extract_uid(self, data): return str(data["user_id"]) def extract_common_fields(self, data): try: username = data["url"].split("https://gumroad.com/")[1] except (KeyError, IndexError, AttributeError): username = None return dict( username=username, email=data.get("email"), name=data.get("name"), twitter_handle=data.get("twitter_handle"), url=data.get("url"), ) provider_classes = [GumroadProvider] django-allauth-0.47.0/allauth/socialaccount/providers/gumroad/tests.py000066400000000000000000000014521415442050100261420ustar00rootroot00000000000000# -*- coding: utf-8 -*- from allauth.socialaccount.providers.gumroad.provider import GumroadProvider from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase class GumroadTests(OAuth2TestsMixin, TestCase): provider_id = GumroadProvider.id def get_mocked_response(self): return MockedResponse( 200, """{ "success": true, "user": { "bio": "a sailor, a tailor", "name": "John Smith", "twitter_handle": null, "user_id": "G_-mnBf9b1j9A7a4ub4nFQ==", "email": "johnsmith@gumroad.com", "url": "https://gumroad.com/sailorjohn" } }""", ) django-allauth-0.47.0/allauth/socialaccount/providers/gumroad/urls.py000066400000000000000000000003461415442050100257660ustar00rootroot00000000000000# -*- coding: utf-8 -*- from allauth.socialaccount.providers.gumroad.provider import GumroadProvider from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns urlpatterns = default_urlpatterns(GumroadProvider) django-allauth-0.47.0/allauth/socialaccount/providers/gumroad/views.py000066400000000000000000000022111415442050100261270ustar00rootroot00000000000000# -*- coding: utf-8 -*- import requests from allauth.socialaccount import app_settings from allauth.socialaccount.providers.gumroad.provider import GumroadProvider from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) class GumroadOauth2Adapter(OAuth2Adapter): provider_id = GumroadProvider.id supports_state = True settings = app_settings.PROVIDERS.get(provider_id, {}) provider_base_url = settings.get("GUMROAD_URL") access_token_url = "{0}/oauth/token".format(provider_base_url) authorize_url = "{0}/oauth/authorize".format(provider_base_url) profile_url = "https://api.gumroad.com/v2/user" def complete_login(self, request, app, token, response): resp = requests.get(self.profile_url, params={"access_token": token.token}) resp.raise_for_status() extra_data = resp.json() return self.get_provider().sociallogin_from_response( request, extra_data["user"] ) oauth2_login = OAuth2LoginView.adapter_view(GumroadOauth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(GumroadOauth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/hubic/000077500000000000000000000000001415442050100240605ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/hubic/__init__.py000066400000000000000000000000001415442050100261570ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/hubic/provider.py000066400000000000000000000012561415442050100262700ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class HubicAccount(ProviderAccount): pass class HubicProvider(OAuth2Provider): id = "hubic" name = "Hubic" account_class = HubicAccount def extract_uid(self, data): return str(data["email"]) def extract_common_fields(self, data): return dict( email=data.get("email"), username=data.get("firstname").lower() + data.get("lastname").lower(), first_name=data.get("firstname"), last_name=data.get("lastname"), ) provider_classes = [HubicProvider] django-allauth-0.47.0/allauth/socialaccount/providers/hubic/tests.py000066400000000000000000000013771415442050100256040ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import HubicProvider class HubicTests(OAuth2TestsMixin, TestCase): provider_id = HubicProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "email": "user@example.com", "firstname": "Test", "activated": true, "creationDate": "2014-04-17T17:04:01+02:00", "language": "en", "status": "ok", "offer": "25g", "lastname": "User" } """, ) def get_login_response_json(self, with_refresh_token=True): return '{\ "access_token": "testac",\ "expires_in": "3600",\ "refresh_token": "testrf",\ "token_type": "Bearer"\ }' django-allauth-0.47.0/allauth/socialaccount/providers/hubic/urls.py000066400000000000000000000002441415442050100254170ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import HubicProvider urlpatterns = default_urlpatterns(HubicProvider) django-allauth-0.47.0/allauth/socialaccount/providers/hubic/views.py000066400000000000000000000017151415442050100255730ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import HubicProvider class HubicOAuth2Adapter(OAuth2Adapter): provider_id = HubicProvider.id access_token_url = "https://api.hubic.com/oauth/token" authorize_url = "https://api.hubic.com/oauth/auth" profile_url = "https://api.hubic.com/1.0/account" redirect_uri_protocol = "https" def complete_login(self, request, app, token, **kwargs): token_type = kwargs["response"]["token_type"] resp = requests.get( self.profile_url, headers={"Authorization": "%s %s" % (token_type, token.token)}, ) extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(HubicOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(HubicOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/instagram/000077500000000000000000000000001415442050100247535ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/instagram/__init__.py000066400000000000000000000000001415442050100270520ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/instagram/provider.py000066400000000000000000000016231415442050100271610ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class InstagramAccount(ProviderAccount): PROFILE_URL = "http://instagram.com/" def get_profile_url(self): return self.PROFILE_URL + self.account.extra_data.get("username") def to_str(self): dflt = super(InstagramAccount, self).to_str() return self.account.extra_data.get("username", dflt) class InstagramProvider(OAuth2Provider): id = "instagram" name = "Instagram" account_class = InstagramAccount def extract_extra_data(self, data): return data def get_default_scope(self): return ["basic"] def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): return dict(username=data.get("username")) provider_classes = [InstagramProvider] django-allauth-0.47.0/allauth/socialaccount/providers/instagram/tests.py000066400000000000000000000014331415442050100264700ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import InstagramProvider class InstagramTests(OAuth2TestsMixin, TestCase): provider_id = InstagramProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "username": "georgewhewell", "bio": "", "website": "", "profile_picture": "http://images.ak.instagram.com/profiles/profile_11428116_75sq_1339547159.jpg", "full_name": "georgewhewell", "counts": { "media": 74, "followed_by": 91, "follows": 104 }, "id": "11428116" }""", ) # noqa django-allauth-0.47.0/allauth/socialaccount/providers/instagram/urls.py000066400000000000000000000002541415442050100263130ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import InstagramProvider urlpatterns = default_urlpatterns(InstagramProvider) django-allauth-0.47.0/allauth/socialaccount/providers/instagram/views.py000066400000000000000000000016741415442050100264720ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import InstagramProvider class InstagramOAuth2Adapter(OAuth2Adapter): provider_id = InstagramProvider.id access_token_url = "https://api.instagram.com/oauth/access_token" authorize_url = "https://api.instagram.com/oauth/authorize" profile_url = "https://graph.instagram.com/me" def complete_login(self, request, app, token, **kwargs): resp = requests.get( self.profile_url, params={"access_token": token.token, "fields": ["id", "username"]}, ) resp.raise_for_status() extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(InstagramOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(InstagramOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/jupyterhub/000077500000000000000000000000001415442050100251675ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/jupyterhub/__init__.py000066400000000000000000000000001415442050100272660ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/jupyterhub/provider.py000066400000000000000000000012121415442050100273670ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class JupyterHubAccount(ProviderAccount): def to_str(self): dflt = super(JupyterHubAccount, self).to_str() return self.account.extra_data.get("name", dflt) class JupyterHubProvider(OAuth2Provider): id = "jupyterhub" name = "JupyterHub" account_class = JupyterHubAccount def extract_uid(self, data): return str(data.get("name")) def extract_common_fields(self, data): return dict(name=data.get("name", "")) provider_classes = [JupyterHubProvider] django-allauth-0.47.0/allauth/socialaccount/providers/jupyterhub/tests.py000066400000000000000000000012111415442050100266760ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import JupyterHubProvider class JupyterHubTests(OAuth2TestsMixin, TestCase): provider_id = JupyterHubProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "kind": "user", "name": "abc", "admin": false, "groups": [], "server": null, "pending": null, "created": "2016-12-06T18:30:50.297567Z", "last_activity": "2017-02-07T17:29:36.470236Z", "servers": null} """, ) django-allauth-0.47.0/allauth/socialaccount/providers/jupyterhub/urls.py000066400000000000000000000003401415442050100265230ustar00rootroot00000000000000from allauth.socialaccount.providers.jupyterhub.provider import ( JupyterHubProvider, ) from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns urlpatterns = default_urlpatterns(JupyterHubProvider) django-allauth-0.47.0/allauth/socialaccount/providers/jupyterhub/views.py000066400000000000000000000022131415442050100266740ustar00rootroot00000000000000import requests from allauth.socialaccount import app_settings from allauth.socialaccount.providers.jupyterhub.provider import ( JupyterHubProvider, ) from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) class JupyterHubAdapter(OAuth2Adapter): provider_id = JupyterHubProvider.id settings = app_settings.PROVIDERS.get(provider_id, {}) provider_base_url = settings.get("API_URL", "") access_token_url = "{0}/hub/api/oauth2/token".format(provider_base_url) authorize_url = "{0}/hub/api/oauth2/authorize".format(provider_base_url) profile_url = "{0}/hub/api/user".format(provider_base_url) def complete_login(self, request, app, access_token, **kwargs): headers = {"Authorization": "Bearer {0}".format(access_token)} extra_data = requests.get(self.profile_url, headers=headers) user_profile = extra_data.json() return self.get_provider().sociallogin_from_response(request, user_profile) oauth2_login = OAuth2LoginView.adapter_view(JupyterHubAdapter) oauth2_callback = OAuth2CallbackView.adapter_view(JupyterHubAdapter) django-allauth-0.47.0/allauth/socialaccount/providers/kakao/000077500000000000000000000000001415442050100240545ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/kakao/__init__.py000066400000000000000000000000001415442050100261530ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/kakao/models.py000066400000000000000000000000001415442050100256770ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/kakao/provider.py000066400000000000000000000025071415442050100262640ustar00rootroot00000000000000from allauth.account.models import EmailAddress from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class KakaoAccount(ProviderAccount): @property def properties(self): return self.account.extra_data.get("properties") def get_avatar_url(self): return self.properties.get("profile_image") def to_str(self): dflt = super(KakaoAccount, self).to_str() return self.properties.get("nickname", dflt) class KakaoProvider(OAuth2Provider): id = "kakao" name = "Kakao" account_class = KakaoAccount def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): email = data["kakao_account"].get("email") nickname = data.get("properties", {}).get("nickname") return dict(email=email, username=nickname) def extract_email_addresses(self, data): ret = [] data = data["kakao_account"] email = data.get("email") if email: verified = data.get("is_email_verified") # data['is_email_verified'] imply the email address is # verified ret.append(EmailAddress(email=email, verified=verified, primary=True)) return ret provider_classes = [KakaoProvider] django-allauth-0.47.0/allauth/socialaccount/providers/kakao/tests.py000066400000000000000000000021341415442050100255700ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import KakaoProvider class KakaoTests(OAuth2TestsMixin, TestCase): provider_id = KakaoProvider.id kakao_data = """ { "id": 123456789, "properties": { "nickname": "\uc9c0\uc724", "thumbnail_image": "http://xxx.kakao.co.kr/.../aaa.jpg", "profile_image": "http://xxx.kakao.co.kr/.../bbb.jpg" }, "kakao_account": { "has_email": true, "is_email_valid": true, "is_email_verified": true, "email": "xxxxxxx@xxxxx.com", "has_age_range": true, "age_range": "20~29", "has_birthday": true, "birthday": "1130", "has_gender": true, "gender": "female" } } """ def get_mocked_response(self, data=None): if data is None: data = self.kakao_data return MockedResponse(200, data) django-allauth-0.47.0/allauth/socialaccount/providers/kakao/urls.py000066400000000000000000000002441415442050100254130ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import KakaoProvider urlpatterns = default_urlpatterns(KakaoProvider) django-allauth-0.47.0/allauth/socialaccount/providers/kakao/views.py000066400000000000000000000016201415442050100255620ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import KakaoProvider class KakaoOAuth2Adapter(OAuth2Adapter): provider_id = KakaoProvider.id access_token_url = "https://kauth.kakao.com/oauth/token" authorize_url = "https://kauth.kakao.com/oauth/authorize" profile_url = "https://kapi.kakao.com/v2/user/me" def complete_login(self, request, app, token, **kwargs): headers = {"Authorization": "Bearer {0}".format(token.token)} resp = requests.get(self.profile_url, headers=headers) resp.raise_for_status() extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(KakaoOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(KakaoOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/keycloak/000077500000000000000000000000001415442050100245705ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/keycloak/__init__.py000066400000000000000000000000001415442050100266670ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/keycloak/provider.py000066400000000000000000000022411415442050100267730ustar00rootroot00000000000000# -*- coding: utf-8 -*- from django.conf import settings from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider OVERRIDE_NAME = ( getattr(settings, "SOCIALACCOUNT_PROVIDERS", {}) .get("keycloak", {}) .get("OVERRIDE_NAME", "Keycloak") ) class KeycloakAccount(ProviderAccount): def get_avatar_url(self): return self.account.extra_data.get("picture") def to_str(self): dflt = super(KeycloakAccount, self).to_str() return self.account.extra_data.get("name", dflt) class KeycloakProvider(OAuth2Provider): id = "keycloak" name = OVERRIDE_NAME account_class = KeycloakAccount def get_default_scope(self): return ["openid", "profile", "email"] def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): return dict( email=data.get("email"), username=data.get("preferred_username"), name=data.get("name"), user_id=data.get("user_id"), picture=data.get("picture"), ) provider_classes = [KeycloakProvider] django-allauth-0.47.0/allauth/socialaccount/providers/keycloak/tests.py000066400000000000000000000013021415442050100263000ustar00rootroot00000000000000# -*- coding: utf-8 -*- from allauth.socialaccount.providers.keycloak.provider import KeycloakProvider from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase class KeycloakTests(OAuth2TestsMixin, TestCase): provider_id = KeycloakProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "picture": "https://secure.gravatar.com/avatar/123", "email": "mr.bob@your.Keycloak.server.example.com", "id": 2, "sub": 2, "identities": [], "name": "Mr Bob" } """, ) django-allauth-0.47.0/allauth/socialaccount/providers/keycloak/urls.py000066400000000000000000000003511415442050100261260ustar00rootroot00000000000000# -*- coding: utf-8 -*- from allauth.socialaccount.providers.keycloak.provider import KeycloakProvider from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns urlpatterns = default_urlpatterns(KeycloakProvider) django-allauth-0.47.0/allauth/socialaccount/providers/keycloak/views.py000066400000000000000000000031061415442050100262770ustar00rootroot00000000000000# -*- coding: utf-8 -*- import requests from allauth.socialaccount import app_settings from allauth.socialaccount.providers.keycloak.provider import KeycloakProvider from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) class KeycloakOAuth2Adapter(OAuth2Adapter): provider_id = KeycloakProvider.id supports_state = True settings = app_settings.PROVIDERS.get(provider_id, {}) provider_base_url = "{0}/realms/{1}".format( settings.get("KEYCLOAK_URL"), settings.get("KEYCLOAK_REALM") ) authorize_url = "{0}/protocol/openid-connect/auth".format(provider_base_url) other_url = settings.get("KEYCLOAK_URL_ALT") if other_url is None: other_url = settings.get("KEYCLOAK_URL") server_base_url = "{0}/realms/{1}".format(other_url, settings.get("KEYCLOAK_REALM")) access_token_url = "{0}/protocol/openid-connect/token".format(server_base_url) profile_url = "{0}/protocol/openid-connect/userinfo".format(server_base_url) def complete_login(self, request, app, token, response): response = requests.post( self.profile_url, headers={"Authorization": "Bearer " + str(token)} ) response.raise_for_status() extra_data = response.json() extra_data["id"] = extra_data["sub"] del extra_data["sub"] return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(KeycloakOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(KeycloakOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/line/000077500000000000000000000000001415442050100237155ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/line/__init__.py000066400000000000000000000000001415442050100260140ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/line/models.py000066400000000000000000000000001415442050100255400ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/line/provider.py000066400000000000000000000017711415442050100261270ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class LineAccount(ProviderAccount): def get_avatar_url(self): return self.account.extra_data.get("pictureUrl") or self.account.extra_data.get( "picture" ) def to_str(self): return self.account.extra_data.get("displayName", self.account.uid) class LineProvider(OAuth2Provider): id = "line" name = "Line" account_class = LineAccount def get_default_scope(self): return [] def extract_uid(self, data): return str(data.get("userId") or data.get("sub")) def extract_common_fields(self, data): return dict( email=data.get("email"), username=data.get("email") or self.extract_uid(data), first_name=data.get("first_name"), last_name=data.get("last_name"), name=data.get("name"), ) provider_classes = [LineProvider] django-allauth-0.47.0/allauth/socialaccount/providers/line/tests.py000066400000000000000000000010111415442050100254220ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import LineProvider class LineTests(OAuth2TestsMixin, TestCase): provider_id = LineProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "userId": "u7d47d26a6bab09b95695ff02d1a36e38", "displayName": "\uc774\uc0c1\ud601", "pictureUrl": "http://dl.profile.line-cdn.net/0m055ab14d725138288331268c45ac5286a35482fb794a" }""", ) django-allauth-0.47.0/allauth/socialaccount/providers/line/urls.py000066400000000000000000000002421415442050100252520ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import LineProvider urlpatterns = default_urlpatterns(LineProvider) django-allauth-0.47.0/allauth/socialaccount/providers/line/views.py000066400000000000000000000041051415442050100254240ustar00rootroot00000000000000import requests from datetime import timedelta from django.utils import timezone from allauth.socialaccount import app_settings from allauth.socialaccount.models import SocialToken from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import LineProvider class LineOAuth2Adapter(OAuth2Adapter): provider_id = LineProvider.id access_token_url = "https://api.line.me/oauth2/v2.1/token" authorize_url = "https://access.line.me/oauth2/v2.1/authorize" profile_url = "https://api.line.me/v2/profile" # https://developers.line.biz/en/reference/line-login/#get-user-profile id_token_url = "https://api.line.me/oauth2/v2.1/verify" # https://developers.line.biz/en/reference/line-login/#verify-id-token def parse_token(self, data): """ data: access_token data from line """ settings = app_settings.PROVIDERS.get(self.provider_id, {}) if "email" in settings.get("SCOPE", ""): token = SocialToken(token=data["id_token"]) else: token = SocialToken(token=data["access_token"]) token.token_secret = data.get("refresh_token", "") expires_in = data.get(self.expires_in_key, None) if expires_in: token.expires_at = timezone.now() + timedelta(seconds=int(expires_in)) return token def complete_login(self, request, app, token, **kwargs): settings = app_settings.PROVIDERS.get(self.provider_id, {}) if "email" in settings.get("SCOPE", ""): payload = {"client_id": app.client_id, "id_token": token.token} resp = requests.post(self.id_token_url, payload) else: headers = {"Authorization": "Bearer {0}".format(token.token)} resp = requests.get(self.profile_url, headers=headers) extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(LineOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(LineOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/linkedin/000077500000000000000000000000001415442050100245635ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/linkedin/__init__.py000066400000000000000000000000001415442050100266620ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/linkedin/provider.py000066400000000000000000000042661415442050100267770ustar00rootroot00000000000000from allauth.socialaccount import app_settings from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth.provider import OAuthProvider class LinkedInAccount(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("public-profile-url") def get_avatar_url(self): # try to return the higher res picture-urls::(original) first try: if self.account.extra_data.get("picture-urls", {}).get("picture-url"): return self.account.extra_data.get("picture-urls", {}).get( "picture-url" ) except Exception: # if we can't get higher res for any reason, we'll just return the # low res pass return self.account.extra_data.get("picture-url") def to_str(self): dflt = super(LinkedInAccount, self).to_str() name = self.account.extra_data.get("name", dflt) first_name = self.account.extra_data.get("first-name", None) last_name = self.account.extra_data.get("last-name", None) if first_name and last_name: name = first_name + " " + last_name return name class LinkedInProvider(OAuthProvider): id = "linkedin" name = "LinkedIn" account_class = LinkedInAccount def get_default_scope(self): scope = [] if app_settings.QUERY_EMAIL: scope.append("r_emailaddress") return scope def get_profile_fields(self): default_fields = [ "id", "first-name", "last-name", "email-address", "picture-url", "picture-urls::(original)", # picture-urls::(original) is higher res "public-profile-url", ] fields = self.get_settings().get("PROFILE_FIELDS", default_fields) return fields def extract_uid(self, data): return data["id"] def extract_common_fields(self, data): return dict( email=data.get("email-address"), first_name=data.get("first-name"), last_name=data.get("last-name"), ) provider_classes = [LinkedInProvider] django-allauth-0.47.0/allauth/socialaccount/providers/linkedin/tests.py000066400000000000000000000016041415442050100263000ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals from allauth.socialaccount.tests import OAuthTestsMixin from allauth.tests import MockedResponse, TestCase from .provider import LinkedInProvider class LinkedInTests(OAuthTestsMixin, TestCase): provider_id = LinkedInProvider.id def get_mocked_response(self): return [ MockedResponse( 200, """ oKmTqN2ffc R@ymØnd Pènnèrs raymond.penners@example.com http://m.c.lnkd.licdn.com/mpr/mprx/0_e0hbvSLc8QWo3ggPeVKqvaFR860d342Pogq4vakwx8IJOyR1XJrwRmr5mIx9C0DxWpGMsW9Lb8EQ http://www.linkedin.com/in/intenct """, ) ] django-allauth-0.47.0/allauth/socialaccount/providers/linkedin/urls.py000066400000000000000000000002511415442050100261200ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth.urls import default_urlpatterns from .provider import LinkedInProvider urlpatterns = default_urlpatterns(LinkedInProvider) django-allauth-0.47.0/allauth/socialaccount/providers/linkedin/views.py000066400000000000000000000041541415442050100262760ustar00rootroot00000000000000from xml.etree import ElementTree from xml.parsers.expat import ExpatError from allauth.socialaccount import providers from allauth.socialaccount.providers.oauth.client import OAuth from allauth.socialaccount.providers.oauth.views import ( OAuthAdapter, OAuthCallbackView, OAuthLoginView, ) from .provider import LinkedInProvider class LinkedInAPI(OAuth): url = "https://api.linkedin.com/v1/people/~" def get_user_info(self): fields = providers.registry.by_id( LinkedInProvider.id, self.request ).get_profile_fields() url = self.url + ":(%s)" % ",".join(fields) raw_xml = self.query(url) try: return self.to_dict(ElementTree.fromstring(raw_xml)) except (ExpatError, KeyError, IndexError): return None def to_dict(self, xml): """ Convert XML structure to dict recursively, repeated keys entries are returned as in list containers. """ children = list(xml) if not children: return xml.text else: out = {} for node in list(xml): if node.tag in out: if not isinstance(out[node.tag], list): out[node.tag] = [out[node.tag]] out[node.tag].append(self.to_dict(node)) else: out[node.tag] = self.to_dict(node) return out class LinkedInOAuthAdapter(OAuthAdapter): provider_id = LinkedInProvider.id request_token_url = "https://api.linkedin.com/uas/oauth/requestToken" access_token_url = "https://api.linkedin.com/uas/oauth/accessToken" authorize_url = "https://www.linkedin.com/uas/oauth/authenticate" def complete_login(self, request, app, token, response): client = LinkedInAPI(request, app.client_id, app.secret, self.request_token_url) extra_data = client.get_user_info() return self.get_provider().sociallogin_from_response(request, extra_data) oauth_login = OAuthLoginView.adapter_view(LinkedInOAuthAdapter) oauth_callback = OAuthCallbackView.adapter_view(LinkedInOAuthAdapter) django-allauth-0.47.0/allauth/socialaccount/providers/linkedin_oauth2/000077500000000000000000000000001415442050100260455ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/linkedin_oauth2/__init__.py000066400000000000000000000000001415442050100301440ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/linkedin_oauth2/provider.py000066400000000000000000000122371415442050100302560ustar00rootroot00000000000000from allauth.socialaccount import app_settings from allauth.socialaccount.providers.base import ( ProviderAccount, ProviderException, ) from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider def _extract_name_field(data, field_name): ret = "" v = data.get(field_name, {}) if v: if isinstance(v, str): # Old V1 data ret = v else: localized = v.get("localized", {}) preferred_locale = v.get( "preferredLocale", {"country": "US", "language": "en"} ) locale_key = "_".join( [preferred_locale["language"], preferred_locale["country"]] ) if locale_key in localized: ret = localized.get(locale_key) elif localized: ret = next(iter(localized.values())) return ret def _extract_email(data): """ {'elements': [{'handle': 'urn:li:emailAddress:319371470', 'handle~': {'emailAddress': 'raymond.penners@intenct.nl'}}]} """ ret = "" elements = data.get("elements", []) if len(elements) > 0: ret = elements[0].get("handle~", {}).get("emailAddress", "") return ret class LinkedInOAuth2Account(ProviderAccount): def to_str(self): ret = super(LinkedInOAuth2Account, self).to_str() first_name = _extract_name_field(self.account.extra_data, "firstName") last_name = _extract_name_field(self.account.extra_data, "lastName") if first_name or last_name: ret = " ".join([first_name, last_name]).strip() return ret def get_avatar_url(self): """ Attempts the load the avatar associated to the avatar. Requires the `profilePicture(displayImage~:playableStreams)` profile field configured in settings.py :return: """ provider_configuration = self.account.get_provider().get_settings() configured_profile_fields = provider_configuration.get("PROFILE_FIELDS", []) # Can't get the avatar when this field is not specified picture_field = "profilePicture(displayImage~:playableStreams)" if picture_field not in configured_profile_fields: return super(LinkedInOAuth2Account, self).get_avatar_url() # Iterate over the fields and attempt to get it by configured size profile_picture_config = provider_configuration.get("PROFILEPICTURE", {}) req_size = profile_picture_config.get("display_size_w_h", (100.0, 100.0)) req_auth_method = profile_picture_config.get("authorization_method", "PUBLIC") # Iterate over the data returned by the provider profile_elements = ( self.account.extra_data.get("profilePicture", {}) .get("displayImage~", {}) .get("elements", []) ) for single_element in profile_elements: if not req_auth_method == single_element["authorizationMethod"]: continue # Get the dimensions from the payload image_data = ( single_element.get("data", {}) .get("com.linkedin.digitalmedia.mediaartifact.StillImage", {}) .get("displaySize", {}) ) if not image_data: continue width, height = image_data["width"], image_data["height"] if not width or not height: continue if not width == req_size[0] or not height == req_size[1]: continue # Get the uri since actual size matches the requested size. to_return = single_element.get("identifiers", [{},])[ 0 ].get("identifier") if to_return: return to_return return super(LinkedInOAuth2Account, self).get_avatar_url() class LinkedInOAuth2Provider(OAuth2Provider): id = "linkedin_oauth2" # Name is displayed to ordinary users -- don't include protocol name = "LinkedIn" account_class = LinkedInOAuth2Account def extract_uid(self, data): if "id" not in data: raise ProviderException( "LinkedIn encountered an internal error while logging in. \ Please try again." ) return str(data["id"]) def get_profile_fields(self): default_fields = [ "id", "firstName", "lastName", # This would be needed to in case you need access to the image # URL. Not enabling this by default due to the amount of data # returned. # # 'profilePicture(displayImage~:playableStreams)' ] fields = self.get_settings().get("PROFILE_FIELDS", default_fields) return fields def get_default_scope(self): scope = ["r_liteprofile"] if app_settings.QUERY_EMAIL: scope.append("r_emailaddress") return scope def extract_common_fields(self, data): return dict( first_name=_extract_name_field(data, "firstName"), last_name=_extract_name_field(data, "lastName"), email=_extract_email(data), ) provider_classes = [LinkedInOAuth2Provider] django-allauth-0.47.0/allauth/socialaccount/providers/linkedin_oauth2/tests.py000066400000000000000000000331001415442050100275560ustar00rootroot00000000000000# -*- coding: utf-8 -*- from json import loads from django.test.client import RequestFactory from django.test.utils import override_settings from allauth.socialaccount.models import SocialAccount from allauth.socialaccount.providers.base import ProviderException from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import LinkedInOAuth2Provider class LinkedInOAuth2Tests(OAuth2TestsMixin, TestCase): provider_id = LinkedInOAuth2Provider.id def get_mocked_response(self): return MockedResponse( 200, """ { "profilePicture": { "displayImage": "urn:li:digitalmediaAsset:12345abcdefgh-12abcd" }, "id": "1234567", "lastName": { "preferredLocale": { "language": "en", "country": "US" }, "localized": { "en_US": "Penners" } }, "firstName": { "preferredLocale": { "language": "en", "country": "US" }, "localized": { "en_US": "Raymond" } } } """, ) def test_data_to_str(self): data = { "emailAddress": "john@doe.org", "firstName": "John", "id": "a1b2c3d4e", "lastName": "Doe", "pictureUrl": "https://media.licdn.com/mpr/foo", "pictureUrls": { "_total": 1, "values": ["https://media.licdn.com/foo"], }, "publicProfileUrl": "https://www.linkedin.com/in/johndoe", } acc = SocialAccount(extra_data=data, provider="linkedin_oauth2") self.assertEqual(acc.get_provider_account().to_str(), "John Doe") def test_get_avatar_url_no_picture_setting(self): extra_data = """ { "profilePicture": { "displayImage": "urn:li:digitalmediaAsset:12345abcdefgh-12abcd" }, "id": "1234567", "lastName": { "preferredLocale": { "language": "en", "country": "US" }, "localized": { "en_US": "Penners" } }, "firstName": { "preferredLocale": { "language": "en", "country": "US" }, "localized": { "en_US": "Raymond" } } } """ acc = SocialAccount( extra_data=loads(extra_data), provider="linkedin_oauth2", ) self.assertIsNone(acc.get_avatar_url()) @override_settings( SOCIALACCOUNT_PROVIDERS={ "linkedin_oauth2": { "PROFILE_FIELDS": [ "id", "firstName", "lastName", "profilePicture(displayImage~:playableStreams)", ], "PROFILEPICTURE": { "display_size_w_h": (400, 400.0), }, }, } ) def test_get_avatar_url_with_setting(self): extra_data = """ { "profilePicture": { "displayImage": "urn:li:digitalmediaAsset:12345abcdefgh-12abcd" }, "id": "1234567", "lastName": { "preferredLocale": { "language": "en", "country": "US" }, "localized": { "en_US": "Penners" } }, "firstName": { "preferredLocale": { "language": "en", "country": "US" }, "localized": { "en_US": "Raymond" } } } """ acc = SocialAccount( extra_data=loads(extra_data), provider="linkedin_oauth2", ) self.assertIsNone(acc.get_avatar_url()) @override_settings( SOCIALACCOUNT_PROVIDERS={ "linkedin_oauth2": { "PROFILE_FIELDS": [ "id", "firstName", "lastName", "profilePicture(displayImage~:playableStreams)", ], "PROFILEPICTURE": { "display_size_w_h": (100, 100.0), }, }, } ) def test_get_avatar_url_with_picture(self): extra_data = """ { "profilePicture": { "displayImage": "urn:li:digitalmediaAsset:12345abcdefgh-12abcd" }, "id": "1234567", "lastName": { "preferredLocale": { "language": "en", "country": "US" }, "localized": { "en_US": "Penners" } }, "firstName": { "preferredLocale": { "language": "en", "country": "US" }, "localized": { "en_US": "Raymond" } }, "profilePicture": { "displayImage~": { "elements": [ { "authorizationMethod": "PUBLIC", "data": { "com.linkedin.digitalmedia.mediaartifact.StillImage": { "storageSize": { "height": 100, "width": 100 }, "storageAspectRatio": { "heightAspect": 1.0, "formatted": "1.00:1.00", "widthAspect": 1.0 }, "displaySize": { "height": 100.0, "width": 100.0, "uom": "PX" }, "rawCodecSpec": { "name": "jpeg", "type": "image" }, "displayAspectRatio": { "heightAspect": 1.0, "formatted": "1.00:1.00", "widthAspect": 1.0 }, "mediaType": "image/jpeg" } }, "artifact": "urn:li:digitalmediaMediaArtifact:avatar", "identifiers": [ { "identifierExpiresInSeconds": 4, "file": "urn:li:digitalmediaFile:this-is-the-link", "index": 0, "identifier": "this-is-the-link", "mediaType": "image/jpeg", "identifierType": "EXTERNAL_URL" } ] } ] } } } """ acc = SocialAccount( extra_data=loads(extra_data), provider="linkedin_oauth2", ) self.assertEqual("this-is-the-link", acc.get_avatar_url()) @override_settings( SOCIALACCOUNT_PROVIDERS={ "linkedin_oauth2": { "PROFILE_FIELDS": [ "id", "firstName", "lastName", "profilePicture(displayImage~:playableStreams)", ], "PROFILEPICTURE": { "display_size_w_h": (400, 400.0), }, }, } ) def test_get_avatar_url_size_mismatch(self): extra_data = """ { "profilePicture": { "displayImage": "urn:li:digitalmediaAsset:12345abcdefgh-12abcd" }, "id": "1234567", "lastName": { "preferredLocale": { "language": "en", "country": "US" }, "localized": { "en_US": "Penners" } }, "firstName": { "preferredLocale": { "language": "en", "country": "US" }, "localized": { "en_US": "Raymond" } }, "profilePicture": { "displayImage~": { "elements": [ { "authorizationMethod": "PUBLIC", "data": { "com.linkedin.digitalmedia.mediaartifact.StillImage": { "storageSize": { "height": 100, "width": 100 }, "storageAspectRatio": { "heightAspect": 1.0, "formatted": "1.00:1.00", "widthAspect": 1.0 }, "displaySize": { "height": 100.0, "width": 100.0, "uom": "PX" }, "rawCodecSpec": { "name": "jpeg", "type": "image" }, "displayAspectRatio": { "heightAspect": 1.0, "formatted": "1.00:1.00", "widthAspect": 1.0 }, "mediaType": "image/jpeg" } }, "artifact": "urn:li:digitalmediaMediaArtifact:avatar", "identifiers": [ { "identifierExpiresInSeconds": 4, "file": "urn:li:digitalmediaFile:this-is-the-link", "index": 0, "identifier": "this-is-the-link", "mediaType": "image/jpeg", "identifierType": "EXTERNAL_URL" } ] } ] } } } """ acc = SocialAccount( extra_data=loads(extra_data), provider="linkedin_oauth2", ) self.assertIsNone(acc.get_avatar_url()) @override_settings( SOCIALACCOUNT_PROVIDERS={ "linkedin_oauth2": { "PROFILE_FIELDS": [ "id", "firstName", "lastName", "profilePicture(displayImage~:playableStreams)", ], "PROFILEPICTURE": { "display_size_w_h": (400, 400.0), }, }, } ) def test_get_avatar_url_auth_mismatch(self): extra_data = """ { "profilePicture": { "displayImage": "urn:li:digitalmediaAsset:12345abcdefgh-12abcd" }, "id": "1234567", "lastName": { "preferredLocale": { "language": "en", "country": "US" }, "localized": { "en_US": "Penners" } }, "firstName": { "preferredLocale": { "language": "en", "country": "US" }, "localized": { "en_US": "Raymond" } }, "profilePicture": { "displayImage~": { "elements": [ { "authorizationMethod": "PRIVATE", "data": { "com.linkedin.digitalmedia.mediaartifact.StillImage": { "storageSize": { "height": 100, "width": 100 }, "storageAspectRatio": { "heightAspect": 1.0, "formatted": "1.00:1.00", "widthAspect": 1.0 }, "displaySize": { "height": 100.0, "width": 100.0, "uom": "PX" }, "rawCodecSpec": { "name": "jpeg", "type": "image" }, "displayAspectRatio": { "heightAspect": 1.0, "formatted": "1.00:1.00", "widthAspect": 1.0 }, "mediaType": "image/jpeg" } }, "artifact": "urn:li:digitalmediaMediaArtifact:avatar", "identifiers": [ { "identifierExpiresInSeconds": 4, "file": "urn:li:digitalmediaFile:this-is-the-link", "index": 0, "identifier": "this-is-the-link", "mediaType": "image/jpeg", "identifierType": "EXTERNAL_URL" } ] } ] } } } """ acc = SocialAccount( extra_data=loads(extra_data), provider="linkedin_oauth2", ) self.assertIsNone(acc.get_avatar_url()) @override_settings( SOCIALACCOUNT_PROVIDERS={ "linkedin_oauth2": { "PROFILE_FIELDS": [ "id", "firstName", "lastName", "profilePicture(displayImage~:playableStreams)", ], "PROFILEPICTURE": { "display_size_w_h": (100, 100), }, }, } ) def test_get_avatar_url_float_vs_int(self): extra_data = """ { "profilePicture": { "displayImage": "urn:li:digitalmediaAsset:12345abcdefgh-12abcd" }, "id": "1234567", "lastName": { "preferredLocale": { "language": "en", "country": "US" }, "localized": { "en_US": "Penners" } }, "firstName": { "preferredLocale": { "language": "en", "country": "US" }, "localized": { "en_US": "Raymond" } }, "profilePicture": { "displayImage~": { "elements": [ { "authorizationMethod": "PUBLIC", "data": { "com.linkedin.digitalmedia.mediaartifact.StillImage": { "storageSize": { "height": 100, "width": 100 }, "storageAspectRatio": { "heightAspect": 1.0, "formatted": "1.00:1.00", "widthAspect": 1.0 }, "displaySize": { "height": 100.0, "width": 100.0, "uom": "PX" }, "rawCodecSpec": { "name": "jpeg", "type": "image" }, "displayAspectRatio": { "heightAspect": 1.0, "formatted": "1.00:1.00", "widthAspect": 1.0 }, "mediaType": "image/jpeg" } }, "artifact": "urn:li:digitalmediaMediaArtifact:avatar", "identifiers": [ { "identifierExpiresInSeconds": 4, "file": "urn:li:digitalmediaFile:this-is-the-link", "index": 0, "identifier": "this-is-the-link", "mediaType": "image/jpeg", "identifierType": "EXTERNAL_URL" } ] } ] } } } """ acc = SocialAccount( extra_data=loads(extra_data), provider="linkedin_oauth2", ) self.assertEqual("this-is-the-link", acc.get_avatar_url()) def test_id_missing(self): extra_data = """ { "profilePicture": { "displayImage": "urn:li:digitalmediaAsset:12345abcdefgh-12abcd" }, "Id": "1234567" } """ provider = LinkedInOAuth2Provider(RequestFactory().get("/login")) self.assertRaises(ProviderException, provider.extract_uid, loads(extra_data)) django-allauth-0.47.0/allauth/socialaccount/providers/linkedin_oauth2/urls.py000066400000000000000000000002661415442050100274100ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import LinkedInOAuth2Provider urlpatterns = default_urlpatterns(LinkedInOAuth2Provider) django-allauth-0.47.0/allauth/socialaccount/providers/linkedin_oauth2/views.py000066400000000000000000000035411415442050100275570ustar00rootroot00000000000000import requests from allauth.socialaccount import app_settings from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import LinkedInOAuth2Provider class LinkedInOAuth2Adapter(OAuth2Adapter): provider_id = LinkedInOAuth2Provider.id access_token_url = "https://www.linkedin.com/oauth/v2/accessToken" authorize_url = "https://www.linkedin.com/oauth/v2/authorization" profile_url = "https://api.linkedin.com/v2/me" email_url = "https://api.linkedin.com/v2/emailAddress?q=members&projection=(elements*(handle~))" # noqa # See: # http://developer.linkedin.com/forum/unauthorized-invalid-or-expired-token-immediately-after-receiving-oauth2-token?page=1 # noqa access_token_method = "GET" def complete_login(self, request, app, token, **kwargs): extra_data = self.get_user_info(token) return self.get_provider().sociallogin_from_response(request, extra_data) def get_user_info(self, token): fields = self.get_provider().get_profile_fields() headers = {} headers.update(self.get_provider().get_settings().get("HEADERS", {})) headers["Authorization"] = " ".join(["Bearer", token.token]) info = {} if app_settings.QUERY_EMAIL: resp = requests.get(self.email_url, headers=headers) # If this response goes wrong, that is not a blocker in order to # continue. if resp.ok: info = resp.json() url = self.profile_url + "?projection=(%s)" % ",".join(fields) resp = requests.get(url, headers=headers) resp.raise_for_status() info.update(resp.json()) return info oauth2_login = OAuth2LoginView.adapter_view(LinkedInOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(LinkedInOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/mailchimp/000077500000000000000000000000001415442050100247315ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/mailchimp/__init__.py000066400000000000000000000000001415442050100270300ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/mailchimp/provider.py000066400000000000000000000026031415442050100271360ustar00rootroot00000000000000"""Customise Provider classes for MailChimp API v3.""" from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class MailChimpAccount(ProviderAccount): """ProviderAccount subclass for MailChimp.""" def get_profile_url(self): """Return base profile url.""" return self.account.extra_data["api_endpoint"] def get_avatar_url(self): """Return avatar url.""" return self.account.extra_data["login"]["avatar"] class MailChimpProvider(OAuth2Provider): """OAuth2Provider subclass for MailChimp v3.""" id = "mailchimp" name = "MailChimp" account_class = MailChimpAccount def extract_uid(self, data): """Extract uid ('user_id') and ensure it's a str.""" return str(data["user_id"]) def get_default_scope(self): """Ensure scope is null to fit their API.""" return [""] def extract_common_fields(self, data): """Extract fields from a metadata query.""" return dict( dc=data.get("dc"), role=data.get("role"), account_name=data.get("accountname"), user_id=data.get("user_id"), login=data.get("login"), login_url=data.get("login_url"), api_endpoint=data.get("api_endpoint"), ) provider_classes = [MailChimpProvider] django-allauth-0.47.0/allauth/socialaccount/providers/mailchimp/tests.py000066400000000000000000000020531415442050100264450ustar00rootroot00000000000000"""Test MailChimp OAuth2 v3 Flow.""" from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import MailChimpProvider class MailChimpTests(OAuth2TestsMixin, TestCase): """Test Class for MailChimp OAuth2 v3.""" provider_id = MailChimpProvider.id def get_mocked_response(self): """Test authentication with an non-null avatar.""" return MockedResponse( 200, """{ "dc": "usX", "role": "owner", "accountname": "Name can have spaces", "user_id": "99999999", "login": { "email": "test@example.com", "avatar": "http://gallery.mailchimp.com/1a1a/avatar/2a2a.png", "login_id": "88888888", "login_name": "test@example.com", "login_email": "test@example.com" }, "login_url": "https://login.mailchimp.com", "api_endpoint": "https://usX.api.mailchimp.com" }""", ) django-allauth-0.47.0/allauth/socialaccount/providers/mailchimp/urls.py000066400000000000000000000003261415442050100262710ustar00rootroot00000000000000"""Register urls for MailChimpProvider""" from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import MailChimpProvider urlpatterns = default_urlpatterns(MailChimpProvider) django-allauth-0.47.0/allauth/socialaccount/providers/mailchimp/views.py000066400000000000000000000020571415442050100264440ustar00rootroot00000000000000"""Views for MailChimp API v3.""" import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import MailChimpProvider class MailChimpOAuth2Adapter(OAuth2Adapter): """OAuth2Adapter for MailChimp API v3.""" provider_id = MailChimpProvider.id authorize_url = "https://login.mailchimp.com/oauth2/authorize" access_token_url = "https://login.mailchimp.com/oauth2/token" profile_url = "https://login.mailchimp.com/oauth2/metadata" def complete_login(self, request, app, token, **kwargs): """Complete login, ensuring correct OAuth header.""" headers = {"Authorization": "OAuth {0}".format(token.token)} metadata = requests.get(self.profile_url, headers=headers) extra_data = metadata.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(MailChimpOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(MailChimpOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/mailru/000077500000000000000000000000001415442050100242575ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/mailru/__init__.py000066400000000000000000000000001415442050100263560ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/mailru/provider.py000066400000000000000000000023441415442050100264660ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class MailRuAccount(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("link") def get_avatar_url(self): ret = None if self.account.extra_data.get("has_pic"): pic_big_url = self.account.extra_data.get("pic_big") pic_small_url = self.account.extra_data.get("pic_small") if pic_big_url: return pic_big_url elif pic_small_url: return pic_small_url else: return ret def to_str(self): dflt = super(MailRuAccount, self).to_str() return self.account.extra_data.get("name", dflt) class MailRuProvider(OAuth2Provider): id = "mailru" name = "Mail.RU" account_class = MailRuAccount def extract_uid(self, data): return data["uid"] def extract_common_fields(self, data): return dict( email=data.get("email"), last_name=data.get("last_name"), username=data.get("nick"), first_name=data.get("first_name"), ) provider_classes = [MailRuProvider] django-allauth-0.47.0/allauth/socialaccount/providers/mailru/tests.py000066400000000000000000000027761415442050100260070ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import absolute_import, unicode_literals from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import MailRuProvider class MailRuTests(OAuth2TestsMixin, TestCase): provider_id = MailRuProvider.id def get_mocked_response(self, verified_email=True): return MockedResponse( 200, """ [ { "uid": "15410773191172635989", "first_name": "Евгений", "last_name": "Маслов", "nick": "maslov", "email": "emaslov@mail.ru", "sex": 0, "birthday": "15.02.1980", "has_pic": 1, "pic": "http://avt.appsmail.ru/mail/emaslov/_avatar", "pic_small": "http://avt.appsmail.ru/mail/emaslov/_avatarsmall", "pic_big": "http://avt.appsmail.ru/mail/emaslov/_avatarbig", "link": "http://my.mail.ru/mail/emaslov/", "referer_type": "", "referer_id": "", "is_online": 1, "friends_count": 145, "is_verified": 1, "vip" : 0, "app_installed": 1, "location": { "country": { "name": "Россия", "id": "24" }, "city": { "name": "Москва", "id": "25" }, "region": { "name": "Москва", "id": "999999" } } }]""", ) # noqa def get_login_response_json(self, with_refresh_token=True): # FIXME: This is not an actual response. I added this in order # to get the test suite going but did not verify to check the # exact response being returned. return '{"access_token": "testac", "uid": "weibo", "refresh_token": "testrf", "x_mailru_vid": "1"}' # noqa django-allauth-0.47.0/allauth/socialaccount/providers/mailru/urls.py000066400000000000000000000002461415442050100256200ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import MailRuProvider urlpatterns = default_urlpatterns(MailRuProvider) django-allauth-0.47.0/allauth/socialaccount/providers/mailru/views.py000066400000000000000000000023241415442050100257670ustar00rootroot00000000000000import requests from hashlib import md5 from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import MailRuProvider class MailRuOAuth2Adapter(OAuth2Adapter): provider_id = MailRuProvider.id access_token_url = "https://connect.mail.ru/oauth/token" authorize_url = "https://connect.mail.ru/oauth/authorize" profile_url = "http://www.appsmail.ru/platform/api" def complete_login(self, request, app, token, **kwargs): uid = kwargs["response"]["x_mailru_vid"] data = { "method": "users.getInfo", "app_id": app.client_id, "secure": "1", "uids": uid, } param_list = sorted([item + "=" + data[item] for item in data]) data["sig"] = md5( ("".join(param_list) + app.secret).encode("utf-8") ).hexdigest() response = requests.get(self.profile_url, params=data) extra_data = response.json()[0] return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(MailRuOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(MailRuOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/mediawiki/000077500000000000000000000000001415442050100247315ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/mediawiki/__init__.py000066400000000000000000000000001415442050100270300ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/mediawiki/provider.py000066400000000000000000000032331415442050100271360ustar00rootroot00000000000000from typing import Optional from django.conf import settings from allauth.account.models import EmailAddress from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider settings = getattr(settings, "SOCIALACCOUNT_PROVIDERS", {}).get("mediawiki", {}) class MediaWikiAccount(ProviderAccount): def get_profile_url(self): userpage = settings.get( "USERPAGE_TEMPLATE", "https://meta.wikimedia.org/wiki/User:{username}" ) username = self.account.extra_data.get("username") if not username: return None return userpage.format(username=username.replace(" ", "_")) def to_str(self): dflt = super(MediaWikiAccount, self).to_str() return self.account.extra_data.get("username", dflt) class MediaWikiProvider(OAuth2Provider): id = "mediawiki" name = "MediaWiki" account_class = MediaWikiAccount @staticmethod def _get_email(data: dict) -> Optional[str]: if data.get("confirmed_email"): return data.get("email") return None def extract_uid(self, data): return str(data["sub"]) def extract_extra_data(self, data): return dict( username=data.get("username"), ) def extract_common_fields(self, data): return dict( email=self._get_email(data), username=data.get("username"), name=data.get("realname"), ) def extract_email_addresses(self, data): return [EmailAddress(email=self._get_email(data), verified=True, primary=True)] provider_classes = [MediaWikiProvider] django-allauth-0.47.0/allauth/socialaccount/providers/mediawiki/tests.py000066400000000000000000000020141415442050100264420ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import MediaWikiProvider class MediaWikiTests(OAuth2TestsMixin, TestCase): provider_id = MediaWikiProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "iss": "https://meta.wikimedia.org", "sub": 12345, "aud": "1234567890abcdef", "exp": 946681300, "iat": 946681200, "username": "John Doe", "editcount": 123, "confirmed_email": true, "blocked": false, "registered": "20000101000000", "groups": ["*", "user", "autoconfirmed"], "rights": ["read", "edit"], "grants": ["basic"], "email": "johndoe@example.com" } """, ) django-allauth-0.47.0/allauth/socialaccount/providers/mediawiki/urls.py000066400000000000000000000002541415442050100262710ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import MediaWikiProvider urlpatterns = default_urlpatterns(MediaWikiProvider) django-allauth-0.47.0/allauth/socialaccount/providers/mediawiki/views.py000066400000000000000000000021601415442050100264370ustar00rootroot00000000000000import requests from django.conf import settings from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import MediaWikiProvider settings = getattr(settings, "SOCIALACCOUNT_PROVIDERS", {}).get("mediawiki", {}) class MediaWikiOAuth2Adapter(OAuth2Adapter): provider_id = MediaWikiProvider.id REST_API = settings.get("REST_API", "https://meta.wikimedia.org/w/rest.php") access_token_url = REST_API + "/oauth2/access_token" authorize_url = REST_API + "/oauth2/authorize" profile_url = REST_API + "/oauth2/resource/profile" def complete_login(self, request, app, token, **kwargs): resp = requests.get( self.profile_url, headers={"Authorization": "Bearer {token}".format(token=token.token)}, ) resp.raise_for_status() extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(MediaWikiOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(MediaWikiOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/meetup/000077500000000000000000000000001415442050100242655ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/meetup/__init__.py000066400000000000000000000000001415442050100263640ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/meetup/models.py000066400000000000000000000000001415442050100261100ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/meetup/provider.py000066400000000000000000000010041415442050100264640ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class MeetupAccount(ProviderAccount): pass class MeetupProvider(OAuth2Provider): id = "meetup" name = "Meetup" account_class = MeetupAccount def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): return dict(email=data.get("email"), name=data.get("name")) provider_classes = [MeetupProvider] django-allauth-0.47.0/allauth/socialaccount/providers/meetup/tests.py000066400000000000000000000027411415442050100260050ustar00rootroot00000000000000from allauth.socialaccount.providers import registry from allauth.socialaccount.tests import create_oauth2_tests from allauth.tests import MockedResponse from .provider import MeetupProvider class MeetupTests(create_oauth2_tests(registry.by_id(MeetupProvider.id))): def get_mocked_response(self): return MockedResponse( 200, """ {"id": 1, "lang": "en_US", "city": "Bhubaneswar", "photo": { "thumb_link":"", "photo_id": 240057062, "highres_link":"", "base_url": "http://photos2.meetupstatic.com", "type": "member", "name": "Abhishek Jaiswal", "other_services": {}, "country": "in", "topics": [{"name": "Open Source", "urlkey": "opensource", "id": 563}, {"name": "Python", "urlkey": "python", "id": 1064}, {"name": "Software Development", "urlkey": "softwaredev", "id": 3833}, {"name": "Computer programming", "urlkey": "computer-programming", "id": 48471}, {"name": "Python Web Development", "urlkey": "python-web-development", "id": 917242}, {"name": "Data Science using Python", "urlkey": "data-science-using-python", "id": 1481522}], "lon": 85.83999633789062, "joined": 1411642310000, "id": 173662372, "status": "active", "link": "http://www.meetup.com/members/173662372", "hometown": "Kolkata", "lat": 20.270000457763672, "visited": 1488829924000, "self": {"common": {}}}}""", ) django-allauth-0.47.0/allauth/socialaccount/providers/meetup/urls.py000066400000000000000000000002461415442050100256260ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import MeetupProvider urlpatterns = default_urlpatterns(MeetupProvider) django-allauth-0.47.0/allauth/socialaccount/providers/meetup/views.py000066400000000000000000000015161415442050100257770ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import MeetupProvider class MeetupOAuth2Adapter(OAuth2Adapter): provider_id = MeetupProvider.id access_token_url = "https://secure.meetup.com/oauth2/access" authorize_url = "https://secure.meetup.com/oauth2/authorize" profile_url = "https://api.meetup.com/2/member/self" def complete_login(self, request, app, token, **kwargs): resp = requests.get(self.profile_url, params={"access_token": token.token}) extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(MeetupOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(MeetupOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/microsoft/000077500000000000000000000000001415442050100247735ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/microsoft/__init__.py000066400000000000000000000000001415442050100270720ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/microsoft/models.py000066400000000000000000000000331415442050100266240ustar00rootroot00000000000000# Create your models here. django-allauth-0.47.0/allauth/socialaccount/providers/microsoft/provider.py000066400000000000000000000023141415442050100271770ustar00rootroot00000000000000from __future__ import unicode_literals from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class MicrosoftGraphAccount(ProviderAccount): def to_str(self): name = self.account.extra_data.get("displayName") if name and name.strip() != "": return name return super(MicrosoftGraphAccount, self).to_str() class MicrosoftGraphProvider(OAuth2Provider): id = str("microsoft") name = "Microsoft Graph" account_class = MicrosoftGraphAccount def get_default_scope(self): """ Doc on scopes available at https://developer.microsoft.com/en-us/graph/docs/concepts/permissions_reference """ return ["User.Read"] def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): email = data.get("mail") or data.get("userPrincipalName") username = data.get("mailNickname") return dict( username=username, email=email, last_name=data.get("surname"), first_name=data.get("givenName"), ) provider_classes = [MicrosoftGraphProvider] django-allauth-0.47.0/allauth/socialaccount/providers/microsoft/tests.py000066400000000000000000000037011415442050100265100ustar00rootroot00000000000000import json from allauth.socialaccount.providers.oauth2.client import OAuth2Error from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import MicrosoftGraphProvider from .views import _check_errors class MicrosoftGraphTests(OAuth2TestsMixin, TestCase): provider_id = MicrosoftGraphProvider.id def get_mocked_response(self): response_data = """ { "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users/$entity", "id": "16f5a7b6-5a15-4568-aa5a-31bb117e9967", "businessPhones": [], "displayName": "Anne Weiler", "givenName": "Anne", "jobTitle": "Manufacturing Lead", "mail": "annew@CIE493742.onmicrosoft.com", "mobilePhone": "+1 3528700812", "officeLocation": null, "preferredLanguage": "en-US", "surname": "Weiler", "userPrincipalName": "annew@CIE493742.onmicrosoft.com", "mailNickname": "annew" } """ # noqa return MockedResponse(200, response_data) def test_invalid_data(self): response = MockedResponse(200, json.dumps({})) with self.assertRaises(OAuth2Error): # No id, raises _check_errors(response) def test_profile_invalid_response(self): data = { "error": { "code": "InvalidAuthenticationToken", "message": "Access token validation failure. Invalid audience.", } } response = MockedResponse(401, json.dumps(data)) with self.assertRaises(OAuth2Error): # no id, 4xx code, raises with message _check_errors(response) def test_invalid_response(self): response = MockedResponse(200, "invalid json data") with self.assertRaises(OAuth2Error): # bad json, raises _check_errors(response) django-allauth-0.47.0/allauth/socialaccount/providers/microsoft/urls.py000066400000000000000000000002661415442050100263360ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import MicrosoftGraphProvider urlpatterns = default_urlpatterns(MicrosoftGraphProvider) django-allauth-0.47.0/allauth/socialaccount/providers/microsoft/views.py000066400000000000000000000045601415442050100265070ustar00rootroot00000000000000from __future__ import unicode_literals import json import requests from allauth.socialaccount.providers.oauth2.client import OAuth2Error from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import MicrosoftGraphProvider def _check_errors(response): try: data = response.json() except json.decoder.JSONDecodeError: raise OAuth2Error( "Invalid JSON from Microsoft Graph API: {}".format(response.text) ) if "id" not in data: error_message = "Error retrieving Microsoft profile" microsoft_error_message = data.get("error", {}).get("message") if microsoft_error_message: error_message = ": ".join((error_message, microsoft_error_message)) raise OAuth2Error(error_message) return data class MicrosoftGraphOAuth2Adapter(OAuth2Adapter): provider_id = MicrosoftGraphProvider.id def __init__(self, request): super(MicrosoftGraphOAuth2Adapter, self).__init__(request) provider = self.get_provider() tenant = provider.get_settings().get("tenant") or "common" user_properties = ( "businessPhones", "displayName", "givenName", "id", "jobTitle", "mail", "mobilePhone", "officeLocation", "preferredLanguage", "surname", "userPrincipalName", "mailNickname", ) base_url = "https://login.microsoftonline.com/{0}".format(tenant) self.access_token_url = "{0}/oauth2/v2.0/token".format(base_url) self.authorize_url = "{0}/oauth2/v2.0/authorize".format(base_url) self.profile_url = "https://graph.microsoft.com/v1.0/me/" self.profile_url_params = {"$select": ",".join(user_properties)} def complete_login(self, request, app, token, **kwargs): headers = {"Authorization": "Bearer {0}".format(token.token)} response = requests.get( self.profile_url, self.profile_url_params, headers=headers ) extra_data = _check_errors(response) return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(MicrosoftGraphOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(MicrosoftGraphOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/naver/000077500000000000000000000000001415442050100241015ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/naver/__init__.py000066400000000000000000000000001415442050100262000ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/naver/models.py000066400000000000000000000000001415442050100257240ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/naver/provider.py000066400000000000000000000016631415442050100263130ustar00rootroot00000000000000from allauth.account.models import EmailAddress from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class NaverAccount(ProviderAccount): def get_avatar_url(self): return self.account.extra_data.get("profile_image") def to_str(self): return self.account.extra_data.get("nickname", self.account.uid) class NaverProvider(OAuth2Provider): id = "naver" name = "Naver" account_class = NaverAccount def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): email = data.get("email") return dict(email=email) def extract_email_addresses(self, data): ret = [] email = data.get("email") if email: ret.append(EmailAddress(email=email, verified=True, primary=True)) return ret provider_classes = [NaverProvider] django-allauth-0.47.0/allauth/socialaccount/providers/naver/tests.py000066400000000000000000000013251415442050100256160ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import NaverProvider class NaverTests(OAuth2TestsMixin, TestCase): provider_id = NaverProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "response": { "enc_id": "46111c25f969116de4e545f13a415bb5383db2a79782da8851db72b2cced3180", "nickname": "\ubc31\ud638", "profile_image": "https://ssl.pstatic.net/static/pwe/address/nodata_33x33.gif", "gender": "M", "id": "7163491", "age": "20-29", "birthday": "03-22", "email": "shlee940322@example.com", "name": "\uc774\uc0c1\ud601" }, "message": "success", "resultcode": "00" } """, ) django-allauth-0.47.0/allauth/socialaccount/providers/naver/urls.py000066400000000000000000000002441415442050100254400ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import NaverProvider urlpatterns = default_urlpatterns(NaverProvider) django-allauth-0.47.0/allauth/socialaccount/providers/naver/views.py000066400000000000000000000016441415442050100256150ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import NaverProvider class NaverOAuth2Adapter(OAuth2Adapter): provider_id = NaverProvider.id access_token_url = "https://nid.naver.com/oauth2.0/token" authorize_url = "https://nid.naver.com/oauth2.0/authorize" profile_url = "https://openapi.naver.com/v1/nid/me" def complete_login(self, request, app, token, **kwargs): headers = {"Authorization": "Bearer {0}".format(token.token)} resp = requests.get(self.profile_url, headers=headers) resp.raise_for_status() extra_data = resp.json().get("response") return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(NaverOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(NaverOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/netiq/000077500000000000000000000000001415442050100241065ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/netiq/__init__.py000066400000000000000000000000001415442050100262050ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/netiq/provider.py000066400000000000000000000015751415442050100263220ustar00rootroot00000000000000# -*- coding: utf-8 -*- from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class NetIQAccount(ProviderAccount): def to_str(self): dflt = super(NetIQAccount, self).to_str() return self.account.extra_data.get("name", dflt) class NetIQProvider(OAuth2Provider): id = "netiq" name = "NetIQ" account_class = NetIQAccount def get_default_scope(self): return ["openid", "profile", "email"] def extract_uid(self, data): return str(data["preferred_username"]) def extract_extra_data(self, data): return data def extract_common_fields(self, data): return dict( email=data["email"], last_name=data["family_name"], first_name=data["given_name"], ) provider_classes = [NetIQProvider] django-allauth-0.47.0/allauth/socialaccount/providers/netiq/tests.py000066400000000000000000000015041415442050100256220ustar00rootroot00000000000000# -*- coding: utf-8 -*- from allauth.socialaccount.providers.netiq.provider import NetIQProvider from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase class NetIQTests(OAuth2TestsMixin, TestCase): provider_id = NetIQProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "sub": "d4c094dd899ab0408fb9d4c094dd899a", "acr": "secure/name/password/uri", "preferred_username": "Mocktest", "email": "mocktest@your.netiq.server.example.com", "nickname": "Mocktest", "family_name": "test", "given_name": "Mock", "website": "https://www.exanple.com" } """, ) django-allauth-0.47.0/allauth/socialaccount/providers/netiq/urls.py000066400000000000000000000003401415442050100254420ustar00rootroot00000000000000# -*- coding: utf-8 -*- from allauth.socialaccount.providers.netiq.provider import NetIQProvider from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns urlpatterns = default_urlpatterns(NetIQProvider) django-allauth-0.47.0/allauth/socialaccount/providers/netiq/views.py000066400000000000000000000031261415442050100256170ustar00rootroot00000000000000# -*- coding: utf-8 -*- import requests from allauth.socialaccount import app_settings from allauth.socialaccount.providers.netiq.provider import NetIQProvider from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) class NetIQOAuth2Adapter(OAuth2Adapter): provider_id = NetIQProvider.id supports_state = True settings = app_settings.PROVIDERS.get(provider_id, {}) provider_base_url = settings.get("NETIQ_URL") @property def access_token_url(self): return "{}/nidp/oauth/nam/token".format(self.provider_base_url) @property def authorize_url(self): return "{}/nidp/oauth/nam/authz".format(self.provider_base_url) @property def userinfo_url(self): return "{}/nidp/oauth/nam/userinfo".format(self.provider_base_url) def complete_login(self, request, app, token, **kwargs): """ Get the user info from userinfo endpoint and return a A populated instance of the `SocialLogin` model (unsaved) :param request: :param app: :param token: :param kwargs: :return: """ resp = requests.get( self.userinfo_url, headers={"Authorization": "Bearer {}".format(token.token)}, ) resp.raise_for_status() extra_data = resp.json() login = self.get_provider().sociallogin_from_response(request, extra_data) return login oauth2_login = OAuth2LoginView.adapter_view(NetIQOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(NetIQOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/nextcloud/000077500000000000000000000000001415442050100247735ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/nextcloud/__init__.py000066400000000000000000000000001415442050100270720ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/nextcloud/provider.py000066400000000000000000000012141415442050100271750ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class NextCloudAccount(ProviderAccount): pass class NextCloudProvider(OAuth2Provider): id = "nextcloud" name = "NextCloud" account_class = NextCloudAccount def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): return dict( username=data["displayname"], email=data["email"], ) def get_default_scope(self): scope = ["read"] return scope provider_classes = [NextCloudProvider] django-allauth-0.47.0/allauth/socialaccount/providers/nextcloud/tests.py000066400000000000000000000033211415442050100265060ustar00rootroot00000000000000from django.test.utils import override_settings from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import NextCloudProvider @override_settings( SOCIALACCOUNT_PROVIDERS={"nextcloud": {"SERVER": "https://nextcloud.example.org"}} ) class NextCloudTests(OAuth2TestsMixin, TestCase): provider_id = NextCloudProvider.id def get_login_response_json(self, with_refresh_token=True): return ( super(NextCloudTests, self) .get_login_response_json(with_refresh_token=with_refresh_token) .replace("uid", "user_id") ) def get_mocked_response(self): return MockedResponse( 200, """ ok 100 OK 1 batman /var/www/html/data/batman 1553946472000 Database 1455417655296 467191265 1455884846561 0.03 -3 batman@wayne.com batman 7351857301
BatCave, Gotham City
https://batman.org @the_batman admin fr fr_FR 1 1
""", ) django-allauth-0.47.0/allauth/socialaccount/providers/nextcloud/urls.py000066400000000000000000000002541415442050100263330ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import NextCloudProvider urlpatterns = default_urlpatterns(NextCloudProvider) django-allauth-0.47.0/allauth/socialaccount/providers/nextcloud/views.py000066400000000000000000000025271415442050100265100ustar00rootroot00000000000000import requests import xml.etree.ElementTree as ET from allauth.socialaccount import app_settings from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import NextCloudProvider class NextCloudAdapter(OAuth2Adapter): provider_id = NextCloudProvider.id settings = app_settings.PROVIDERS.get(provider_id, {}) server = settings.get("SERVER", "https://nextcloud.example.org") access_token_url = "{0}/apps/oauth2/api/v1/token".format(server) authorize_url = "{0}/apps/oauth2/authorize".format(server) profile_url = "{0}/ocs/v1.php/cloud/users/".format(server) def complete_login(self, request, app, token, **kwargs): extra_data = self.get_user_info(token, kwargs["response"]["user_id"]) return self.get_provider().sociallogin_from_response(request, extra_data) def get_user_info(self, token, user_id): headers = {"Authorization": "Bearer {0}".format(token)} resp = requests.get(self.profile_url + user_id, headers=headers) resp.raise_for_status() data = ET.fromstring(resp.content.decode())[1] return {d.tag: d.text.strip() for d in data if d.text is not None} oauth2_login = OAuth2LoginView.adapter_view(NextCloudAdapter) oauth2_callback = OAuth2CallbackView.adapter_view(NextCloudAdapter) django-allauth-0.47.0/allauth/socialaccount/providers/oauth/000077500000000000000000000000001415442050100241065ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/oauth/__init__.py000066400000000000000000000000001415442050100262050ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/oauth/client.py000066400000000000000000000163161415442050100257450ustar00rootroot00000000000000""" Parts derived from socialregistration and authorized by: alen, pinda Inspired by: http://github.com/leah/python-oauth/blob/master/oauth/example/client.py http://github.com/facebook/tornado/blob/master/tornado/auth.py """ import requests from urllib.parse import parse_qsl, urlparse from django.http import HttpResponseRedirect from django.utils.http import urlencode from django.utils.translation import gettext as _ from requests_oauthlib import OAuth1 from allauth.utils import build_absolute_uri, get_request_param def get_token_prefix(url): """ Returns a prefix for the token to store in the session so we can hold more than one single oauth provider's access key in the session. Example: The request token url ``http://twitter.com/oauth/request_token`` returns ``twitter.com`` """ return urlparse(url).netloc class OAuthError(Exception): pass class OAuthClient(object): def __init__( self, request, consumer_key, consumer_secret, request_token_url, access_token_url, callback_url, parameters=None, provider=None, ): self.request = request self.request_token_url = request_token_url self.access_token_url = access_token_url self.consumer_key = consumer_key self.consumer_secret = consumer_secret self.parameters = parameters self.callback_url = callback_url self.provider = provider self.errors = [] self.request_token = None self.access_token = None def _get_request_token(self): """ Obtain a temporary request token to authorize an access token and to sign the request to obtain the access token """ if self.request_token is None: get_params = {} if self.parameters: get_params.update(self.parameters) get_params["oauth_callback"] = build_absolute_uri( self.request, self.callback_url ) rt_url = self.request_token_url + "?" + urlencode(get_params) oauth = OAuth1(self.consumer_key, client_secret=self.consumer_secret) response = requests.post(url=rt_url, auth=oauth) if response.status_code not in [200, 201]: raise OAuthError( _("Invalid response while obtaining request token" ' from "%s".') % get_token_prefix(self.request_token_url) ) self.request_token = dict(parse_qsl(response.text)) self.request.session[ "oauth_%s_request_token" % get_token_prefix(self.request_token_url) ] = self.request_token return self.request_token def get_access_token(self): """ Obtain the access token to access private resources at the API endpoint. """ if self.access_token is None: request_token = self._get_rt_from_session() oauth = OAuth1( self.consumer_key, client_secret=self.consumer_secret, resource_owner_key=request_token["oauth_token"], resource_owner_secret=request_token["oauth_token_secret"], ) at_url = self.access_token_url # Passing along oauth_verifier is required according to: # http://groups.google.com/group/twitter-development-talk/browse_frm/thread/472500cfe9e7cdb9# # Though, the custom oauth_callback seems to work without it? oauth_verifier = get_request_param(self.request, "oauth_verifier") if oauth_verifier: at_url = at_url + "?" + urlencode({"oauth_verifier": oauth_verifier}) response = requests.post(url=at_url, auth=oauth) if response.status_code not in [200, 201]: raise OAuthError( _("Invalid response while obtaining access token" ' from "%s".') % get_token_prefix(self.request_token_url) ) self.access_token = dict(parse_qsl(response.text)) self.request.session[ "oauth_%s_access_token" % get_token_prefix(self.request_token_url) ] = self.access_token return self.access_token def _get_rt_from_session(self): """ Returns the request token cached in the session by ``_get_request_token`` """ try: return self.request.session[ "oauth_%s_request_token" % get_token_prefix(self.request_token_url) ] except KeyError: raise OAuthError( _('No request token saved for "%s".') % get_token_prefix(self.request_token_url) ) def is_valid(self): try: self._get_rt_from_session() self.get_access_token() except OAuthError as e: self.errors.append(e.args[0]) return False return True def get_redirect(self, authorization_url, extra_params): """ Returns a ``HttpResponseRedirect`` object to redirect the user to the URL the OAuth provider handles authorization. """ request_token = self._get_request_token() params = { "oauth_token": request_token["oauth_token"], "oauth_callback": self.request.build_absolute_uri(self.callback_url), } params.update(extra_params) url = authorization_url + "?" + urlencode(params) return HttpResponseRedirect(url) class OAuth(object): """ Base class to perform oauth signed requests from access keys saved in a user's session. See the ``OAuthTwitter`` class below for an example. """ def __init__(self, request, consumer_key, secret_key, request_token_url): self.request = request self.consumer_key = consumer_key self.secret_key = secret_key self.request_token_url = request_token_url def _get_at_from_session(self): """ Get the saved access token for private resources from the session. """ try: return self.request.session[ "oauth_%s_access_token" % get_token_prefix(self.request_token_url) ] except KeyError: raise OAuthError( _('No access token saved for "%s".') % get_token_prefix(self.request_token_url) ) def query(self, url, method="GET", params=None, headers=None): """ Request a API endpoint at ``url`` with ``params`` being either the POST or GET data. """ access_token = self._get_at_from_session() oauth = OAuth1( self.consumer_key, client_secret=self.secret_key, resource_owner_key=access_token["oauth_token"], resource_owner_secret=access_token["oauth_token_secret"], ) response = getattr(requests, method.lower())( url, auth=oauth, headers=headers, params=params ) if response.status_code != 200: raise OAuthError( _('No access to private resources at "%s".') % get_token_prefix(self.request_token_url) ) return response.text django-allauth-0.47.0/allauth/socialaccount/providers/oauth/provider.py000066400000000000000000000022531415442050100263140ustar00rootroot00000000000000from urllib.parse import parse_qsl from django.urls import reverse from django.utils.http import urlencode from allauth.socialaccount.providers.base import Provider class OAuthProvider(Provider): def get_login_url(self, request, **kwargs): url = reverse(self.id + "_login") if kwargs: url = url + "?" + urlencode(kwargs) return url def get_auth_params(self, request, action): settings = self.get_settings() ret = dict(settings.get("AUTH_PARAMS", {})) dynamic_auth_params = request.GET.get("auth_params", None) if dynamic_auth_params: ret.update(dict(parse_qsl(dynamic_auth_params))) return ret def get_auth_url(self, request, action): # TODO: This is ugly. Move authorization_url away from the # adapter into the provider. Hmpf, the line between # adapter/provider is a bit too thin here. return None def get_scope(self, request): settings = self.get_settings() scope = settings.get("SCOPE") if scope is None: scope = self.get_default_scope() return scope def get_default_scope(self): return [] django-allauth-0.47.0/allauth/socialaccount/providers/oauth/urls.py000066400000000000000000000010171415442050100254440ustar00rootroot00000000000000from django.urls import include, path from allauth.utils import import_attribute def default_urlpatterns(provider): login_view = import_attribute(provider.get_package() + ".views.oauth_login") callback_view = import_attribute(provider.get_package() + ".views.oauth_callback") urlpatterns = [ path("login/", login_view, name=provider.id + "_login"), path("login/callback/", callback_view, name=provider.id + "_callback"), ] return [path(provider.get_slug() + "/", include(urlpatterns))] django-allauth-0.47.0/allauth/socialaccount/providers/oauth/views.py000066400000000000000000000101061415442050100256130ustar00rootroot00000000000000from __future__ import absolute_import from django.urls import reverse from allauth.socialaccount import providers from allauth.socialaccount.helpers import ( complete_social_login, render_authentication_error, ) from allauth.socialaccount.models import SocialLogin, SocialToken from allauth.socialaccount.providers.base.constants import ( AuthAction, AuthError, ) from allauth.socialaccount.providers.base.mixins import OAuthLoginMixin from allauth.socialaccount.providers.oauth.client import ( OAuthClient, OAuthError, ) class OAuthAdapter(object): def __init__(self, request): self.request = request def complete_login(self, request, app): """ Returns a SocialLogin instance """ raise NotImplementedError def get_provider(self): return providers.registry.by_id(self.provider_id, self.request) class OAuthView(object): @classmethod def adapter_view(cls, adapter): def view(request, *args, **kwargs): self = cls() self.request = request self.adapter = adapter(request) return self.dispatch(request, *args, **kwargs) return view def _get_client(self, request, callback_url): provider = self.adapter.get_provider() app = provider.get_app(request) scope = " ".join(provider.get_scope(request)) parameters = {} if scope: parameters["scope"] = scope client = OAuthClient( request, app.client_id, app.secret, self.adapter.request_token_url, self.adapter.access_token_url, callback_url, parameters=parameters, provider=provider, ) return client class OAuthLoginView(OAuthLoginMixin, OAuthView): def login(self, request, *args, **kwargs): callback_url = reverse(self.adapter.provider_id + "_callback") SocialLogin.stash_state(request) action = request.GET.get("action", AuthAction.AUTHENTICATE) provider = self.adapter.get_provider() auth_url = provider.get_auth_url(request, action) or self.adapter.authorize_url auth_params = provider.get_auth_params(request, action) client = self._get_client(request, callback_url) try: return client.get_redirect(auth_url, auth_params) except OAuthError as e: return render_authentication_error( request, self.adapter.provider_id, exception=e ) class OAuthCallbackView(OAuthView): def dispatch(self, request): """ View to handle final steps of OAuth based authentication where the user gets redirected back to from the service provider """ login_done_url = reverse(self.adapter.provider_id + "_callback") client = self._get_client(request, login_done_url) if not client.is_valid(): if "denied" in request.GET: error = AuthError.CANCELLED else: error = AuthError.UNKNOWN extra_context = dict(oauth_client=client) return render_authentication_error( request, self.adapter.provider_id, error=error, extra_context=extra_context, ) app = self.adapter.get_provider().get_app(request) try: access_token = client.get_access_token() token = SocialToken( app=app, token=access_token["oauth_token"], # .get() -- e.g. Evernote does not feature a secret token_secret=access_token.get("oauth_token_secret", ""), ) login = self.adapter.complete_login( request, app, token, response=access_token ) login.token = token login.state = SocialLogin.unstash_state(request) return complete_social_login(request, login) except OAuthError as e: return render_authentication_error( request, self.adapter.provider_id, exception=e ) django-allauth-0.47.0/allauth/socialaccount/providers/oauth2/000077500000000000000000000000001415442050100241705ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/oauth2/__init__.py000066400000000000000000000000001415442050100262670ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/oauth2/client.py000066400000000000000000000060231415442050100260210ustar00rootroot00000000000000import requests from urllib.parse import parse_qsl from django.utils.http import urlencode class OAuth2Error(Exception): pass class OAuth2Client(object): def __init__( self, request, consumer_key, consumer_secret, access_token_method, access_token_url, callback_url, scope, scope_delimiter=" ", headers=None, basic_auth=False, ): self.request = request self.access_token_method = access_token_method self.access_token_url = access_token_url self.callback_url = callback_url self.consumer_key = consumer_key self.consumer_secret = consumer_secret self.scope = scope_delimiter.join(set(scope)) self.state = None self.headers = headers self.basic_auth = basic_auth def get_redirect_url(self, authorization_url, extra_params): params = { "client_id": self.consumer_key, "redirect_uri": self.callback_url, "scope": self.scope, "response_type": "code", } if self.state: params["state"] = self.state params.update(extra_params) return "%s?%s" % (authorization_url, urlencode(params)) def get_access_token(self, code): data = { "redirect_uri": self.callback_url, "grant_type": "authorization_code", "code": code, } if self.basic_auth: auth = requests.auth.HTTPBasicAuth(self.consumer_key, self.consumer_secret) else: auth = None data.update( { "client_id": self.consumer_key, "client_secret": self.consumer_secret, } ) params = None self._strip_empty_keys(data) url = self.access_token_url if self.access_token_method == "GET": params = data data = None # TODO: Proper exception handling resp = requests.request( self.access_token_method, url, params=params, data=data, headers=self.headers, auth=auth, ) access_token = None if resp.status_code in [200, 201]: # Weibo sends json via 'text/plain;charset=UTF-8' if ( resp.headers["content-type"].split(";")[0] == "application/json" or resp.text[:2] == '{"' ): access_token = resp.json() else: access_token = dict(parse_qsl(resp.text)) if not access_token or "access_token" not in access_token: raise OAuth2Error("Error retrieving access token: %s" % resp.content) return access_token def _strip_empty_keys(self, params): """Added because the Dropbox OAuth2 flow doesn't work when scope is passed in, which is empty. """ keys = [k for k, v in params.items() if v == ""] for key in keys: del params[key] django-allauth-0.47.0/allauth/socialaccount/providers/oauth2/provider.py000066400000000000000000000020251415442050100263730ustar00rootroot00000000000000from urllib.parse import parse_qsl from django.urls import reverse from django.utils.http import urlencode from allauth.socialaccount.providers.base import Provider class OAuth2Provider(Provider): def get_login_url(self, request, **kwargs): url = reverse(self.id + "_login") if kwargs: url = url + "?" + urlencode(kwargs) return url def get_auth_params(self, request, action): settings = self.get_settings() ret = dict(settings.get("AUTH_PARAMS", {})) dynamic_auth_params = request.GET.get("auth_params", None) if dynamic_auth_params: ret.update(dict(parse_qsl(dynamic_auth_params))) return ret def get_scope(self, request): settings = self.get_settings() scope = list(settings.get("SCOPE", self.get_default_scope())) dynamic_scope = request.GET.get("scope", None) if dynamic_scope: scope.extend(dynamic_scope.split(",")) return scope def get_default_scope(self): return [] django-allauth-0.47.0/allauth/socialaccount/providers/oauth2/urls.py000066400000000000000000000010211415442050100255210ustar00rootroot00000000000000from django.urls import include, path from allauth.utils import import_attribute def default_urlpatterns(provider): login_view = import_attribute(provider.get_package() + ".views.oauth2_login") callback_view = import_attribute(provider.get_package() + ".views.oauth2_callback") urlpatterns = [ path("login/", login_view, name=provider.id + "_login"), path("login/callback/", callback_view, name=provider.id + "_callback"), ] return [path(provider.get_slug() + "/", include(urlpatterns))] django-allauth-0.47.0/allauth/socialaccount/providers/oauth2/views.py000066400000000000000000000130021415442050100256730ustar00rootroot00000000000000from __future__ import absolute_import from datetime import timedelta from requests import RequestException from django.core.exceptions import PermissionDenied from django.http import HttpResponseRedirect from django.urls import reverse from django.utils import timezone from allauth.exceptions import ImmediateHttpResponse from allauth.socialaccount import providers from allauth.socialaccount.helpers import ( complete_social_login, render_authentication_error, ) from allauth.socialaccount.models import SocialLogin, SocialToken from allauth.socialaccount.providers.base import ProviderException from allauth.socialaccount.providers.base.constants import ( AuthAction, AuthError, ) from allauth.socialaccount.providers.base.mixins import OAuthLoginMixin from allauth.socialaccount.providers.oauth2.client import ( OAuth2Client, OAuth2Error, ) from allauth.utils import build_absolute_uri, get_request_param class OAuth2Adapter(object): expires_in_key = "expires_in" client_class = OAuth2Client supports_state = True redirect_uri_protocol = None access_token_method = "POST" login_cancelled_error = "access_denied" scope_delimiter = " " basic_auth = False headers = None def __init__(self, request): self.request = request def get_provider(self): return providers.registry.by_id(self.provider_id, self.request) def complete_login(self, request, app, access_token, **kwargs): """ Returns a SocialLogin instance """ raise NotImplementedError def get_callback_url(self, request, app): callback_url = reverse(self.provider_id + "_callback") protocol = self.redirect_uri_protocol return build_absolute_uri(request, callback_url, protocol) def parse_token(self, data): token = SocialToken(token=data["access_token"]) token.token_secret = data.get("refresh_token", "") expires_in = data.get(self.expires_in_key, None) if expires_in: token.expires_at = timezone.now() + timedelta(seconds=int(expires_in)) return token def get_access_token_data(self, request, app, client): code = get_request_param(self.request, "code") return client.get_access_token(code) class OAuth2View(object): @classmethod def adapter_view(cls, adapter): def view(request, *args, **kwargs): self = cls() self.request = request self.adapter = adapter(request) try: return self.dispatch(request, *args, **kwargs) except ImmediateHttpResponse as e: return e.response return view def get_client(self, request, app): callback_url = self.adapter.get_callback_url(request, app) provider = self.adapter.get_provider() scope = provider.get_scope(request) client = self.adapter.client_class( self.request, app.client_id, app.secret, self.adapter.access_token_method, self.adapter.access_token_url, callback_url, scope, scope_delimiter=self.adapter.scope_delimiter, headers=self.adapter.headers, basic_auth=self.adapter.basic_auth, ) return client class OAuth2LoginView(OAuthLoginMixin, OAuth2View): def login(self, request, *args, **kwargs): provider = self.adapter.get_provider() app = provider.get_app(self.request) client = self.get_client(request, app) action = request.GET.get("action", AuthAction.AUTHENTICATE) auth_url = self.adapter.authorize_url auth_params = provider.get_auth_params(request, action) client.state = SocialLogin.stash_state(request) try: return HttpResponseRedirect(client.get_redirect_url(auth_url, auth_params)) except OAuth2Error as e: return render_authentication_error(request, provider.id, exception=e) class OAuth2CallbackView(OAuth2View): def dispatch(self, request, *args, **kwargs): if "error" in request.GET or "code" not in request.GET: # Distinguish cancel from error auth_error = request.GET.get("error", None) if auth_error == self.adapter.login_cancelled_error: error = AuthError.CANCELLED else: error = AuthError.UNKNOWN return render_authentication_error( request, self.adapter.provider_id, error=error ) app = self.adapter.get_provider().get_app(self.request) client = self.get_client(self.request, app) try: access_token = self.adapter.get_access_token_data(request, app, client) token = self.adapter.parse_token(access_token) token.app = app login = self.adapter.complete_login( request, app, token, response=access_token ) login.token = token if self.adapter.supports_state: login.state = SocialLogin.verify_and_unstash_state( request, get_request_param(request, "state") ) else: login.state = SocialLogin.unstash_state(request) return complete_social_login(request, login) except ( PermissionDenied, OAuth2Error, RequestException, ProviderException, ) as e: return render_authentication_error( request, self.adapter.provider_id, exception=e ) django-allauth-0.47.0/allauth/socialaccount/providers/odnoklassniki/000077500000000000000000000000001415442050100256365ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/odnoklassniki/__init__.py000066400000000000000000000000001415442050100277350ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/odnoklassniki/provider.py000066400000000000000000000023671415442050100300520ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class OdnoklassnikiAccount(ProviderAccount): def get_profile_url(self): return "https://ok.ru/profile/" + self.account.extra_data["uid"] def get_avatar_url(self): ret = None pic_big_url = self.account.extra_data.get("pic1024x768") pic_medium_url = self.account.extra_data.get("pic640x480") pic_small_url = self.account.extra_data.get("pic190x190") if pic_big_url: return pic_big_url elif pic_medium_url: return pic_medium_url elif pic_small_url: return pic_small_url else: return ret def to_str(self): dflt = super(OdnoklassnikiAccount, self).to_str() return self.account.extra_data.get("name", dflt) class OdnoklassnikiProvider(OAuth2Provider): id = "odnoklassniki" name = "Odnoklassniki" account_class = OdnoklassnikiAccount def extract_uid(self, data): return data["uid"] def extract_common_fields(self, data): return dict(last_name=data.get("last_name"), first_name=data.get("first_name")) provider_classes = [OdnoklassnikiProvider] django-allauth-0.47.0/allauth/socialaccount/providers/odnoklassniki/tests.py000066400000000000000000000016761415442050100273640ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import absolute_import from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import OdnoklassnikiProvider class OdnoklassnikiTests(OAuth2TestsMixin, TestCase): provider_id = OdnoklassnikiProvider.id def get_mocked_response(self, verified_email=True): return MockedResponse( 200, """ {"uid":"561999209121","birthday":"1999-09-09","age":33,"first_name":"Ivan", "last_name":"Petrov","name":"Ivan Petrov","locale":"en","gender":"male", "has_email":true,"location":{"city":"Moscow","country":"RUSSIAN_FEDERATION", "countryCode":"RU","countryName":"Russia"},"online":"web","pic_1": "http://i500.mycdn.me/res/stub_50x50.gif", "pic_2":"http://usd1.mycdn.me/res/stub_128x96.gif"} """, ) def get_login_response_json(self, with_refresh_token=True): return '{"access_token": "testac"}' # noqa django-allauth-0.47.0/allauth/socialaccount/providers/odnoklassniki/urls.py000066400000000000000000000002641415442050100271770ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import OdnoklassnikiProvider urlpatterns = default_urlpatterns(OdnoklassnikiProvider) django-allauth-0.47.0/allauth/socialaccount/providers/odnoklassniki/views.py000066400000000000000000000035611415442050100273520ustar00rootroot00000000000000import requests from hashlib import md5 from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import OdnoklassnikiProvider USER_FIELDS = [ "uid", "locale", "first_name", "last_name", "name", "gender", "age", "birthday", "has_email", "current_status", "current_status_id", "current_status_date", "online", "photo_id", "pic_1", # aka pic50x50 "pic_2", # aka pic128max "pic190x190", # small "pic640x480", # medium "pic1024x768", # big "location", ] class OdnoklassnikiOAuth2Adapter(OAuth2Adapter): provider_id = OdnoklassnikiProvider.id access_token_url = "https://api.odnoklassniki.ru/oauth/token.do" authorize_url = "https://www.odnoklassniki.ru/oauth/authorize" profile_url = "https://api.odnoklassniki.ru/fb.do" access_token_method = "POST" def complete_login(self, request, app, token, **kwargs): data = { "method": "users.getCurrentUser", "access_token": token.token, "fields": ",".join(USER_FIELDS), "format": "JSON", "application_key": app.key, } suffix = md5( "{0:s}{1:s}".format(data["access_token"], app.secret).encode("utf-8") ).hexdigest() check_list = sorted( ["{0:s}={1:s}".format(k, v) for k, v in data.items() if k != "access_token"] ) data["sig"] = md5(("".join(check_list) + suffix).encode("utf-8")).hexdigest() response = requests.get(self.profile_url, params=data) extra_data = response.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(OdnoklassnikiOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(OdnoklassnikiOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/okta/000077500000000000000000000000001415442050100237245ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/okta/__init__.py000066400000000000000000000000001415442050100260230ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/okta/provider.py000066400000000000000000000021521415442050100261300ustar00rootroot00000000000000from allauth.account.models import EmailAddress from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class OktaAccount(ProviderAccount): def to_str(self): dflt = super(OktaAccount, self).to_str() return self.account.extra_data.get("name", dflt) class OktaProvider(OAuth2Provider): id = "okta" name = "Okta" account_class = OktaAccount def get_default_scope(self): return ["openid", "profile", "email", "offline_access"] def extract_uid(self, data): return str(data["preferred_username"]) def extract_extra_data(self, data): return data def extract_email_addresses(self, data): return [ EmailAddress( email=data["email"], verified=bool(data["email_verified"]), primary=True ) ] def extract_common_fields(self, data): return dict( email=data["email"], last_name=data["family_name"], first_name=data["given_name"], ) provider_classes = [OktaProvider] django-allauth-0.47.0/allauth/socialaccount/providers/okta/tests.py000066400000000000000000000015211415442050100254370ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import OktaProvider class OktaTests(OAuth2TestsMixin, TestCase): provider_id = OktaProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "sub": "00u33ow83pjQpCQJr1j8", "name": "Jon Smith", "locale": "AE", "email": "jsmith@example.com", "nickname": "Jon Smith", "preferred_username": "jsmith@example.com", "given_name": "Jon", "family_name": "Smith", "zoneinfo": "America/Los_Angeles", "updated_at": 1601285210, "email_verified": true } """, ) django-allauth-0.47.0/allauth/socialaccount/providers/okta/urls.py000066400000000000000000000002421415442050100252610ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import OktaProvider urlpatterns = default_urlpatterns(OktaProvider) django-allauth-0.47.0/allauth/socialaccount/providers/okta/views.py000066400000000000000000000031051415442050100254320ustar00rootroot00000000000000import requests from allauth.socialaccount import app_settings from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import OktaProvider class OktaOAuth2Adapter(OAuth2Adapter): provider_id = OktaProvider.id settings = app_settings.PROVIDERS.get(provider_id, {}) okta_base_url = settings.get("OKTA_BASE_URL") @property def access_token_url(self): return "https://{}/oauth2/v1/token".format(self.okta_base_url) @property def authorize_url(self): return "https://{}/oauth2/v1/authorize".format(self.okta_base_url) @property def userinfo_url(self): return "https://{}/oauth2/v1/userinfo".format(self.okta_base_url) @property def access_token_method(self): return "POST" def complete_login(self, request, app, token, **kwargs): """ Get the user info from userinfo endpoint and return a A populated instance of the `SocialLogin` model (unsaved) :param request: :param app: :param token: :param kwargs: :return: """ resp = requests.get( self.userinfo_url, headers={"Authorization": "Bearer {}".format(token.token)}, ) resp.raise_for_status() extra_data = resp.json() login = self.get_provider().sociallogin_from_response(request, extra_data) return login oauth2_login = OAuth2LoginView.adapter_view(OktaOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(OktaOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/openid/000077500000000000000000000000001415442050100242445ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/openid/__init__.py000066400000000000000000000000001415442050100263430ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/openid/admin.py000066400000000000000000000004411415442050100257050ustar00rootroot00000000000000from django.contrib import admin from .models import OpenIDNonce, OpenIDStore class OpenIDStoreAdmin(admin.ModelAdmin): pass class OpenIDNonceAdmin(admin.ModelAdmin): pass admin.site.register(OpenIDStore, OpenIDStoreAdmin) admin.site.register(OpenIDNonce, OpenIDNonceAdmin) django-allauth-0.47.0/allauth/socialaccount/providers/openid/forms.py000066400000000000000000000005241415442050100257450ustar00rootroot00000000000000from django import forms class LoginForm(forms.Form): openid = forms.URLField( label=("OpenID"), help_text=('Get an OpenID'), ) next = forms.CharField(widget=forms.HiddenInput, required=False) process = forms.CharField(widget=forms.HiddenInput, required=False) django-allauth-0.47.0/allauth/socialaccount/providers/openid/migrations/000077500000000000000000000000001415442050100264205ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/openid/migrations/0001_initial.py000066400000000000000000000032551415442050100310700ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals from django.db import migrations, models class Migration(migrations.Migration): dependencies = [] operations = [ migrations.CreateModel( name="OpenIDNonce", fields=[ ( "id", models.AutoField( verbose_name="ID", serialize=False, auto_created=True, primary_key=True, ), ), ("server_url", models.CharField(max_length=255)), ("timestamp", models.IntegerField()), ("salt", models.CharField(max_length=255)), ("date_created", models.DateTimeField(auto_now_add=True)), ], options={}, bases=(models.Model,), ), migrations.CreateModel( name="OpenIDStore", fields=[ ( "id", models.AutoField( verbose_name="ID", serialize=False, auto_created=True, primary_key=True, ), ), ("server_url", models.CharField(max_length=255)), ("handle", models.CharField(max_length=255)), ("secret", models.TextField()), ("issued", models.IntegerField()), ("lifetime", models.IntegerField()), ("assoc_type", models.TextField()), ], options={}, bases=(models.Model,), ), ] django-allauth-0.47.0/allauth/socialaccount/providers/openid/migrations/__init__.py000066400000000000000000000000001415442050100305170ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/openid/models.py000066400000000000000000000011741415442050100261040ustar00rootroot00000000000000from django.db import models class OpenIDStore(models.Model): server_url = models.CharField(max_length=255) handle = models.CharField(max_length=255) secret = models.TextField() issued = models.IntegerField() lifetime = models.IntegerField() assoc_type = models.TextField() def __str__(self): return self.server_url class OpenIDNonce(models.Model): server_url = models.CharField(max_length=255) timestamp = models.IntegerField() salt = models.CharField(max_length=255) date_created = models.DateTimeField(auto_now_add=True) def __str__(self): return self.server_url django-allauth-0.47.0/allauth/socialaccount/providers/openid/provider.py000066400000000000000000000065671415442050100264660ustar00rootroot00000000000000from urllib.parse import urlparse from django.urls import reverse from django.utils.http import urlencode from allauth.socialaccount.providers.base import Provider, ProviderAccount from .utils import ( AXAttribute, OldAXAttribute, SRegField, get_email_from_response, get_value_from_response, ) class OpenIDAccount(ProviderAccount): def get_brand(self): ret = super(OpenIDAccount, self).get_brand() domain = urlparse(self.account.uid).netloc # FIXME: Instead of hardcoding, derive this from the domains # listed in the openid endpoints setting. provider_map = { "yahoo": dict(id="yahoo", name="Yahoo"), "hyves": dict(id="hyves", name="Hyves"), "google": dict(id="google", name="Google"), } for d, p in provider_map.items(): if domain.lower().find(d) >= 0: ret = p break return ret def to_str(self): return self.account.uid class OpenIDProvider(Provider): id = "openid" name = "OpenID" account_class = OpenIDAccount def get_login_url(self, request, **kwargs): url = reverse("openid_login") if kwargs: url += "?" + urlencode(kwargs) return url def get_brands(self): # These defaults are a bit too arbitrary... default_servers = [ dict(id="yahoo", name="Yahoo", openid_url="http://me.yahoo.com"), dict(id="hyves", name="Hyves", openid_url="http://hyves.nl"), ] return self.get_settings().get("SERVERS", default_servers) def get_server_settings(self, endpoint): servers = self.get_settings().get("SERVERS", []) for server in servers: if endpoint is not None and endpoint.startswith(server.get("openid_url")): return server return {} def extract_extra_data(self, response): extra_data = {} server_settings = self.get_server_settings(response.endpoint.server_url) extra_attributes = server_settings.get("extra_attributes", []) for attribute_id, name, _ in extra_attributes: extra_data[attribute_id] = get_value_from_response( response, ax_names=[name] ) return extra_data def extract_uid(self, response): return response.identity_url def extract_common_fields(self, response): first_name = ( get_value_from_response( response, ax_names=[ AXAttribute.PERSON_FIRST_NAME, OldAXAttribute.PERSON_FIRST_NAME, ], ) or "" ) last_name = ( get_value_from_response( response, ax_names=[ AXAttribute.PERSON_LAST_NAME, OldAXAttribute.PERSON_LAST_NAME, ], ) or "" ) name = ( get_value_from_response( response, sreg_names=[SRegField.NAME], ax_names=[AXAttribute.PERSON_NAME, OldAXAttribute.PERSON_NAME], ) or "" ) return dict( email=get_email_from_response(response), first_name=first_name, last_name=last_name, name=name, ) provider_classes = [OpenIDProvider] django-allauth-0.47.0/allauth/socialaccount/providers/openid/tests.py000066400000000000000000000123501415442050100257610ustar00rootroot00000000000000from unittest import expectedFailure from django.test import override_settings from django.urls import reverse from openid.consumer import consumer from allauth.socialaccount.models import SocialAccount from allauth.tests import Mock, TestCase, patch from allauth.utils import get_user_model from . import views from .utils import AXAttribute class OpenIDTests(TestCase): def test_discovery_failure(self): """ This used to generate a server 500: DiscoveryFailure: No usable OpenID services found for http://www.google.com/ """ resp = self.client.post( reverse("openid_login"), dict(openid="http://www.google.com") ) self.assertTrue("openid" in resp.context["form"].errors) @expectedFailure def test_login(self): # Location: https://s.yimg.com/wm/mbr/html/openid-eol-0.0.1.html resp = self.client.post( reverse(views.login), dict(openid="http://me.yahoo.com") ) assert "login.yahooapis" in resp["location"] with patch( "allauth.socialaccount.providers.openid.views._openid_consumer" ) as consumer_mock: client = Mock() complete = Mock() consumer_mock.return_value = client client.complete = complete complete_response = Mock() complete.return_value = complete_response complete_response.status = consumer.SUCCESS complete_response.identity_url = "http://dummy/john/" with patch( "allauth.socialaccount.providers.openid.utils.SRegResponse" ) as sr_mock: with patch( "allauth.socialaccount.providers.openid.utils.FetchResponse" ) as fr_mock: sreg_mock = Mock() ax_mock = Mock() sr_mock.fromSuccessResponse = sreg_mock fr_mock.fromSuccessResponse = ax_mock sreg_mock.return_value = {} ax_mock.return_value = {AXAttribute.PERSON_FIRST_NAME: ["raymond"]} resp = self.client.post(reverse("openid_callback")) self.assertRedirects( resp, "/accounts/profile/", fetch_redirect_response=False, ) get_user_model().objects.get(first_name="raymond") @expectedFailure @override_settings( SOCIALACCOUNT_PROVIDERS={ "openid": { "SERVERS": [ dict( id="yahoo", name="Yahoo", openid_url="http://me.yahoo.com", extra_attributes=[ ( "phone", "http://axschema.org/contact/phone/default", True, ) ], ) ] } } ) def test_login_with_extra_attributes(self): with patch("allauth.socialaccount.providers.openid.views.QUERY_EMAIL", True): resp = self.client.post( reverse(views.login), dict(openid="http://me.yahoo.com") ) assert "login.yahooapis" in resp["location"] with patch( "allauth.socialaccount.providers.openid.views._openid_consumer" ) as consumer_mock: client = Mock() complete = Mock() endpoint = Mock() consumer_mock.return_value = client client.complete = complete complete_response = Mock() complete.return_value = complete_response complete_response.endpoint = endpoint complete_response.endpoint.server_url = "http://me.yahoo.com" complete_response.status = consumer.SUCCESS complete_response.identity_url = "http://dummy/john/" with patch( "allauth.socialaccount.providers.openid.utils.SRegResponse" ) as sr_mock: with patch( "allauth.socialaccount.providers.openid.utils.FetchResponse" ) as fr_mock: sreg_mock = Mock() ax_mock = Mock() sr_mock.fromSuccessResponse = sreg_mock fr_mock.fromSuccessResponse = ax_mock sreg_mock.return_value = {} ax_mock.return_value = { AXAttribute.CONTACT_EMAIL: ["raymond@example.com"], AXAttribute.PERSON_FIRST_NAME: ["raymond"], "http://axschema.org/contact/phone/default": ["123456789"], } resp = self.client.post(reverse("openid_callback")) self.assertRedirects( resp, "/accounts/profile/", fetch_redirect_response=False, ) socialaccount = SocialAccount.objects.get( user__first_name="raymond" ) self.assertEqual(socialaccount.extra_data.get("phone"), "123456789") django-allauth-0.47.0/allauth/socialaccount/providers/openid/urls.py000066400000000000000000000003111415442050100255760ustar00rootroot00000000000000from django.urls import path from . import views urlpatterns = [ path("openid/login/", views.login, name="openid_login"), path("openid/callback/", views.callback, name="openid_callback"), ] django-allauth-0.47.0/allauth/socialaccount/providers/openid/utils.py000066400000000000000000000124411415442050100257600ustar00rootroot00000000000000import base64 import pickle from collections import UserDict from openid.association import Association as OIDAssociation from openid.extensions.ax import FetchResponse from openid.extensions.sreg import SRegResponse from openid.store.interface import OpenIDStore as OIDStore from allauth.utils import valid_email_or_none from .models import OpenIDNonce, OpenIDStore class JSONSafeSession(UserDict): """ openid puts e.g. class OpenIDServiceEndpoint in the session. Django 1.6 no longer pickles stuff, so we'll need to do some hacking here... """ def __init__(self, session): UserDict.__init__(self) self.data = session def __setitem__(self, key, value): data = base64.b64encode(pickle.dumps(value)).decode("ascii") return UserDict.__setitem__(self, key, data) def __getitem__(self, key): data = UserDict.__getitem__(self, key) return pickle.loads(base64.b64decode(data.encode("ascii"))) class OldAXAttribute: PERSON_NAME = "http://openid.net/schema/namePerson" PERSON_FIRST_NAME = "http://openid.net/schema/namePerson/first" PERSON_LAST_NAME = "http://openid.net/schema/namePerson/last" class AXAttribute: CONTACT_EMAIL = "http://axschema.org/contact/email" PERSON_NAME = "http://axschema.org/namePerson" PERSON_FIRST_NAME = "http://axschema.org/namePerson/first" PERSON_LAST_NAME = "http://axschema.org/namePerson/last" AXAttributes = [ AXAttribute.CONTACT_EMAIL, AXAttribute.PERSON_NAME, AXAttribute.PERSON_FIRST_NAME, AXAttribute.PERSON_LAST_NAME, OldAXAttribute.PERSON_NAME, OldAXAttribute.PERSON_FIRST_NAME, OldAXAttribute.PERSON_LAST_NAME, ] class SRegField: EMAIL = "email" NAME = "fullname" SRegFields = [ SRegField.EMAIL, SRegField.NAME, ] class DBOpenIDStore(OIDStore): max_nonce_age = 6 * 60 * 60 def storeAssociation(self, server_url, assoc=None): try: secret = base64.encodebytes(assoc.secret) except AttributeError: # Python 2.x compat secret = base64.encodestring(assoc.secret) else: secret = secret.decode() OpenIDStore.objects.create( server_url=server_url, handle=assoc.handle, secret=secret, issued=assoc.issued, lifetime=assoc.lifetime, assoc_type=assoc.assoc_type, ) def getAssociation(self, server_url, handle=None): stored_assocs = OpenIDStore.objects.filter(server_url=server_url) if handle: stored_assocs = stored_assocs.filter(handle=handle) stored_assocs.order_by("-issued") if not stored_assocs.exists(): return None return_val = None for stored_assoc in stored_assocs: assoc = OIDAssociation( stored_assoc.handle, base64.decodestring(stored_assoc.secret.encode("utf-8")), stored_assoc.issued, stored_assoc.lifetime, stored_assoc.assoc_type, ) # See: # necaris/python3-openid@1abb155c8fc7b508241cbe9d2cae24f18e4a379b if hasattr(assoc, "getExpiresIn"): expires_in = assoc.getExpiresIn() else: expires_in = assoc.expiresIn if expires_in == 0: stored_assoc.delete() else: if return_val is None: return_val = assoc return return_val def removeAssociation(self, server_url, handle): stored_assocs = OpenIDStore.objects.filter(server_url=server_url) if handle: stored_assocs = stored_assocs.filter(handle=handle) stored_assocs.delete() def useNonce(self, server_url, timestamp, salt): try: OpenIDNonce.objects.get( server_url=server_url, timestamp=timestamp, salt=salt ) except OpenIDNonce.DoesNotExist: OpenIDNonce.objects.create( server_url=server_url, timestamp=timestamp, salt=salt ) return True return False def get_email_from_response(response): email = None sreg = SRegResponse.fromSuccessResponse(response) if sreg: email = valid_email_or_none(sreg.get(SRegField.EMAIL)) if not email: ax = FetchResponse.fromSuccessResponse(response) if ax: try: values = ax.get(AXAttribute.CONTACT_EMAIL) if values: email = valid_email_or_none(values[0]) except KeyError: pass return email def get_value_from_response(response, sreg_names=None, ax_names=None): value = None if sreg_names: sreg = SRegResponse.fromSuccessResponse(response) if sreg: for name in sreg_names: value = sreg.get(name) if value: break if not value and ax_names: ax = FetchResponse.fromSuccessResponse(response) if ax: for name in ax_names: try: values = ax.get(name) if values: value = values[0] except KeyError: pass if value: break return value django-allauth-0.47.0/allauth/socialaccount/providers/openid/views.py000066400000000000000000000132461415442050100257610ustar00rootroot00000000000000from django.http import HttpResponseRedirect from django.shortcuts import render from django.urls import reverse from django.views import View from django.views.decorators.csrf import csrf_exempt from openid.consumer import consumer from openid.consumer.discover import DiscoveryFailure from openid.extensions.ax import AttrInfo, FetchRequest from openid.extensions.sreg import SRegRequest from allauth.socialaccount import providers from allauth.socialaccount.app_settings import QUERY_EMAIL from allauth.socialaccount.helpers import ( complete_social_login, render_authentication_error, ) from allauth.socialaccount.models import SocialLogin from ..base import AuthError from .forms import LoginForm from .provider import OpenIDProvider from .utils import AXAttributes, DBOpenIDStore, JSONSafeSession, SRegFields def _openid_consumer(request, provider, endpoint): server_settings = provider.get_server_settings(endpoint) stateless = server_settings.get("stateless", False) store = None if stateless else DBOpenIDStore() client = consumer.Consumer(JSONSafeSession(request.session), store) return client class OpenIDLoginView(View): template_name = "openid/login.html" form_class = LoginForm provider = OpenIDProvider def get(self, request): form = self.get_form() if not form.is_valid(): return render(request, self.template_name, {"form": form}) try: return self.perform_openid_auth(form) except (UnicodeDecodeError, DiscoveryFailure) as e: # UnicodeDecodeError: necaris/python3-openid#1 return render_authentication_error(request, self.provider.id, exception=e) def post(self, request): form = self.get_form() if form.is_valid(): try: return self.perform_openid_auth(form) except (UnicodeDecodeError, DiscoveryFailure) as e: form._errors["openid"] = form.error_class([e]) return render(request, self.template_name, {"form": form}) def get_form(self): if self.request.method == "GET" and "openid" not in self.request.GET: return self.form_class( initial={ "next": self.request.GET.get("next"), "process": self.request.GET.get("process"), } ) return self.form_class( dict(list(self.request.GET.items()) + list(self.request.POST.items())) ) def get_client(self, provider, endpoint): return _openid_consumer(self.request, provider, endpoint) def get_realm(self, provider): return provider.get_settings().get( "REALM", self.request.build_absolute_uri("/") ) def get_callback_url(self): return reverse(callback) def perform_openid_auth(self, form): if not form.is_valid(): return form request = self.request provider = self.provider(request) endpoint = form.cleaned_data["openid"] client = self.get_client(provider, endpoint) realm = self.get_realm(provider) auth_request = client.begin(endpoint) if QUERY_EMAIL: sreg = SRegRequest() for name in SRegFields: sreg.requestField(field_name=name, required=True) auth_request.addExtension(sreg) ax = FetchRequest() for name in AXAttributes: ax.add(AttrInfo(name, required=True)) provider = OpenIDProvider(request) server_settings = provider.get_server_settings(request.GET.get("openid")) extra_attributes = server_settings.get("extra_attributes", []) for _, name, required in extra_attributes: ax.add(AttrInfo(name, required=required)) auth_request.addExtension(ax) SocialLogin.stash_state(request) # Fix for issues 1523 and 2072 (github django-allauth) if "next" in form.cleaned_data and form.cleaned_data["next"]: auth_request.return_to_args["next"] = form.cleaned_data["next"] redirect_url = auth_request.redirectURL( realm, request.build_absolute_uri(self.get_callback_url()) ) return HttpResponseRedirect(redirect_url) login = OpenIDLoginView.as_view() class OpenIDCallbackView(View): provider = OpenIDProvider def get(self, request): provider = self.provider(request) endpoint = request.GET.get("openid.op_endpoint", "") client = self.get_client(provider, endpoint) response = self.get_openid_response(client) if response.status == consumer.SUCCESS: login = providers.registry.by_id( self.provider.id, request ).sociallogin_from_response(request, response) login.state = SocialLogin.unstash_state(request) return self.complete_login(login) else: if response.status == consumer.CANCEL: error = AuthError.CANCELLED else: error = AuthError.UNKNOWN return self.render_error(error) post = get def complete_login(self, login): return complete_social_login(self.request, login) def render_error(self, error): return render_authentication_error(self.request, self.provider.id, error=error) def get_client(self, provider, endpoint): return _openid_consumer(self.request, provider, endpoint) def get_openid_response(self, client): return client.complete( dict(list(self.request.GET.items()) + list(self.request.POST.items())), self.request.build_absolute_uri(self.request.path), ) callback = csrf_exempt(OpenIDCallbackView.as_view()) django-allauth-0.47.0/allauth/socialaccount/providers/openstreetmap/000077500000000000000000000000001415442050100256545ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/openstreetmap/__init__.py000066400000000000000000000000001415442050100277530ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/openstreetmap/provider.py000066400000000000000000000016201415442050100300570ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth.provider import OAuthProvider class OpenStreetMapAccount(ProviderAccount): def get_profile_url(self): return ( "https://www.openstreetmap.org/user/" + self.account.extra_data["display_name"] ) def get_avatar_url(self): return self.account.extra_data.get("avatar") def get_username(self): return self.account.extra_data["display_name"] def to_str(self): return self.get_username() class OpenStreetMapProvider(OAuthProvider): id = "openstreetmap" name = "OpenStreetMap" account_class = OpenStreetMapAccount def extract_uid(self, data): return data["id"] def extract_common_fields(self, data): return dict(username=data["display_name"]) provider_classes = [OpenStreetMapProvider] django-allauth-0.47.0/allauth/socialaccount/providers/openstreetmap/tests.py000066400000000000000000000027241415442050100273750ustar00rootroot00000000000000# -*- coding: utf-8 -*- from allauth.socialaccount.tests import OAuthTestsMixin from allauth.tests import MockedResponse, TestCase from .provider import OpenStreetMapProvider class OpenStreetMapTests(OAuthTestsMixin, TestCase): provider_id = OpenStreetMapProvider.id def get_mocked_response(self): return [ MockedResponse( 200, r""" """, ) ] # noqa def test_login(self): account = super(OpenStreetMapTests, self).test_login() osm_account = account.get_provider_account() self.assertEqual(osm_account.get_username(), "Steve") self.assertEqual( osm_account.get_avatar_url(), "https://secure.gravatar.com/avatar.jpg", ) self.assertEqual( osm_account.get_profile_url(), "https://www.openstreetmap.org/user/Steve", ) django-allauth-0.47.0/allauth/socialaccount/providers/openstreetmap/urls.py000066400000000000000000000002631415442050100272140ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth.urls import default_urlpatterns from .provider import OpenStreetMapProvider urlpatterns = default_urlpatterns(OpenStreetMapProvider) django-allauth-0.47.0/allauth/socialaccount/providers/openstreetmap/views.py000066400000000000000000000031401415442050100273610ustar00rootroot00000000000000from xml.etree import ElementTree from xml.parsers.expat import ExpatError from allauth.socialaccount.providers.oauth.client import OAuth from allauth.socialaccount.providers.oauth.views import ( OAuthAdapter, OAuthCallbackView, OAuthLoginView, ) from .provider import OpenStreetMapProvider class OpenStreetMapAPI(OAuth): url = "https://www.openstreetmap.org/api/0.6/user/details" def get_user_info(self): raw_xml = self.query(self.url) try: user_element = ElementTree.fromstring(raw_xml).find("user") user_info = user_element.attrib user_avatar = user_element.find("img") if user_avatar is not None: user_info.update({"avatar": user_avatar.attrib.get("href")}) return user_info except (ExpatError, KeyError, IndexError): return None class OpenStreetMapOAuthAdapter(OAuthAdapter): provider_id = OpenStreetMapProvider.id request_token_url = "https://www.openstreetmap.org/oauth/request_token" access_token_url = "https://www.openstreetmap.org/oauth/access_token" authorize_url = "https://www.openstreetmap.org/oauth/authorize" def complete_login(self, request, app, token, response): client = OpenStreetMapAPI( request, app.client_id, app.secret, self.request_token_url ) extra_data = client.get_user_info() return self.get_provider().sociallogin_from_response(request, extra_data) oauth_login = OAuthLoginView.adapter_view(OpenStreetMapOAuthAdapter) oauth_callback = OAuthCallbackView.adapter_view(OpenStreetMapOAuthAdapter) django-allauth-0.47.0/allauth/socialaccount/providers/orcid/000077500000000000000000000000001415442050100240665ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/orcid/__init__.py000066400000000000000000000000001415442050100261650ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/orcid/provider.py000066400000000000000000000030341415442050100262720ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class Scope(object): USERINFO_PROFILE = "/authenticate" class OrcidAccount(ProviderAccount): def get_profile_url(self): return extract_from_dict(self.account.extra_data, ["orcid-identifier", "uri"]) def to_str(self): return self.account.uid class OrcidProvider(OAuth2Provider): id = "orcid" name = "Orcid.org" account_class = OrcidAccount def get_default_scope(self): return [Scope.USERINFO_PROFILE] def extract_uid(self, data): return extract_from_dict(data, ["orcid-identifier", "path"]) def extract_common_fields(self, data): common_fields = dict( email=extract_from_dict(data, ["person", "emails", "email", 0, "email"]), last_name=extract_from_dict( data, ["person", "name", "family-name", "value"] ), first_name=extract_from_dict( data, ["person", "name", "given-names", "value"] ), ) return dict((key, value) for (key, value) in common_fields.items() if value) provider_classes = [OrcidProvider] def extract_from_dict(data, path): """ Navigate `data`, a multidimensional array (list or dictionary), and returns the object at `path`. """ value = data try: for key in path: value = value[key] return value except (KeyError, IndexError, TypeError): return "" django-allauth-0.47.0/allauth/socialaccount/providers/orcid/tests.py000066400000000000000000000265031415442050100256100ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import OrcidProvider class OrcidTests(OAuth2TestsMixin, TestCase): provider_id = OrcidProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "orcid-identifier": { "uri": "https://sandbox.orcid.org/0000-0001-6796-198X", "path": "0000-0001-6796-198X", "host": "sandbox.orcid.org" }, "preferences": { "locale": "EN" }, "history": { "creation-method": "MEMBER_REFERRED", "completion-date": null, "submission-date": { "value": 1456951327337 }, "last-modified-date": { "value": 1519493486728 }, "claimed": true, "source": null, "deactivation-date": null, "verified-email": true, "verified-primary-email": true }, "person": { "last-modified-date": { "value": 1519493469738 }, "name": { "created-date": { "value": 1460669254582 }, "last-modified-date": { "value": 1460669254582 }, "given-names": { "value": "Patricia" }, "family-name": { "value": "Lawrence" }, "credit-name": null, "source": null, "visibility": "PUBLIC", "path": "0000-0001-6796-198X" }, "other-names": { "last-modified-date": null, "other-name": [], "path": "/0000-0001-6796-198X/other-names" }, "biography": { "created-date": { "value": 1460669254583 }, "last-modified-date": { "value": 1460669254583 }, "content": null, "visibility": "PUBLIC", "path": "/0000-0001-6796-198X/biography" }, "researcher-urls": { "last-modified-date": null, "researcher-url": [], "path": "/0000-0001-6796-198X/researcher-urls" }, "emails": { "last-modified-date": { "value": 1519493469738 }, "email": [ { "created-date": { "value": 1456951327661 }, "last-modified-date": { "value": 1519493469738 }, "source": { "source-orcid": { "uri": "https://sandbox.orcid.org/0000-0001-6796-198X", "path": "0000-0001-6796-198X", "host": "sandbox.orcid.org" }, "source-client-id": null, "source-name": { "value": "Patricia Lawrence" } }, "email": "lawrencepatricia@mailinator.com", "path": null, "visibility": "PUBLIC", "verified": true, "primary": true, "put-code": null } ], "path": "/0000-0001-6796-198X/email" }, "addresses": { "last-modified-date": null, "address": [], "path": "/0000-0001-6796-198X/address" }, "keywords": { "last-modified-date": null, "keyword": [], "path": "/0000-0001-6796-198X/keywords" }, "external-identifiers": { "last-modified-date": null, "external-identifier": [], "path": "/0000-0001-6796-198X/external-identifiers" }, "path": "/0000-0001-6796-198X/person" }, "activities-summary": { "last-modified-date": { "value": 1513777479628 }, "educations": { "last-modified-date": { "value": 1459957293365 }, "education-summary": [ { "created-date": { "value": 1459957293365 }, "last-modified-date": { "value": 1459957293365 }, "source": { "source-orcid": { "uri": "https://sandbox.orcid.org/0000-0001-6796-198X", "path": "0000-0001-6796-198X", "host": "sandbox.orcid.org" }, "source-client-id": null, "source-name": { "value": "Patricia Lawrence" } }, "department-name": null, "role-title": null, "start-date": null, "end-date": null, "organization": { "name": "Polytech'Rambouillet", "address": { "city": "Rambouillet", "region": null, "country": "FR" }, "disambiguated-organization": null }, "visibility": "PUBLIC", "put-code": 19996, "path": "/0000-0001-6796-198X/education/19996" } ], "path": "/0000-0001-6796-198X/educations" }, "employments": { "last-modified-date": { "value": 1513777479628 }, "employment-summary": [ { "created-date": { "value": 1510399314937 }, "last-modified-date": { "value": 1513777479628 }, "source": { "source-orcid": { "uri": "https://sandbox.orcid.org/0000-0001-6796-198X", "path": "0000-0001-6796-198X", "host": "sandbox.orcid.org" }, "source-client-id": null, "source-name": { "value": "Patricia Lawrence" } }, "department-name": null, "role-title": null, "start-date": { "year": { "value": "2015" }, "month": { "value": "03" }, "day": { "value": "02" } }, "end-date": null, "organization": { "name": "École nationale supérieure de céramique industrielle", "address": { "city": "Limoges", "region": null, "country": "FR" }, "disambiguated-organization": { "disambiguated-organization-identifier": "105362", "disambiguation-source": "RINGGOLD" } }, "visibility": "PUBLIC", "put-code": 29138, "path": "/0000-0001-6796-198X/employment/29138" }, { "created-date": { "value": 1502366640610 }, "last-modified-date": { "value": 1513777467282 }, "source": { "source-orcid": { "uri": "https://sandbox.orcid.org/0000-0001-6796-198X", "path": "0000-0001-6796-198X", "host": "sandbox.orcid.org" }, "source-client-id": null, "source-name": { "value": "Patricia Lawrence" } }, "department-name": null, "role-title": null, "start-date": { "year": { "value": "2002" }, "month": { "value": "02" }, "day": { "value": "16" } }, "end-date": { "year": { "value": "2015" }, "month": { "value": "08" }, "day": { "value": "12" } }, "organization": { "name": "University of Cambridge", "address": { "city": "Cambridge", "region": "Cambridgeshire", "country": "GB" }, "disambiguated-organization": { "disambiguated-organization-identifier": "2152", "disambiguation-source": "RINGGOLD" } }, "visibility": "PUBLIC", "put-code": 27562, "path": "/0000-0001-6796-198X/employment/27562" } ], "path": "/0000-0001-6796-198X/employments" }, "fundings": { "last-modified-date": null, "group": [], "path": "/0000-0001-6796-198X/fundings" }, "peer-reviews": { "last-modified-date": null, "group": [], "path": "/0000-0001-6796-198X/peer-reviews" }, "works": { "last-modified-date": { "value": 1459957753077 }, "group": [ { "last-modified-date": { "value": 1459957753077 }, "external-ids": { "external-id": [] }, "work-summary": [ { "put-code": 583440, "created-date": { "value": 1459957753047 }, "last-modified-date": { "value": 1459957753077 }, "source": { "source-orcid": { "uri": "https://sandbox.orcid.org/0000-0001-6796-198X", "path": "0000-0001-6796-198X", "host": "sandbox.orcid.org" }, "source-client-id": null, "source-name": { "value": "Patricia Lawrence" } }, "title": { "title": { "value": "Standard & Poor's fiscal methodology reviewed" }, "subtitle": null, "translated-title": null }, "external-ids": { "external-id": [] }, "type": "JOURNAL_ARTICLE", "publication-date": { "year": { "value": "2001" }, "month": { "value": "07" }, "day": { "value": "14" }, "media-type": null }, "visibility": "PUBLIC", "path": "/0000-0001-6796-198X/work/583440", "display-index": "0" } ] } ], "path": "/0000-0001-6796-198X/works" }, "path": "/0000-0001-6796-198X/activities" }, "path": "/0000-0001-6796-198X" } """, ) def get_login_response_json(self, with_refresh_token=True): # FIXME: This is not an actual response. I added this in order # to get the test suite going but did not verify to check the # exact response being returned. return """ { "access_token": "testac", "expires_in": 631138026, "token_type": "bearer", "orcid": "0000-0001-6796-198X", "scope": "/orcid-profile/read-limited", "refresh_token": "testrf" }""" django-allauth-0.47.0/allauth/socialaccount/providers/orcid/urls.py000066400000000000000000000002441415442050100254250ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import OrcidProvider urlpatterns = default_urlpatterns(OrcidProvider) django-allauth-0.47.0/allauth/socialaccount/providers/orcid/views.py000066400000000000000000000030061415442050100255740ustar00rootroot00000000000000import requests from allauth.socialaccount import app_settings from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import OrcidProvider class OrcidOAuth2Adapter(OAuth2Adapter): provider_id = OrcidProvider.id # http://support.orcid.org/knowledgebase/articles/335483-the-public- # client-orcid-api member_api_default = False base_domain_default = "orcid.org" settings = app_settings.PROVIDERS.get(provider_id, {}) base_domain = settings.get("BASE_DOMAIN", base_domain_default) member_api = settings.get("MEMBER_API", member_api_default) api_domain = "{0}.{1}".format("api" if member_api else "pub", base_domain) authorize_url = "https://{0}/oauth/authorize".format(base_domain) access_token_url = "https://{0}/oauth/token".format(api_domain) profile_url = "https://{0}/v2.1/%s/record".format(api_domain) def complete_login(self, request, app, token, **kwargs): params = {} if self.member_api: params["access_token"] = token.token resp = requests.get( self.profile_url % kwargs["response"]["orcid"], params=params, headers={"accept": "application/orcid+json"}, ) extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(OrcidOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(OrcidOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/patreon/000077500000000000000000000000001415442050100244365ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/patreon/__init__.py000066400000000000000000000000001415442050100265350ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/patreon/models.py000066400000000000000000000000001415442050100262610ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/patreon/provider.py000066400000000000000000000026071415442050100266470ustar00rootroot00000000000000""" Provider for Patreon """ from django.conf import settings from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider API_VERSION = ( getattr(settings, "SOCIALACCOUNT_PROVIDERS", {}) .get("patreon", {}) .get("VERSION", "v1") ) USE_API_V2 = True if API_VERSION == "v2" else False API_URL = "https://www.patreon.com/api/oauth2/" + (API_VERSION if USE_API_V2 else "api") class PatreonAccount(ProviderAccount): def get_avatar_url(self): return self.account.extra_data.get("attributes").get("thumb_url") class PatreonProvider(OAuth2Provider): id = "patreon" name = "Patreon" account_class = PatreonAccount def get_default_scope(self): if USE_API_V2: return [ "identity", "identity[email]", "campaigns", "campaigns.members", ] return ["pledges-to-me", "users", "my-campaign"] def extract_uid(self, data): return data.get("id") def extract_common_fields(self, data): details = data["attributes"] return { "email": details.get("email"), "fullname": details.get("full_name"), "first_name": details.get("first_name"), "last_name": details.get("last_name"), } provider_classes = [PatreonProvider] django-allauth-0.47.0/allauth/socialaccount/providers/patreon/test.py000066400000000000000000000036111415442050100257700ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import PatreonProvider class PatreonTests(OAuth2TestsMixin, TestCase): provider_id = PatreonProvider.id def get_mocked_response(self): return MockedResponse( 200, """{ "data": { "relationships": { "pledges": { "data": [{ "type": "pledge", "id": "123456" }] } }, "attributes": { "last_name": "Interwebs", "is_suspended": false, "has_password": true, "full_name": "John Interwebs", "is_nuked": false, "first_name": "John", "social_connections": { "spotify": null, "discord": null, "twitter": null, "youtube": null, "facebook": null, "deviantart": null, "twitch": null }, "twitter": null, "is_email_verified": true, "facebook_id": null, "email": "john@example.com", "facebook": null, "thumb_url": "https://c8.patreon.com/100/123456", "vanity": null, "about": null, "is_deleted": false, "created": "2017-05-05T05:16:34+00:00", "url": "https://www.patreon.com/user?u=123456", "gender": 0, "youtube": null, "discord_id": null, "image_url": "https://c8.patreon.com/400/123456", "twitch": null }, "type": "user", "id": "123456" } }""", ) # noqa django-allauth-0.47.0/allauth/socialaccount/providers/patreon/urls.py000066400000000000000000000003111415442050100257700ustar00rootroot00000000000000"""URLs for Patreon Provider""" from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import PatreonProvider urlpatterns = default_urlpatterns(PatreonProvider) django-allauth-0.47.0/allauth/socialaccount/providers/patreon/views.py000066400000000000000000000037771415442050100261630ustar00rootroot00000000000000""" Views for PatreonProvider https://www.patreon.com/platform/documentation/oauth """ import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import API_URL, USE_API_V2, PatreonProvider class PatreonOAuth2Adapter(OAuth2Adapter): provider_id = PatreonProvider.id access_token_url = "https://www.patreon.com/api/oauth2/token" authorize_url = "https://www.patreon.com/oauth2/authorize" profile_url = "{0}/{1}".format( API_URL, "identity?include=memberships&fields%5Buser%5D=email,first_name," "full_name,image_url,last_name,social_connections," "thumb_url,url,vanity" if USE_API_V2 else "current_user", ) def complete_login(self, request, app, token, **kwargs): resp = requests.get( self.profile_url, headers={"Authorization": "Bearer " + token.token}, ) extra_data = resp.json().get("data") if USE_API_V2: # Extract tier/pledge level for Patreon API v2: try: member_id = extra_data["relationships"]["memberships"]["data"][0]["id"] member_url = ( "{0}/members/{1}?include=" "currently_entitled_tiers&fields%5Btier%5D=title" ).format(API_URL, member_id) resp_member = requests.get( member_url, headers={"Authorization": "Bearer " + token.token}, ) pledge_title = resp_member.json()["included"][0]["attributes"]["title"] extra_data["pledge_level"] = pledge_title except (KeyError, IndexError): extra_data["pledge_level"] = None pass return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(PatreonOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(PatreonOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/paypal/000077500000000000000000000000001415442050100242545ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/paypal/__init__.py000066400000000000000000000000001415442050100263530ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/paypal/provider.py000066400000000000000000000020321415442050100264550ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class PaypalAccount(ProviderAccount): def get_avatar_url(self): return self.account.extra_data.get("picture") def to_str(self): return self.account.extra_data.get("name", super(PaypalAccount, self).to_str()) class PaypalProvider(OAuth2Provider): id = "paypal" name = "Paypal" account_class = PaypalAccount def get_default_scope(self): # See: https://developer.paypal.com/docs/integration/direct/identity/attributes/ # noqa return ["openid", "email"] def extract_uid(self, data): return str(data["user_id"]) def extract_common_fields(self, data): # See: https://developer.paypal.com/docs/api/#get-user-information return dict( first_name=data.get("given_name", ""), last_name=data.get("family_name", ""), email=data.get("email"), ) provider_classes = [PaypalProvider] django-allauth-0.47.0/allauth/socialaccount/providers/paypal/tests.py000066400000000000000000000011451415442050100257710ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import PaypalProvider class PaypalTests(OAuth2TestsMixin, TestCase): provider_id = PaypalProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "user_id": "https://www.paypal.com/webapps/auth/server/64ghr894040044", "name": "Jane Doe", "given_name": "Jane", "family_name": "Doe", "email": "janedoe@example.com" } """, ) django-allauth-0.47.0/allauth/socialaccount/providers/paypal/urls.py000066400000000000000000000002461415442050100256150ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import PaypalProvider urlpatterns = default_urlpatterns(PaypalProvider) django-allauth-0.47.0/allauth/socialaccount/providers/paypal/views.py000066400000000000000000000027101415442050100257630ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import PaypalProvider class PaypalOAuth2Adapter(OAuth2Adapter): provider_id = PaypalProvider.id supports_state = False @property def authorize_url(self): path = "webapps/auth/protocol/openidconnect/v1/authorize" return "https://www.{0}/{1}".format(self._get_endpoint(), path) @property def access_token_url(self): path = "v1/identity/openidconnect/tokenservice" return "https://api.{0}/{1}".format(self._get_endpoint(), path) @property def profile_url(self): path = "v1/identity/openidconnect/userinfo" return "https://api.{0}/{1}".format(self._get_endpoint(), path) def _get_endpoint(self): settings = self.get_provider().get_settings() if settings.get("MODE") == "live": return "paypal.com" else: return "sandbox.paypal.com" def complete_login(self, request, app, token, **kwargs): response = requests.post( self.profile_url, params={"schema": "openid", "access_token": token}, ) extra_data = response.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(PaypalOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(PaypalOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/persona/000077500000000000000000000000001415442050100244355ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/persona/__init__.py000066400000000000000000000000001415442050100265340ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/persona/models.py000066400000000000000000000000001415442050100262600ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/persona/provider.py000066400000000000000000000024371415442050100266470ustar00rootroot00000000000000import json from django.template.loader import render_to_string from django.utils.html import escapejs from allauth.account.models import EmailAddress from allauth.socialaccount.providers.base import Provider, ProviderAccount class PersonaAccount(ProviderAccount): def to_str(self): return self.account.uid class PersonaProvider(Provider): id = "persona" name = "Persona" account_class = PersonaAccount def media_js(self, request): settings = self.get_settings() request_parameters = settings.get("REQUEST_PARAMETERS", {}) ctx = {"request_parameters": json.dumps(request_parameters)} return render_to_string("persona/auth.html", ctx, request=request) def get_login_url(self, request, **kwargs): next_url = "'%s'" % escapejs(kwargs.get("next") or "") process = "'%s'" % escapejs(kwargs.get("process") or "login") return "javascript:allauth.persona.login(%s, %s)" % (next_url, process) def extract_uid(self, data): return data["email"] def extract_common_fields(self, data): return dict(email=data["email"]) def extract_email_addresses(self, data): ret = [EmailAddress(email=data["email"], verified=True, primary=True)] return ret provider_classes = [PersonaProvider] django-allauth-0.47.0/allauth/socialaccount/providers/persona/templates/000077500000000000000000000000001415442050100264335ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/persona/templates/persona/000077500000000000000000000000001415442050100301025ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/persona/templates/persona/auth.html000066400000000000000000000021361415442050100317330ustar00rootroot00000000000000
{% csrf_token %}
django-allauth-0.47.0/allauth/socialaccount/providers/persona/tests.py000066400000000000000000000016521415442050100261550ustar00rootroot00000000000000from django.test.utils import override_settings from django.urls import reverse from allauth.tests import TestCase, patch from allauth.utils import get_user_model SOCIALACCOUNT_PROVIDERS = {"persona": {"AUDIENCE": "https://www.example.com:433"}} class PersonaTests(TestCase): @override_settings(SOCIALACCOUNT_PROVIDERS=SOCIALACCOUNT_PROVIDERS) def test_login(self): with patch( "allauth.socialaccount.providers.persona.views.requests" ) as requests_mock: requests_mock.post.return_value.json.return_value = { "status": "okay", "email": "persona@example.com", } resp = self.client.post(reverse("persona_login"), dict(assertion="dummy")) self.assertRedirects( resp, "/accounts/profile/", fetch_redirect_response=False ) get_user_model().objects.get(email="persona@example.com") django-allauth-0.47.0/allauth/socialaccount/providers/persona/urls.py000066400000000000000000000002061415442050100257720ustar00rootroot00000000000000from django.urls import path from . import views urlpatterns = [path("persona/login/", views.persona_login, name="persona_login")] django-allauth-0.47.0/allauth/socialaccount/providers/persona/views.py000066400000000000000000000031101415442050100261370ustar00rootroot00000000000000import requests from django.core.exceptions import ImproperlyConfigured from allauth.socialaccount import app_settings, providers from allauth.socialaccount.helpers import ( complete_social_login, render_authentication_error, ) from allauth.socialaccount.models import SocialLogin from .provider import PersonaProvider def persona_login(request): assertion = request.POST.get("assertion", "") settings = app_settings.PROVIDERS.get(PersonaProvider.id, {}) audience = settings.get("AUDIENCE", None) if audience is None: raise ImproperlyConfigured( "No Persona audience configured. Please " "add an AUDIENCE item to the " "SOCIALACCOUNT_PROVIDERS['persona'] setting." ) resp = requests.post( "https://verifier.login.persona.org/verify", {"assertion": assertion, "audience": audience}, ) try: resp.raise_for_status() extra_data = resp.json() if extra_data["status"] != "okay": return render_authentication_error( request, provider_id=PersonaProvider.id, extra_context={"response": extra_data}, ) except (ValueError, requests.RequestException) as e: return render_authentication_error( request, provider_id=PersonaProvider.id, exception=e ) login = providers.registry.by_id( PersonaProvider.id, request ).sociallogin_from_response(request, extra_data) login.state = SocialLogin.state_from_request(request) return complete_social_login(request, login) django-allauth-0.47.0/allauth/socialaccount/providers/pinterest/000077500000000000000000000000001415442050100250035ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/pinterest/__init__.py000066400000000000000000000000001415442050100271020ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/pinterest/provider.py000066400000000000000000000020371415442050100272110ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class PinterestAccount(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("url") def to_str(self): dflt = super(PinterestAccount, self).to_str() return self.account.extra_data.get("username", dflt) class PinterestProvider(OAuth2Provider): id = "pinterest" name = "Pinterest" account_class = PinterestAccount def get_default_scope(self): # See: https://developers.pinterest.com/docs/api/overview/#scopes return ["read_public"] def extract_extra_data(self, data): return data.get("data", {}) def extract_uid(self, data): return str(data["data"]["id"]) def extract_common_fields(self, data): return dict( first_name=data.get("data", {}).get("first_name"), last_name=data.get("data", {}).get("last_name"), ) provider_classes = [PinterestProvider] django-allauth-0.47.0/allauth/socialaccount/providers/pinterest/tests.py000066400000000000000000000011351415442050100265170ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import PinterestProvider class PinterestTests(OAuth2TestsMixin, TestCase): provider_id = PinterestProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "data": { "url": "https://www.pinterest.com/muravskiyyarosl/", "first_name": "Jane", "last_name": "Doe", "id": "351247977031674143" } } """, ) django-allauth-0.47.0/allauth/socialaccount/providers/pinterest/urls.py000066400000000000000000000002541415442050100263430ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import PinterestProvider urlpatterns = default_urlpatterns(PinterestProvider) django-allauth-0.47.0/allauth/socialaccount/providers/pinterest/views.py000066400000000000000000000024611415442050100265150ustar00rootroot00000000000000import requests from allauth.socialaccount import app_settings from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import PinterestProvider class PinterestOAuth2Adapter(OAuth2Adapter): provider_id = PinterestProvider.id provider_default_url = "api.pinterest.com" provider_default_api_version = "v1" settings = app_settings.PROVIDERS.get(provider_id, {}) provider_base_url = settings.get("PINTEREST_URL", provider_default_url) provider_api_version = settings.get( "PINTEREST_VERSION", provider_default_api_version ) access_token_url = "https://{0}/{1}/oauth/token".format( provider_base_url, provider_api_version ) authorize_url = "https://{0}/oauth/".format(provider_base_url) profile_url = "https://{0}/{1}/me".format(provider_base_url, provider_api_version) def complete_login(self, request, app, token, **kwargs): response = requests.get(self.profile_url, params={"access_token": token.token}) extra_data = response.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(PinterestOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(PinterestOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/quickbooks/000077500000000000000000000000001415442050100251405ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/quickbooks/__init__.py000066400000000000000000000000001415442050100272370ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/quickbooks/models.py000066400000000000000000000000001415442050100267630ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/quickbooks/provider.py000066400000000000000000000037531415442050100273540ustar00rootroot00000000000000from allauth.socialaccount import app_settings from allauth.socialaccount.providers.base import ( ProviderAccount, ProviderException, ) from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class QuickBooksAccount(ProviderAccount): def to_str(self): dflt = super(QuickBooksAccount, self).to_str() name = self.account.extra_data.get("name", dflt) first_name = self.account.extra_data.get("givenName", None) last_name = self.account.extra_data.get("familyName", None) if first_name and last_name: name = first_name + " " + last_name return name class QuickBooksOAuth2Provider(OAuth2Provider): id = "quickbooks" # Name is displayed to ordinary users -- don't include protocol name = "QuickBooks" account_class = QuickBooksAccount def extract_uid(self, data): if "sub" not in data: raise ProviderException("QBO error", data) return str(data["sub"]) def get_profile_fields(self): default_fields = [ "address", "sub", "phoneNumber", "givenName", "familyName", "email", "emailVerified", ] fields = self.get_settings().get("PROFILE_FIELDS", default_fields) return fields def get_default_scope(self): scope = [ "openid", "com.intuit.quickbooks.accounting", "profile", "phone", ] if app_settings.QUERY_EMAIL: scope.append("email") return scope def extract_common_fields(self, data): return dict( email=data.get("email"), address=data.get("address"), sub=data.get("sub"), givenName=data.get("givenName"), familynName=data.get("familyName"), emailVerified=data.get("emailVerified"), phoneNumber=data.get("phoneNumber"), ) provider_classes = [QuickBooksOAuth2Provider] django-allauth-0.47.0/allauth/socialaccount/providers/quickbooks/test.py000066400000000000000000000012051415442050100264670ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import QuickBooksOAuth2Provider class QuickBooksOAuth2Tests(OAuth2TestsMixin, TestCase): provider_id = QuickBooksOAuth2Provider.id def get_mocked_response(self): return MockedResponse( 200, """ { "sub": "d8752092-0f2b-4b6e-86ef-6b72f2457a00", "emailVerified": true, "familyName": "Mckeeman", "phoneNumber": "+1 4156694355", "givenName": "Darren", "phoneNumberVerified": true, "email": "darren@blocklight.io"} """, ) django-allauth-0.47.0/allauth/socialaccount/providers/quickbooks/urls.py000066400000000000000000000002721415442050100265000ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import QuickBooksOAuth2Provider urlpatterns = default_urlpatterns(QuickBooksOAuth2Provider) django-allauth-0.47.0/allauth/socialaccount/providers/quickbooks/views.py000066400000000000000000000031311415442050100266450ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import QuickBooksOAuth2Provider class QuickBooksOAuth2Adapter(OAuth2Adapter): provider_id = QuickBooksOAuth2Provider.id access_token_url = "https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer" authorize_url = "https://appcenter.intuit.com/connect/oauth2" profile_test = "https://sandbox-accounts.platform.intuit.com/v1/openid_connect/userinfo" # NOQA profile_url = "https://accounts.platform.intuit.com/v1/openid_connect/userinfo" profile_url_method = "GET" access_token_method = "POST" def complete_login(self, request, app, token, **kwargs): realm_id = request.GET.get("realmId") extra_data = self.get_user_info(token) if realm_id: extra_data["realmId"] = realm_id return self.get_provider().sociallogin_from_response(request, extra_data) def get_user_info(self, token): auth_header = "Bearer " + token.token headers = { "Accept": "application/json", "Authorization": auth_header, "accept": "application/json", } is_sandbox = self.get_provider().get_settings().get("SANDBOX", False) url = self.profile_test if is_sandbox else self.profile_url resp = requests.get(url, headers=headers) resp.raise_for_status() return resp.json() oauth2_login = OAuth2LoginView.adapter_view(QuickBooksOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(QuickBooksOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/reddit/000077500000000000000000000000001415442050100242415ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/reddit/__init__.py000066400000000000000000000000001415442050100263400ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/reddit/provider.py000077500000000000000000000013151415442050100264500ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class RedditAccount(ProviderAccount): def to_str(self): dflt = super(RedditAccount, self).to_str() name = self.account.extra_data.get("name", dflt) return name class RedditProvider(OAuth2Provider): id = "reddit" name = "Reddit" account_class = RedditAccount def extract_uid(self, data): return data["name"] def extract_common_fields(self, data): return dict(username=data.get("name")) def get_default_scope(self): scope = ["identity"] return scope provider_classes = [RedditProvider] django-allauth-0.47.0/allauth/socialaccount/providers/reddit/tests.py000077500000000000000000000010021415442050100257510ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals from allauth.socialaccount.providers import registry from allauth.socialaccount.tests import create_oauth2_tests from allauth.tests import MockedResponse from .provider import RedditProvider class RedditTests(create_oauth2_tests(registry.by_id(RedditProvider.id))): def get_mocked_response(self): return [ MockedResponse( 200, """{ "name": "wayward710"}""", ) ] django-allauth-0.47.0/allauth/socialaccount/providers/reddit/urls.py000077500000000000000000000002461415442050100256050ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import RedditProvider urlpatterns = default_urlpatterns(RedditProvider) django-allauth-0.47.0/allauth/socialaccount/providers/reddit/views.py000077500000000000000000000024361415442050100257600ustar00rootroot00000000000000import requests from allauth.socialaccount import app_settings from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import RedditProvider class RedditAdapter(OAuth2Adapter): provider_id = RedditProvider.id access_token_url = "https://www.reddit.com/api/v1/access_token" authorize_url = "https://www.reddit.com/api/v1/authorize" profile_url = "https://oauth.reddit.com/api/v1/me" basic_auth = True settings = app_settings.PROVIDERS.get(provider_id, {}) # Allow custom User Agent to comply with reddit API limits headers = {"User-Agent": settings.get("USER_AGENT", "django-allauth-header")} def complete_login(self, request, app, token, **kwargs): headers = {"Authorization": "bearer " + token.token} headers.update(self.headers) extra_data = requests.get(self.profile_url, headers=headers) # This only here because of weird response from the test suite if isinstance(extra_data, list): extra_data = extra_data[0] return self.get_provider().sociallogin_from_response(request, extra_data.json()) oauth2_login = OAuth2LoginView.adapter_view(RedditAdapter) oauth2_callback = OAuth2CallbackView.adapter_view(RedditAdapter) django-allauth-0.47.0/allauth/socialaccount/providers/robinhood/000077500000000000000000000000001415442050100247515ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/robinhood/__init__.py000066400000000000000000000000001415442050100270500ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/robinhood/provider.py000066400000000000000000000013571415442050100271630ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class RobinhoodAccount(ProviderAccount): def get_avatar_url(self): return None def to_str(self): return self.account.extra_data.get( "username", super(RobinhoodAccount, self).to_str() ) class RobinhoodProvider(OAuth2Provider): id = "robinhood" name = "Robinhood" account_class = RobinhoodAccount def get_default_scope(self): return ["read"] def extract_uid(self, data): return data["id"] def extract_common_fields(self, data): return dict(username=data.get("username")) provider_classes = [RobinhoodProvider] django-allauth-0.47.0/allauth/socialaccount/providers/robinhood/tests.py000066400000000000000000000007131415442050100264660ustar00rootroot00000000000000from allauth.socialaccount.providers import registry from allauth.socialaccount.tests import create_oauth2_tests from allauth.tests import MockedResponse from .provider import RobinhoodProvider class RobinhoodTests(create_oauth2_tests(registry.by_id(RobinhoodProvider.id))): def get_mocked_response(self): return MockedResponse( 200, """ { "username": "test_username", "id": "1234-5678-910" } """, ) django-allauth-0.47.0/allauth/socialaccount/providers/robinhood/urls.py000066400000000000000000000002541415442050100263110ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import RobinhoodProvider urlpatterns = default_urlpatterns(RobinhoodProvider) django-allauth-0.47.0/allauth/socialaccount/providers/robinhood/views.py000066400000000000000000000020141415442050100264550ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import RobinhoodProvider class RobinhoodOAuth2Adapter(OAuth2Adapter): provider_id = RobinhoodProvider.id @property def authorize_url(self): return "https://www.robinhood.com/oauth2/authorize/" @property def access_token_url(self): return "https://api.robinhood.com/oauth2/token/" @property def profile_url(self): return "https://api.robinhood.com/user/id/" def complete_login(self, request, app, token, **kwargs): response = requests.get( self.profile_url, headers={"Authorization": "Bearer %s" % token.token}, ) extra_data = response.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(RobinhoodOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(RobinhoodOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/salesforce/000077500000000000000000000000001415442050100251145ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/salesforce/__init__.py000066400000000000000000000000001415442050100272130ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/salesforce/provider.py000066400000000000000000000033401415442050100273200ustar00rootroot00000000000000from allauth.account.models import EmailAddress from allauth.socialaccount import providers from allauth.socialaccount.providers.base import AuthAction, ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class SalesforceAccount(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("link") def get_avatar_url(self): return self.account.extra_data.get("picture") def to_str(self): dflt = super(SalesforceAccount, self).to_str() return self.account.extra_data.get("name", dflt) class SalesforceProvider(OAuth2Provider): id = "salesforce" name = "Salesforce" package = "allauth.socialaccount.providers.salesforce" account_class = SalesforceAccount def get_default_scope(self): return ["id", "openid"] def get_auth_params(self, request, action): ret = super(SalesforceProvider, self).get_auth_params(request, action) if action == AuthAction.REAUTHENTICATE: ret["approval_prompt"] = "force" return ret def extract_uid(self, data): return str(data["user_id"]) def extract_common_fields(self, data): return dict( email=data.get("email"), last_name=data.get("family_name"), first_name=data.get("given_name"), username=data.get("preferred_username"), ) def extract_email_addresses(self, data): # a salesforce user must have an email, but it might not be verified email = EmailAddress( email=data.get("email"), primary=True, verified=data.get("email_verified"), ) return [email] providers.registry.register(SalesforceProvider) django-allauth-0.47.0/allauth/socialaccount/providers/salesforce/tests.py000066400000000000000000000042051415442050100266310ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import absolute_import, unicode_literals from allauth.socialaccount.providers import registry from allauth.socialaccount.tests import create_oauth2_tests from allauth.tests import MockedResponse from .provider import SalesforceProvider class SalesforceTests(create_oauth2_tests(registry.by_id(SalesforceProvider.id))): def get_mocked_response( self, last_name="Penners", first_name="Raymond", name="Raymond Penners", email="raymond.penners@gmail.com", verified_email=True, ): userinfo = USERINFO_RESPONSE.format( org_id="00Dxx00000000000A0", user_id="005xx000000aWwRQAU", vip="https://test.salesforce.com", nickname="test-ooi2xhmjteep", first_name=first_name, last_name=last_name, my_domain="https://fun.cs46.my.salesforce.com", content_domain="https://fun--c.cs46.content.force.com", verified_email=repr(verified_email).lower(), email=email, active="true", is_app_installed="true", ) return MockedResponse(200, userinfo) USERINFO_RESPONSE = """ {{ "sub": "{vip}/id/{org_id}/{user_id}", "user_id": "{user_id}", "organization_id": "{org_id}", "preferred_username": "{nickname}@sample_-_dev_workspace.net", "nickname": "{nickname}", "name": "{first_name} {last_name}", "email": "{email}", "email_verified": {verified_email}, "given_name": "{first_name}", "family_name": "{last_name}", "zoneinfo": "America/Los_Angeles", "photos": {{ "picture": "{content_domain}/profilephoto/005/F", "thumbnail": "{content_domain}/profilephoto/005/T" }}, "profile": "{my_domain}/{user_id}", "picture": "{content_domain}/profilephoto/005/F", "address": {{"country": "US"}}, "urls": {{"custom_domain": "{my_domain}"}}, "active": {active}, "user_type": "STANDARD", "language": "en_US", "locale": "en_US", "utcOffset": -28800000, "updated_at": "2017-10-05T20:39:02.000+0000", "is_app_installed": {is_app_installed} }} """ django-allauth-0.47.0/allauth/socialaccount/providers/salesforce/urls.py000066400000000000000000000002561415442050100264560ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import SalesforceProvider urlpatterns = default_urlpatterns(SalesforceProvider) django-allauth-0.47.0/allauth/socialaccount/providers/salesforce/views.py000066400000000000000000000021621415442050100266240ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import SalesforceProvider class SalesforceOAuth2Adapter(OAuth2Adapter): provider_id = SalesforceProvider.id @property def base_url(self): return self.get_provider().get_app(self.request).key @property def authorize_url(self): return "{}/services/oauth2/authorize".format(self.base_url) @property def access_token_url(self): return "{}/services/oauth2/token".format(self.base_url) @property def userinfo_url(self): return "{}/services/oauth2/userinfo".format(self.base_url) def complete_login(self, request, app, token, **kwargs): resp = requests.get(self.userinfo_url, params={"oauth_token": token}) resp.raise_for_status() extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(SalesforceOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(SalesforceOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/sharefile/000077500000000000000000000000001415442050100247305ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/sharefile/__init__.py000066400000000000000000000000001415442050100270270ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/sharefile/provider.py000066400000000000000000000013701415442050100271350ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class ShareFileAccount(ProviderAccount): def to_str(self): dflt = super(ShareFileAccount, self).to_str() return self.account.extra_data.get("name", dflt) class ShareFileProvider(OAuth2Provider): id = "sharefile" name = "ShareFile" account_class = ShareFileAccount def extract_uid(self, data): return str(data.get("Id", "")) def extract_common_fields(self, data): return dict( email=data.get("Email", ""), username=data.get("Username", ""), name=data.get("FullName", ""), ) provider_classes = [ShareFileProvider] django-allauth-0.47.0/allauth/socialaccount/providers/sharefile/tests.py000066400000000000000000000014731415442050100264510ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import ShareFileProvider class ShareFileTests(OAuth2TestsMixin, TestCase): provider_id = ShareFileProvider.id def get_mocked_response(self): return MockedResponse( 200, """ {"access_token": "12345678abcdef", "refresh_token": "12345678abcdef", "token_type": "bearer", "expires_in": 28800, "appcp": "sharefile.com", "apicp": "sharefile.com", "subdomain": "example", "access_files_folders": true, "modify_files_folders": true, "admin_users": true, "admin_accounts": true, "change_my_settings": true, "web_app_login": true} """, ) django-allauth-0.47.0/allauth/socialaccount/providers/sharefile/urls.py000066400000000000000000000002541415442050100262700ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import ShareFileProvider urlpatterns = default_urlpatterns(ShareFileProvider) django-allauth-0.47.0/allauth/socialaccount/providers/sharefile/views.py000066400000000000000000000026301415442050100264400ustar00rootroot00000000000000import requests from allauth.socialaccount import app_settings from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import ShareFileProvider class ShareFileOAuth2Adapter(OAuth2Adapter): provider_id = ShareFileProvider.id settings = app_settings.PROVIDERS.get(provider_id, {}) subdomain = settings.get("SUBDOMAIN", "secure") apicp = settings.get("APICP", "sharefile.com") provider_default_url = settings.get("DEFAULT_URL", "https://secure.sharefile.com") provider_default_api_url = "https://{}.sf-api.com".format(subdomain) provider_api_version = "v3" access_token_url = "https://{}.{}/oauth/token".format(subdomain, apicp) refresh_token_url = "https://{}.{}/oauth/token".format(subdomain, apicp) authorize_url = "{}/oauth/authorize".format(provider_default_url) profile_url = "{}/sf/{}/Users".format( provider_default_api_url, provider_api_version ) def complete_login(self, request, app, token, response): headers = {"Authorization": "Bearer {}".format(token.token)} extra_data = requests.get(self.profile_url, headers=headers).json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(ShareFileOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(ShareFileOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/shopify/000077500000000000000000000000001415442050100244475ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/shopify/__init__.py000066400000000000000000000000001415442050100265460ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/shopify/provider.py000066400000000000000000000032761415442050100266630ustar00rootroot00000000000000from django.conf import settings from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class ShopifyAccount(ProviderAccount): pass class ShopifyProvider(OAuth2Provider): id = "shopify" name = "Shopify" account_class = ShopifyAccount @property def is_per_user(self): grant_options = ( getattr(settings, "SOCIALACCOUNT_PROVIDERS", {}) .get("shopify", {}) .get("AUTH_PARAMS", {}) .get("grant_options[]", "") ) return grant_options.lower().strip() == "per-user" def get_auth_params(self, request, action): ret = super(ShopifyProvider, self).get_auth_params(request, action) shop = request.GET.get("shop", None) if shop: ret.update({"shop": shop}) return ret def get_default_scope(self): return ["read_orders", "read_products"] def extract_uid(self, data): if self.is_per_user: return str(data["associated_user"]["id"]) else: return str(data["shop"]["id"]) def extract_common_fields(self, data): if self.is_per_user: return dict( email=data["associated_user"]["email"], first_name=data["associated_user"]["first_name"], last_name=data["associated_user"]["last_name"], ) else: # See: https://docs.shopify.com/api/shop # Without online mode, User is only available with Shopify Plus, # email is the only common field return dict(email=data["shop"]["email"]) provider_classes = [ShopifyProvider] django-allauth-0.47.0/allauth/socialaccount/providers/shopify/tests.py000066400000000000000000000126471415442050100261750ustar00rootroot00000000000000import json from urllib.parse import parse_qs, urlparse from django.test.utils import override_settings from django.urls import reverse from django.utils.http import urlencode from allauth.socialaccount.models import SocialAccount from allauth.socialaccount.providers import registry from allauth.socialaccount.tests import create_oauth2_tests from allauth.tests import MockedResponse, mocked_response from .provider import ShopifyProvider class ShopifyTests(create_oauth2_tests(registry.by_id(ShopifyProvider.id))): def _complete_shopify_login(self, q, resp, resp_mock, with_refresh_token): complete_url = reverse(self.provider.id + "_callback") self.assertGreater(q["redirect_uri"][0].find(complete_url), 0) response_json = self.get_login_response_json( with_refresh_token=with_refresh_token ) with mocked_response( MockedResponse(200, response_json, {"content-type": "application/json"}), resp_mock, ): resp = self.client.get( complete_url, { "code": "test", "state": q["state"][0], "shop": "test", }, ) return resp def login(self, resp_mock, process="login", with_refresh_token=True): url = ( reverse(self.provider.id + "_login") + "?" + urlencode({"process": process, "shop": "test"}) ) resp = self.client.post(url) self.assertEqual(resp.status_code, 302) p = urlparse(resp["location"]) q = parse_qs(p.query) resp = self._complete_shopify_login(q, resp, resp_mock, with_refresh_token) return resp def get_mocked_response(self): return MockedResponse( 200, """ { "shop": { "id": "1234566", "name": "Test Shop", "email": "email@example.com" } } """, ) @override_settings(SOCIALACCOUNT_PROVIDERS={"shopify": {"IS_EMBEDDED": True}}) class ShopifyEmbeddedTests(ShopifyTests): """ Shopify embedded apps (that run within an iFrame) require a JS (not server) redirect for starting the oauth2 process. See Also: https://help.shopify.com/api/sdks/embedded-app-sdk/getting-started#oauth """ def login(self, resp_mock, process="login", with_refresh_token=True): resp = self.client.post( reverse(self.provider.id + "_login") + "?" + urlencode({"process": process, "shop": "test"}), ) self.assertEqual(resp.status_code, 200) # No re-direct, JS must do it actual_content = resp.content.decode("utf8") self.assertTrue( "script" in actual_content, "Content missing script tag. [Actual: {}]".format(actual_content), ) self.assertTrue( resp.xframe_options_exempt, "Redirect JS must be allowed to run in Shopify iframe", ) self.assertTrue( "" in actual_content and "" in actual_content, "Expected standard HTML skeleton. [Actual: {}]".format(actual_content), ) p = urlparse( actual_content.split(";")[0].split('location.href = "')[1] ) q = parse_qs(p.query) resp = self._complete_shopify_login(q, resp, resp_mock, with_refresh_token) return resp @override_settings( SOCIALACCOUNT_PROVIDERS={ "shopify": {"AUTH_PARAMS": {"grant_options[]": "per-user"}} } ) class ShopifyPerUserAccessTests(ShopifyTests): """ Shopify has two access modes, offline (the default) and online/per-user. Enabling 'online' access should cause all-auth to tie the logged in Shopify user to the all-auth account (rather than the shop as a whole). See Also: https://help.shopify.com/api/getting-started/authentication/ oauth#api-access-modes """ def get_login_response_json(self, with_refresh_token=True): response_data = { "access_token": "testac", "scope": "write_orders,read_customers", "expires_in": 86399, "associated_user_scope": "write_orders", "associated_user": { "id": 902541635, "first_name": "Jon", "last_name": "Smith", "email": "jon@example.com", "account_owner": True, }, } if with_refresh_token: response_data["refresh_token"] = "testrf" return json.dumps(response_data) @override_settings( SOCIALACCOUNT_AUTO_SIGNUP=True, SOCIALACCOUNT_EMAIL_REQUIRED=True, ACCOUNT_EMAIL_REQUIRED=True, ) def test_associated_user(self): resp_mocks = self.get_mocked_response() resp = self.login(resp_mocks) self.assertRedirects(resp, "/accounts/profile/", fetch_redirect_response=False) social_account = SocialAccount.objects.filter( provider=self.provider.id, uid=902541635, ).first() self.assertIsNotNone(social_account) self.assertTrue("associated_user" in social_account.extra_data) self.assertEqual(social_account.user.email, "jon@example.com") self.assertEqual(social_account.user.first_name, "Jon") self.assertEqual(social_account.user.last_name, "Smith") django-allauth-0.47.0/allauth/socialaccount/providers/shopify/urls.py000066400000000000000000000002501415442050100260030ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import ShopifyProvider urlpatterns = default_urlpatterns(ShopifyProvider) django-allauth-0.47.0/allauth/socialaccount/providers/shopify/views.py000066400000000000000000000067611415442050100261700ustar00rootroot00000000000000import re import requests from django.conf import settings from django.http import HttpResponse, HttpResponseBadRequest from allauth.exceptions import ImmediateHttpResponse from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import ShopifyProvider class ShopifyOAuth2Adapter(OAuth2Adapter): provider_id = ShopifyProvider.id supports_state = False scope_delimiter = "," def _shop_domain(self): shop = self.request.GET.get("shop", "") if "." not in shop: shop = "{}.myshopify.com".format(shop) # Ensure the provided hostname parameter is a valid hostname, # ends with myshopify.com, and does not contain characters # other than letters (a-z), numbers (0-9), dots, and hyphens. if not re.match(r"^[a-z0-9-]+\.myshopify\.com$", shop): raise ImmediateHttpResponse( HttpResponseBadRequest("Invalid `shop` parameter") ) return shop def _shop_url(self, path): shop = self._shop_domain() return "https://{}{}".format(shop, path) @property def access_token_url(self): return self._shop_url("/admin/oauth/access_token") @property def authorize_url(self): return self._shop_url("/admin/oauth/authorize") @property def profile_url(self): return self._shop_url("/admin/shop.json") def complete_login(self, request, app, token, **kwargs): headers = {"X-Shopify-Access-Token": "{token}".format(token=token.token)} response = requests.get(self.profile_url, headers=headers) extra_data = response.json() associated_user = kwargs["response"].get("associated_user") if associated_user: extra_data["associated_user"] = associated_user return self.get_provider().sociallogin_from_response(request, extra_data) class ShopifyOAuth2LoginView(OAuth2LoginView): def dispatch(self, request, *args, **kwargs): is_embedded = ( getattr(settings, "SOCIALACCOUNT_PROVIDERS", {}) .get("shopify", {}) .get("IS_EMBEDDED", False) ) if is_embedded: # TODO: This bypasses LOGIN_ON_GET, but: # # The Embedded App SDK (EASDK) and backwards compatibility layer # are being removed from Shopify on January 1, 2022. # # So this needs to be dropped/revisitted anyway. response = super().login(request, *args, **kwargs) """ Shopify embedded apps (that run within an iFrame) require a JS (not server) redirect for starting the oauth2 process. See Also: https://help.shopify.com/api/sdks/embedded-app-sdk/getting-started#oauth """ js = "".join( ( "" '", ) ) response = HttpResponse(content=js) # Because this view will be within shopify's iframe response.xframe_options_exempt = True return response return super().dispatch(request, *args, **kwargs) oauth2_login = ShopifyOAuth2LoginView.adapter_view(ShopifyOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(ShopifyOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/slack/000077500000000000000000000000001415442050100240635ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/slack/__init__.py000066400000000000000000000000001415442050100261620ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/slack/models.py000066400000000000000000000000001415442050100257060ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/slack/provider.py000066400000000000000000000017361415442050100262760ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class SlackAccount(ProviderAccount): def get_avatar_url(self): return self.account.extra_data.get("user").get("image_192", None) def to_str(self): dflt = super(SlackAccount, self).to_str() return "%s (%s)" % ( self.account.extra_data.get("name", ""), dflt, ) class SlackProvider(OAuth2Provider): id = "slack" name = "Slack" account_class = SlackAccount def extract_uid(self, data): return "%s_%s" % ( str(data.get("team").get("id")), str(data.get("user").get("id")), ) def extract_common_fields(self, data): user = data.get("user", {}) return {"name": user.get("name"), "email": user.get("email", None)} def get_default_scope(self): return ["identify"] provider_classes = [SlackProvider] django-allauth-0.47.0/allauth/socialaccount/providers/slack/tests.py000066400000000000000000000011271415442050100256000ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import SlackProvider class SlackOAuth2Tests(OAuth2TestsMixin, TestCase): provider_id = SlackProvider.id def get_mocked_response(self): return MockedResponse( 200, """{ "ok": true, "url": "https:\\/\\/myteam.slack.com\\/", "team": {"name": "My Team", "id": "U0G9QF9C6"}, "user": {"id": "T0G9PQBBK"}, "team_id": "T12345", "user_id": "U12345" }""", ) # noqa django-allauth-0.47.0/allauth/socialaccount/providers/slack/urls.py000066400000000000000000000002441415442050100254220ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import SlackProvider urlpatterns = default_urlpatterns(SlackProvider) django-allauth-0.47.0/allauth/socialaccount/providers/slack/views.py000066400000000000000000000021351415442050100255730ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.client import OAuth2Error from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import SlackProvider class SlackOAuth2Adapter(OAuth2Adapter): provider_id = SlackProvider.id access_token_url = "https://slack.com/api/oauth.access" authorize_url = "https://slack.com/oauth/authorize" identity_url = "https://slack.com/api/users.identity" def complete_login(self, request, app, token, **kwargs): extra_data = self.get_data(token.token) return self.get_provider().sociallogin_from_response(request, extra_data) def get_data(self, token): # Verify the user first hed = {"Authorization": "Bearer " + token} resp = requests.get(self.identity_url, headers=hed) resp = resp.json() if not resp.get("ok"): raise OAuth2Error() return resp oauth2_login = OAuth2LoginView.adapter_view(SlackOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(SlackOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/soundcloud/000077500000000000000000000000001415442050100251455ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/soundcloud/__init__.py000066400000000000000000000000001415442050100272440ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/soundcloud/provider.py000066400000000000000000000020141415442050100273460ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class SoundCloudAccount(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("permalink_url") def get_avatar_url(self): return self.account.extra_data.get("avatar_url") def to_str(self): dflt = super(SoundCloudAccount, self).to_str() full_name = self.account.extra_data.get("full_name") username = self.account.extra_data.get("username") return full_name or username or dflt class SoundCloudProvider(OAuth2Provider): id = "soundcloud" name = "SoundCloud" account_class = SoundCloudAccount def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): return dict( name=data.get("full_name"), username=data.get("username"), email=data.get("email"), ) provider_classes = [SoundCloudProvider] django-allauth-0.47.0/allauth/socialaccount/providers/soundcloud/tests.py000066400000000000000000000025121415442050100266610ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import SoundCloudProvider class SoundCloudTests(OAuth2TestsMixin, TestCase): provider_id = SoundCloudProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "website": null, "myspace_name": null, "public_favorites_count": 0, "followings_count": 1, "full_name": "", "id": 22341947, "city": null, "track_count": 0, "playlist_count": 0, "discogs_name": null, "private_tracks_count": 0, "followers_count": 0, "online": true, "username": "user187631676", "description": null, "kind": "user", "website_title": null, "primary_email_confirmed": false, "permalink_url": "http://soundcloud.com/user187631676", "private_playlists_count": 0, "permalink": "user187631676", "country": null, "uri": "https://api.soundcloud.com/users/22341947", "avatar_url": "https://a1.sndcdn.com/images/default_avatar_large.png?4b4189b", "plan": "Free" }""", ) django-allauth-0.47.0/allauth/socialaccount/providers/soundcloud/urls.py000066400000000000000000000002561415442050100265070ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import SoundCloudProvider urlpatterns = default_urlpatterns(SoundCloudProvider) django-allauth-0.47.0/allauth/socialaccount/providers/soundcloud/views.py000066400000000000000000000015231415442050100266550ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import SoundCloudProvider class SoundCloudOAuth2Adapter(OAuth2Adapter): provider_id = SoundCloudProvider.id access_token_url = "https://api.soundcloud.com/oauth2/token" authorize_url = "https://soundcloud.com/connect" profile_url = "https://api.soundcloud.com/me.json" def complete_login(self, request, app, token, **kwargs): resp = requests.get(self.profile_url, params={"oauth_token": token.token}) extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(SoundCloudOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(SoundCloudOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/spotify/000077500000000000000000000000001415442050100244635ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/spotify/__init__.py000066400000000000000000000000001415442050100265620ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/spotify/provider.py000066400000000000000000000021661415442050100266740ustar00rootroot00000000000000from allauth.socialaccount import app_settings from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class SpotifyAccount(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("external_urls").get("spotify") def get_avatar_url(self): try: return self.account.extra_data.get("images")[0].get("url") except IndexError: return None def to_str(self): dflt = super(SpotifyAccount, self).to_str() return self.account.extra_data.get("display_name", dflt) class SpotifyOAuth2Provider(OAuth2Provider): id = "spotify" name = "Spotify" account_class = SpotifyAccount def extract_uid(self, data): return data["id"] def extract_common_fields(self, data): return dict(name=data.get("display_name"), email=data.get("email")) def get_default_scope(self): scope = [] if app_settings.QUERY_EMAIL: scope.append("user-read-email") return scope provider_classes = [SpotifyOAuth2Provider] django-allauth-0.47.0/allauth/socialaccount/providers/spotify/tests.py000066400000000000000000000023321415442050100261770ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import SpotifyOAuth2Provider class SpotifyOAuth2Tests(OAuth2TestsMixin, TestCase): provider_id = SpotifyOAuth2Provider.id def get_mocked_response(self): return MockedResponse( 200, """{ "birthdate": "1937-06-01", "country": "SE", "display_name": "JM Wizzler", "email": "email@example.com", "external_urls": { "spotify": "https://open.spotify.com/user/wizzler" }, "followers" : { "href" : null, "total" : 3829 }, "href": "https://api.spotify.com/v1/users/wizzler", "id": "wizzler", "images": [ { "height": null, "url": "https://fbcdn-profile-a.akamaihd.net/hprofile-ak-frc3/t1.0-1/1970403_10152215092574354_1798272330_n.jpg", "width": null } ], "product": "premium", "type": "user", "uri": "spotify:user:wizzler" }""", ) # noqa django-allauth-0.47.0/allauth/socialaccount/providers/spotify/urls.py000066400000000000000000000002631415442050100260230ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth.urls import default_urlpatterns from .provider import SpotifyOAuth2Provider urlpatterns = default_urlpatterns(SpotifyOAuth2Provider) django-allauth-0.47.0/allauth/socialaccount/providers/spotify/views.py000066400000000000000000000015241415442050100261740ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import SpotifyOAuth2Provider class SpotifyOAuth2Adapter(OAuth2Adapter): provider_id = SpotifyOAuth2Provider.id access_token_url = "https://accounts.spotify.com/api/token" authorize_url = "https://accounts.spotify.com/authorize" profile_url = "https://api.spotify.com/v1/me" def complete_login(self, request, app, token, **kwargs): extra_data = requests.get( self.profile_url, params={"access_token": token.token} ) return self.get_provider().sociallogin_from_response(request, extra_data.json()) oauth_login = OAuth2LoginView.adapter_view(SpotifyOAuth2Adapter) oauth_callback = OAuth2CallbackView.adapter_view(SpotifyOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/stackexchange/000077500000000000000000000000001415442050100255765ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/stackexchange/__init__.py000066400000000000000000000000001415442050100276750ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/stackexchange/provider.py000066400000000000000000000021641415442050100300050ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class StackExchangeAccount(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("html_url") def get_avatar_url(self): return self.account.extra_data.get("avatar_url") def to_str(self): dflt = super(StackExchangeAccount, self).to_str() return self.account.extra_data.get("name", dflt) class StackExchangeProvider(OAuth2Provider): id = "stackexchange" name = "Stack Exchange" account_class = StackExchangeAccount def get_site(self): settings = self.get_settings() return settings.get("SITE", "stackoverflow") def extract_uid(self, data): # `user_id` varies if you use the same account for # e.g. StackOverflow and ServerFault. Therefore, we pick # `account_id`. uid = str(data["account_id"]) return uid def extract_common_fields(self, data): return dict(username=data.get("display_name")) provider_classes = [StackExchangeProvider] django-allauth-0.47.0/allauth/socialaccount/providers/stackexchange/tests.py000066400000000000000000000030061415442050100273110ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import StackExchangeProvider class StackExchangeTests(OAuth2TestsMixin, TestCase): provider_id = StackExchangeProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "has_more": false, "items": [ { "is_employee": false, "last_access_date": 1356200390, "display_name": "pennersr", "account_id": 291652, "badge_counts": { "bronze": 2, "silver": 2, "gold": 0 }, "last_modified_date": 1356199552, "profile_image": "http://www.gravatar.com/avatar/053d648486d567d3143d6bad8df8cfeb?d=identicon&r=PG", "user_type": "registered", "creation_date": 1296223711, "reputation_change_quarter": 148, "reputation_change_year": 378, "reputation": 504, "link": "http://stackoverflow.com/users/593944/pennersr", "reputation_change_week": 0, "user_id": 593944, "reputation_change_month": 10, "reputation_change_day": 0 } ], "quota_max": 10000, "quota_remaining": 9999 }""", ) # noqa django-allauth-0.47.0/allauth/socialaccount/providers/stackexchange/urls.py000066400000000000000000000002641415442050100271370ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import StackExchangeProvider urlpatterns = default_urlpatterns(StackExchangeProvider) django-allauth-0.47.0/allauth/socialaccount/providers/stackexchange/views.py000066400000000000000000000020421415442050100273030ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import StackExchangeProvider class StackExchangeOAuth2Adapter(OAuth2Adapter): provider_id = StackExchangeProvider.id access_token_url = "https://stackexchange.com/oauth/access_token" authorize_url = "https://stackexchange.com/oauth" profile_url = "https://api.stackexchange.com/2.1/me" def complete_login(self, request, app, token, **kwargs): provider = self.get_provider() site = provider.get_site() resp = requests.get( self.profile_url, params={"access_token": token.token, "key": app.key, "site": site}, ) resp.raise_for_status() extra_data = resp.json()["items"][0] return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(StackExchangeOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(StackExchangeOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/steam/000077500000000000000000000000001415442050100240775ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/steam/__init__.py000066400000000000000000000000001415442050100261760ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/steam/models.py000066400000000000000000000000001415442050100257220ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/steam/provider.py000066400000000000000000000050421415442050100263040ustar00rootroot00000000000000import requests from django.urls import reverse from django.utils.http import urlencode from allauth.socialaccount.providers.openid.provider import ( OpenIDAccount, OpenIDProvider, ) class SteamAccount(OpenIDAccount): def to_str(self): dflt = super(SteamAccount, self).to_str() return self.account.extra_data.get("personaname", dflt) def get_profile_url(self): return self.account.extra_data.get("profileurl") def get_avatar_url(self): return ( self.account.extra_data.get("avatarfull") or self.account.extra_data.get("avatarmedium") or self.account.extra_data.get("avatar") ) def extract_steam_id(url): return url.lstrip("https://steamcommunity.com/openid/id/") def request_steam_account_summary(api_key, steam_id): api_base = "https://api.steampowered.com/" method = "ISteamUser/GetPlayerSummaries/v0002/" params = {"key": api_key, "steamids": steam_id} resp = requests.get(api_base + method, params) resp.raise_for_status() data = resp.json() playerlist = data.get("response", {}).get("players", []) return playerlist[0] if playerlist else {"steamid": steam_id} class SteamOpenIDProvider(OpenIDProvider): id = "steam" name = "Steam" account_class = SteamAccount def get_login_url(self, request, **kwargs): url = reverse("steam_login") if kwargs: url += "?" + urlencode(kwargs) return url def sociallogin_from_response(self, request, response): steam_id = extract_steam_id(response.identity_url) steam_api_key = self.get_app(request).secret response._extra = request_steam_account_summary(steam_api_key, steam_id) return super(SteamOpenIDProvider, self).sociallogin_from_response( request, response ) def extract_uid(self, response): return response._extra["steamid"] def extract_extra_data(self, response): return response._extra.copy() def extract_common_fields(self, response): full_name = response._extra.get("realname", "").strip() if full_name.count(" ") == 1: first_name, last_name = full_name.split() else: first_name, last_name = full_name, "" username = response._extra.get("personaname", "") return { "username": username or response._extra["steamid"], "first_name": first_name, "last_name": last_name, "full_name": full_name, } provider_classes = [SteamOpenIDProvider] django-allauth-0.47.0/allauth/socialaccount/providers/steam/urls.py000066400000000000000000000003211415442050100254320ustar00rootroot00000000000000from django.urls import path from . import views urlpatterns = [ path("steam/login/", views.steam_login, name="steam_login"), path("steam/callback/", views.steam_callback, name="steam_callback"), ] django-allauth-0.47.0/allauth/socialaccount/providers/steam/views.py000066400000000000000000000020751415442050100256120ustar00rootroot00000000000000""" OpenID Adapter for Steam The Steam login API is simple OpenID but requires extra API calls for basic resources such as usernames. Resources: * Steam Web API Documentation https://steamcommunity.com/dev * Steam Partner API documentation https://partner.steamgames.com/doc/features/auth#website """ from django.urls import reverse from allauth.socialaccount.providers.openid.views import ( OpenIDCallbackView, OpenIDLoginView, ) from .provider import SteamOpenIDProvider STEAM_OPENID_URL = "https://steamcommunity.com/openid" class SteamOpenIDLoginView(OpenIDLoginView): provider = SteamOpenIDProvider def get_form(self): items = dict(list(self.request.GET.items()) + list(self.request.POST.items())) items["openid"] = STEAM_OPENID_URL return self.form_class(items) def get_callback_url(self): return reverse(steam_callback) class SteamOpenIDCallbackView(OpenIDCallbackView): provider = SteamOpenIDProvider steam_login = SteamOpenIDLoginView.as_view() steam_callback = SteamOpenIDCallbackView.as_view() django-allauth-0.47.0/allauth/socialaccount/providers/stocktwits/000077500000000000000000000000001415442050100252045ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/stocktwits/__init__.py000066400000000000000000000000001415442050100273030ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/stocktwits/provider.py000066400000000000000000000014671415442050100274200ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class StocktwitsAccount(ProviderAccount): def get_avatar_url(self): return self.account.extra_data.get("user", {}).get("avatar_url_ssl") def to_str(self): dflt = super(StocktwitsAccount, self).to_str() return self.account.extra_data.get("user", {}).get("name", dflt) class StocktwitsProvider(OAuth2Provider): id = "stocktwits" name = "Stocktwits" account_class = StocktwitsAccount def extract_uid(self, data): return data.get("user", {}).get("id") def extract_common_fields(self, data): return dict( full_name=data.get("user", {}).get("name"), ) provider_classes = [StocktwitsProvider] django-allauth-0.47.0/allauth/socialaccount/providers/stocktwits/tests.py000066400000000000000000000013451415442050100267230ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import StocktwitsProvider class StocktwitsTests(OAuth2TestsMixin, TestCase): provider_id = StocktwitsProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "response": { "status": 200 }, "user": { "id": 3, "username": "zerobeta", "name": "Justin Paterno", "avatar_url": "http://avatars.stocktwits.com/images/default_avatar_thumb.jpg", "avatar_url_ssl": "https://s3.amazonaws.com/st-avatars/images/default_avatar_thumb.jpg", "identity": "Official", "classification": [ "ir" ] } } """, ) # noqa django-allauth-0.47.0/allauth/socialaccount/providers/stocktwits/urls.py000066400000000000000000000002561415442050100265460ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import StocktwitsProvider urlpatterns = default_urlpatterns(StocktwitsProvider) django-allauth-0.47.0/allauth/socialaccount/providers/stocktwits/views.py000066400000000000000000000017431415442050100267200ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import StocktwitsProvider class StocktwitsOAuth2Adapter(OAuth2Adapter): provider_id = StocktwitsProvider.id access_token_url = "https://api.stocktwits.com/api/2/oauth/token" authorize_url = "https://api.stocktwits.com/api/2/oauth/authorize" profile_url = "https://api.stocktwits.com/api/2/streams/user/{user}.json" scope_delimiter = "," def complete_login(self, request, app, token, **kwargs): user_id = kwargs.get("response").get("user_id") resp = requests.get(self.profile_url.format(user=user_id)) resp.raise_for_status() extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(StocktwitsOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(StocktwitsOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/strava/000077500000000000000000000000001415442050100242665ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/strava/__init__.py000066400000000000000000000000001415442050100263650ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/strava/provider.py000066400000000000000000000027231415442050100264760ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class StravaAccount(ProviderAccount): def get_profile_url(self): id = self.account.extra_data.get("id") if id: return "https://www.strava.com/athletes/{}".format(id) return None def get_avatar_url(self): avatar = self.account.extra_data.get("profile") if avatar and avatar != "avatar/athlete/large.png": return avatar return None def to_str(self): name = super(StravaAccount, self).to_str() return self.account.extra_data.get("name", name) class StravaProvider(OAuth2Provider): id = "strava" name = "Strava" account_class = StravaAccount def extract_uid(self, data): return data.get("id") def extract_common_fields(self, data): extra_common = super(StravaProvider, self).extract_common_fields(data) firstname = data.get("firstname") lastname = data.get("lastname") name = " ".join(part for part in (firstname, lastname) if part) extra_common.update( username=data.get("username"), email=data.get("email"), first_name=firstname, last_name=lastname, name=name.strip(), ) return extra_common def get_default_scope(self): return ["read,activity:read"] provider_classes = [StravaProvider] django-allauth-0.47.0/allauth/socialaccount/providers/strava/tests.py000066400000000000000000000065531415442050100260130ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals from django.contrib.auth.models import User from allauth.socialaccount.models import SocialAccount from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import StravaProvider class StravaTests(OAuth2TestsMixin, TestCase): provider_id = StravaProvider.id def get_mocked_response(self): return MockedResponse( 200, """{ "id": 32641234, "username": null, "resource_state": 2, "firstname": "georges", "lastname": "camembert", "city": "London", "state": "England", "country": "United Kingdom", "sex": "M", "premium": false, "summit": false, "created_at": "2017-07-12T12:42:52Z", "updated_at": "2017-10-21T11:01:23Z", "badge_type_id": 0, "profile_medium": "avatar/athlete/medium.png", "profile": "avatar/athlete/large.png", "friend": null, "follower": null, "email": "bill@example.com" }""", ) # noqa def get_mocked_response_avatar_invalid_id(self): """Profile including realistic avatar URL user ID set to 0 to test edge case where id would be missing""" return MockedResponse( 200, """{ "id": 0, "username": null, "resource_state": 2, "firstname": "georges", "lastname": "camembert", "city": "London", "state": "England", "country": "United Kingdom", "sex": "M", "premium": false, "summit": false, "created_at": "2017-07-12T12:42:52Z", "updated_at": "2017-10-21T11:01:23Z", "badge_type_id": 0, "profile_medium": "https://cloudfront.net/1/medium.jpg", "profile": "https://cloudfront.net/1/large.jpg", "friend": null, "follower": null, "email": "bill@example.com" }""", ) # noqa def test_valid_avatar(self): """test response with Avatar URL""" self.login(self.get_mocked_response_avatar_invalid_id()) user = User.objects.get(email="bill@example.com") soc_acc = SocialAccount.objects.filter( user=user, provider=self.provider.id ).get() provider_account = soc_acc.get_provider_account() self.assertEqual( provider_account.get_avatar_url(), "https://cloudfront.net/1/large.jpg", ) self.assertIsNone(provider_account.get_profile_url()) def get_login_response_json(self, with_refresh_token=True): rt = "" if with_refresh_token: rt = ',"refresh_token": "testrf"' return ( """{ "uid":"weibo", "access_token":"testac", "livemode": false, "token_type": "bearer", "strava_publishable_key": "pk_test_someteskey", "strava_user_id": "acct_sometestid", "scope": "read_write" %s }""" % rt ) django-allauth-0.47.0/allauth/socialaccount/providers/strava/urls.py000066400000000000000000000002461415442050100256270ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import StravaProvider urlpatterns = default_urlpatterns(StravaProvider) django-allauth-0.47.0/allauth/socialaccount/providers/strava/views.py000066400000000000000000000015671415442050100260060ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import StravaProvider class StravaOauth2Adapter(OAuth2Adapter): provider_id = StravaProvider.id access_token_url = "https://www.strava.com/oauth/token" authorize_url = "https://www.strava.com/oauth/authorize" profile_url = "https://www.strava.com/api/v3/athlete" def complete_login(self, request, app, token, **kwargs): headers = {"Authorization": "Bearer {0}".format(token.token)} resp = requests.get(self.profile_url, headers=headers) extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(StravaOauth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(StravaOauth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/stripe/000077500000000000000000000000001415442050100242745ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/stripe/__init__.py000066400000000000000000000000001415442050100263730ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/stripe/provider.py000066400000000000000000000013161415442050100265010ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class StripeAccount(ProviderAccount): def to_str(self): default = super(StripeAccount, self).to_str() return self.account.extra_data.get("business_name", default) class StripeProvider(OAuth2Provider): id = "stripe" name = "Stripe" account_class = StripeAccount def extract_uid(self, data): return data["id"] def extract_common_fields(self, data): return dict(name=data.get("display_name"), email=data.get("email")) def get_default_scope(self): return ["read_only"] provider_classes = [StripeProvider] django-allauth-0.47.0/allauth/socialaccount/providers/stripe/tests.py000066400000000000000000000031531415442050100260120ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import StripeProvider class StripeTests(OAuth2TestsMixin, TestCase): provider_id = StripeProvider.id def get_mocked_response(self): return MockedResponse( 200, """{ "id": "acct_sometestid", "object": "account", "business_logo": null, "business_name": null, "business_url": "example.com", "charges_enabled": true, "country": "SE", "currencies_supported": [ "usd", "eur", "sek" ], "default_currency": "eur", "details_submitted": true, "display_name": "Test", "email": "test@example.com", "managed": false, "metadata": {}, "statement_descriptor": "TEST.COM", "support_phone": "+460123456789", "timezone": "Europe/Stockholm", "transfers_enabled": true }""", ) def get_login_response_json(self, with_refresh_token=True): rt = "" if with_refresh_token: rt = ',"refresh_token": "testrf"' return ( """{ "uid":"weibo", "access_token":"testac", "livemode": false, "token_type": "bearer", "stripe_publishable_key": "pk_test_someteskey", "stripe_user_id": "acct_sometestid", "scope": "read_write" %s }""" % rt ) django-allauth-0.47.0/allauth/socialaccount/providers/stripe/urls.py000066400000000000000000000002461415442050100256350ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import StripeProvider urlpatterns = default_urlpatterns(StripeProvider) django-allauth-0.47.0/allauth/socialaccount/providers/stripe/views.py000066400000000000000000000017001415442050100260010ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import StripeProvider class StripeOAuth2Adapter(OAuth2Adapter): provider_id = StripeProvider.id access_token_url = "https://connect.stripe.com/oauth/token" authorize_url = "https://connect.stripe.com/oauth/authorize" profile_url = "https://api.stripe.com/v1/accounts/%s" def complete_login(self, request, app, token, response, **kwargs): headers = {"Authorization": "Bearer {0}".format(token.token)} resp = requests.get( self.profile_url % response.get("stripe_user_id"), headers=headers ) extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(StripeOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(StripeOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/telegram/000077500000000000000000000000001415442050100245665ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/telegram/__init__.py000066400000000000000000000000001415442050100266650ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/telegram/provider.py000066400000000000000000000014521415442050100267740ustar00rootroot00000000000000from allauth.socialaccount.providers.base import Provider, ProviderAccount class TelegramAccount(ProviderAccount): pass class TelegramProvider(Provider): id = "telegram" name = "Telegram" account_class = TelegramAccount def get_login_url(self, request, **kwargs): # TODO: Find a way to better wrap the iframed button return "#" def extract_uid(self, data): return data["id"] def extract_common_fields(self, data): ret = {} if data.get("first_name"): ret["first_name"] = data.get("first_name") if data.get("last_name"): ret["last_name"] = data.get("last_name") if data.get("username"): ret["username"] = data.get("username") return ret provider_classes = [TelegramProvider] django-allauth-0.47.0/allauth/socialaccount/providers/telegram/urls.py000066400000000000000000000002111415442050100261170ustar00rootroot00000000000000from django.urls import path from . import views urlpatterns = [path("telegram/login/", views.telegram_login, name="telegram_login")] django-allauth-0.47.0/allauth/socialaccount/providers/telegram/views.py000066400000000000000000000017741415442050100263060ustar00rootroot00000000000000import hashlib import hmac import time from allauth.socialaccount import providers from allauth.socialaccount.helpers import ( complete_social_login, render_authentication_error, ) from .provider import TelegramProvider def telegram_login(request): provider = providers.registry.by_id(TelegramProvider.id, request) data = dict(request.GET.items()) hash = data.pop("hash") payload = "\n".join(sorted(["{}={}".format(k, v) for k, v in data.items()])) token = provider.get_settings()["TOKEN"] token_sha256 = hashlib.sha256(token.encode()).digest() expected_hash = hmac.new(token_sha256, payload.encode(), hashlib.sha256).hexdigest() auth_date = int(data.pop("auth_date")) if hash != expected_hash or time.time() - auth_date > 30: return render_authentication_error( request, provider_id=provider.id, extra_context={"response": data} ) login = provider.sociallogin_from_response(request, data) return complete_social_login(request, login) django-allauth-0.47.0/allauth/socialaccount/providers/trainingpeaks/000077500000000000000000000000001415442050100256255ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/trainingpeaks/__init__.py000066400000000000000000000000001415442050100277240ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/trainingpeaks/provider.py000066400000000000000000000031041415442050100300270ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class TrainingPeaksAccount(ProviderAccount): def get_profile_url(self): return "https://app.trainingpeaks.com" def get_avatar_url(self): return None def to_str(self): name = ( self.account.extra_data.get("FirstName") + " " + self.account.extra_data.get("LastName") ) if name != " ": return name return super(TrainingPeaksAccount, self).to_str() class TrainingPeaksProvider(OAuth2Provider): id = "trainingpeaks" name = "TrainingPeaks" account_class = TrainingPeaksAccount def extract_uid(self, data): return data.get("Id") def extract_common_fields(self, data): extra_common = super(TrainingPeaksProvider, self).extract_common_fields(data) firstname = data.get("FirstName") lastname = data.get("LastName") # fallback username as there is actually no Username in response username = firstname.strip().lower() + "." + lastname.strip().lower() name = " ".join(part for part in (firstname, lastname) if part) extra_common.update( username=data.get("username", username), email=data.get("Email"), first_name=firstname, last_name=lastname, name=name.strip(), ) return extra_common def get_default_scope(self): return ["athlete:profile"] provider_classes = [TrainingPeaksProvider] django-allauth-0.47.0/allauth/socialaccount/providers/trainingpeaks/tests.py000066400000000000000000000053221415442050100273430ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ Run just this suite: python manage.py test allauth.socialaccount.providers.trainingpeaks.tests.TrainingPeaksTests """ from __future__ import unicode_literals from collections import namedtuple from django.test.utils import override_settings from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import TrainingPeaksProvider from .views import TrainingPeaksOAuth2Adapter class TrainingPeaksTests(OAuth2TestsMixin, TestCase): provider_id = TrainingPeaksProvider.id def get_mocked_response(self): return MockedResponse( 200, """{ "Id": 123456, "FirstName": "John", "LastName": "Doe", "Email": "user@example.com", "DateOfBirth": "1986-02-01T00:00:00", "CoachedBy": 987654, "Weight": 87.5223617553711 }""", ) # noqa def get_login_response_json(self, with_refresh_token=True): rtoken = "" if with_refresh_token: rtoken = ',"refresh_token": "testrf"' return ( """{ "access_token" : "testac", "token_type" : "bearer", "expires_in" : 600, "scope": "scopes granted" %s }""" % rtoken ) def test_default_use_sandbox_uri(self): adapter = TrainingPeaksOAuth2Adapter(None) self.assertTrue(".sandbox." in adapter.authorize_url) self.assertTrue(".sandbox." in adapter.access_token_url) self.assertTrue(".sandbox." in adapter.profile_url) @override_settings( SOCIALACCOUNT_PROVIDERS={"trainingpeaks": {"USE_PRODUCTION": True}} ) def test_use_production_uri(self): adapter = TrainingPeaksOAuth2Adapter(None) self.assertFalse(".sandbox." in adapter.authorize_url) self.assertFalse(".sandbox." in adapter.access_token_url) self.assertFalse(".sandbox." in adapter.profile_url) def test_scope_from_default(self): Request = namedtuple("request", ["GET"]) mock_request = Request(GET={}) scope = self.provider.get_scope(mock_request) self.assertTrue("athlete:profile" in scope) @override_settings( SOCIALACCOUNT_PROVIDERS={ "trainingpeaks": {"SCOPE": ["athlete:profile", "workouts", "workouts:wod"]} } ) def test_scope_from_settings(self): Request = namedtuple("request", ["GET"]) mock_request = Request(GET={}) scope = self.provider.get_scope(mock_request) for item in ("athlete:profile", "workouts", "workouts:wod"): self.assertTrue(item in scope) django-allauth-0.47.0/allauth/socialaccount/providers/trainingpeaks/urls.py000066400000000000000000000002641415442050100271660ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import TrainingPeaksProvider urlpatterns = default_urlpatterns(TrainingPeaksProvider) django-allauth-0.47.0/allauth/socialaccount/providers/trainingpeaks/views.py000066400000000000000000000035041415442050100273360ustar00rootroot00000000000000import requests from allauth.socialaccount import app_settings from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import TrainingPeaksProvider class TrainingPeaksOAuth2Adapter(OAuth2Adapter): # https://github.com/TrainingPeaks/PartnersAPI/wiki/OAuth provider_id = TrainingPeaksProvider.id def get_settings(self): """Provider settings""" return app_settings.PROVIDERS.get(self.provider_id, {}) def get_hostname(self): """Return hostname depending on sandbox seting""" settings = self.get_settings() if settings.get("USE_PRODUCTION"): return "trainingpeaks.com" return "sandbox.trainingpeaks.com" @property def access_token_url(self): return "https://oauth." + self.get_hostname() + "/oauth/token" @property def authorize_url(self): return "https://oauth." + self.get_hostname() + "/OAuth/Authorize" @property def profile_url(self): return "https://api." + self.get_hostname() + "/v1/athlete/profile" @property def api_hostname(self): """Return https://api.hostname.tld""" return "https://api." + self.get_hostname() # https://oauth.sandbox.trainingpeaks.com/oauth/deauthorize scope_delimiter = " " def complete_login(self, request, app, token, **kwargs): headers = {"Authorization": "Bearer {0}".format(token.token)} response = requests.get(self.profile_url, headers=headers) response.raise_for_status() extra_data = response.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(TrainingPeaksOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(TrainingPeaksOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/trello/000077500000000000000000000000001415442050100242675ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/trello/__init__.py000066400000000000000000000000001415442050100263660ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/trello/provider.py000066400000000000000000000022211415442050100264700ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth.provider import OAuthProvider class TrelloAccount(ProviderAccount): def get_profile_url(self): return None def get_avatar_url(self): return None class TrelloProvider(OAuthProvider): id = "trello" name = "Trello" account_class = TrelloAccount def get_default_scope(self): return ["read"] def extract_uid(self, data): return data["id"] def extract_common_fields(self, data): return dict( email=data.get("email"), username=data.get("username"), name=data.get("name"), ) def get_auth_params(self, request, action): data = super(TrelloProvider, self).get_auth_params(request, action) app = self.get_app(request) data["type"] = "web_server" data["name"] = app.name data["scope"] = self.get_scope(request) # define here for how long it will be, this can be configured on the # social app data["expiration"] = "never" return data provider_classes = [TrelloProvider] django-allauth-0.47.0/allauth/socialaccount/providers/trello/tests.py000066400000000000000000000004261415442050100260050ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals from allauth.socialaccount.tests import OAuthTestsMixin from allauth.tests import TestCase from .provider import TrelloProvider class TrelloTests(OAuthTestsMixin, TestCase): provider_id = TrelloProvider.id django-allauth-0.47.0/allauth/socialaccount/providers/trello/urls.py000066400000000000000000000002451415442050100256270ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth.urls import default_urlpatterns from .provider import TrelloProvider urlpatterns = default_urlpatterns(TrelloProvider) django-allauth-0.47.0/allauth/socialaccount/providers/trello/views.py000066400000000000000000000022031415442050100257730ustar00rootroot00000000000000import requests from django.utils.http import urlencode from allauth.socialaccount.providers.oauth.views import ( OAuthAdapter, OAuthCallbackView, OAuthLoginView, ) from .provider import TrelloProvider class TrelloOAuthAdapter(OAuthAdapter): provider_id = TrelloProvider.id request_token_url = "https://trello.com/1/OAuthGetRequestToken" authorize_url = "https://trello.com/1/OAuthAuthorizeToken" access_token_url = "https://trello.com/1/OAuthGetAccessToken" def complete_login(self, request, app, token, response): # we need to get the member id and the other information info_url = "{base}?{query}".format( base="https://api.trello.com/1/members/me", query=urlencode({"key": app.key, "token": response.get("oauth_token")}), ) resp = requests.get(info_url) resp.raise_for_status() extra_data = resp.json() result = self.get_provider().sociallogin_from_response(request, extra_data) return result oauth_login = OAuthLoginView.adapter_view(TrelloOAuthAdapter) oauth_callback = OAuthCallbackView.adapter_view(TrelloOAuthAdapter) django-allauth-0.47.0/allauth/socialaccount/providers/tumblr/000077500000000000000000000000001415442050100242735ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/tumblr/__init__.py000066400000000000000000000000261415442050100264020ustar00rootroot00000000000000__author__ = "jshedd" django-allauth-0.47.0/allauth/socialaccount/providers/tumblr/provider.py000066400000000000000000000013751415442050100265050ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth.provider import OAuthProvider class TumblrAccount(ProviderAccount): def get_profile_url_(self): return "http://%s.tumblr.com/" % self.account.extra_data.get("name") def to_str(self): dflt = super(TumblrAccount, self).to_str() name = self.account.extra_data.get("name", dflt) return name class TumblrProvider(OAuthProvider): id = "tumblr" name = "Tumblr" account_class = TumblrAccount def extract_uid(self, data): return data["name"] def extract_common_fields(self, data): return dict( first_name=data.get("name"), ) provider_classes = [TumblrProvider] django-allauth-0.47.0/allauth/socialaccount/providers/tumblr/tests.py000066400000000000000000000017531415442050100260150ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals from allauth.socialaccount.tests import OAuthTestsMixin from allauth.tests import MockedResponse, TestCase from .provider import TumblrProvider class TumblrTests(OAuthTestsMixin, TestCase): provider_id = TumblrProvider.id def get_mocked_response(self): return [ MockedResponse( 200, """ { "meta": { "status": 200, "msg": "OK" }, "response": { "user": { "following": 263, "default_post_format": "html", "name": "derekg", "likes": 606, "blogs": [ { "name": "derekg", "title": "Derek Gottfrid", "url": "http://derekg.org/", "tweet": "auto", "primary": true, "followers": 33004929 }, { "name": "ihatehipstrz", "title": "I Hate Hipstrz" } ] } } } """, ) ] django-allauth-0.47.0/allauth/socialaccount/providers/tumblr/urls.py000066400000000000000000000002451415442050100256330ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth.urls import default_urlpatterns from .provider import TumblrProvider urlpatterns = default_urlpatterns(TumblrProvider) django-allauth-0.47.0/allauth/socialaccount/providers/tumblr/views.py000066400000000000000000000021241415442050100260010ustar00rootroot00000000000000import json from allauth.socialaccount.providers.oauth.client import OAuth from allauth.socialaccount.providers.oauth.views import ( OAuthAdapter, OAuthCallbackView, OAuthLoginView, ) from .provider import TumblrProvider class TumblrAPI(OAuth): url = "http://api.tumblr.com/v2/user/info" def get_user_info(self): data = json.loads(self.query(self.url)) return data["response"]["user"] class TumblrOAuthAdapter(OAuthAdapter): provider_id = TumblrProvider.id request_token_url = "https://www.tumblr.com/oauth/request_token" access_token_url = "https://www.tumblr.com/oauth/access_token" authorize_url = "https://www.tumblr.com/oauth/authorize" def complete_login(self, request, app, token, response): client = TumblrAPI(request, app.client_id, app.secret, self.request_token_url) extra_data = client.get_user_info() return self.get_provider().sociallogin_from_response(request, extra_data) oauth_login = OAuthLoginView.adapter_view(TumblrOAuthAdapter) oauth_callback = OAuthCallbackView.adapter_view(TumblrOAuthAdapter) django-allauth-0.47.0/allauth/socialaccount/providers/twentythreeandme/000077500000000000000000000000001415442050100263555ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/twentythreeandme/__init__.py000066400000000000000000000000001415442050100304540ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/twentythreeandme/provider.py000066400000000000000000000012301415442050100305550ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class TwentyThreeAndMeAccount(ProviderAccount): pass class TwentyThreeAndMeProvider(OAuth2Provider): id = "twentythreeandme" slug = "23andme" name = "23andMe" account_class = TwentyThreeAndMeAccount def extract_uid(self, data): return data["id"] def get_default_scope(self): scope = ["basic"] return scope def extract_common_fields(self, data): return dict( email=data.get("email"), ) provider_classes = [TwentyThreeAndMeProvider] django-allauth-0.47.0/allauth/socialaccount/providers/twentythreeandme/tests.py000066400000000000000000000014731415442050100300760ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import TwentyThreeAndMeProvider class TwentyThreeAndMeTests(OAuth2TestsMixin, TestCase): provider_id = TwentyThreeAndMeProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "profiles": [ {"id": "56c46bdb0902f8e2", "genotyped": false} ], "id": "b4b975a5a6a1b80b" } """, ) def get_login_response_json(self, with_refresh_token=True): return """ { "access_token":"testac", "token_type":"bearer", "expires_in": 86400, "refresh_token":"33c53cd7bb", "scope":"basic" }""" django-allauth-0.47.0/allauth/socialaccount/providers/twentythreeandme/urls.py000066400000000000000000000002721415442050100277150ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import TwentyThreeAndMeProvider urlpatterns = default_urlpatterns(TwentyThreeAndMeProvider) django-allauth-0.47.0/allauth/socialaccount/providers/twentythreeandme/views.py000066400000000000000000000016261415442050100300710ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import TwentyThreeAndMeProvider class TwentyTreeAndMeOAuth2Adapter(OAuth2Adapter): provider_id = TwentyThreeAndMeProvider.id access_token_url = "https://api.23andme.com/token" authorize_url = "https://api.23andme.com/authorize" profile_url = "https://api.23andme.com/1/user/" def complete_login(self, request, app, token, **kwargs): headers = {"Authorization": "Bearer {0}".format(token.token)} resp = requests.get(self.profile_url, headers=headers) extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(TwentyTreeAndMeOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(TwentyTreeAndMeOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/twitch/000077500000000000000000000000001415442050100242705ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/twitch/__init__.py000066400000000000000000000000001415442050100263670ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/twitch/provider.py000066400000000000000000000022511415442050100264740ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class TwitchAccount(ProviderAccount): def get_profile_url(self): return "http://twitch.tv/" + self.account.extra_data.get("login") def get_avatar_url(self): # We're using `logo` as a failback for legacy profiles retrieved # with the old https://api.twitch.tv/kraken/user endpoint. logo = self.account.extra_data.get("logo") return self.account.extra_data.get("profile_image_url", logo) def to_str(self): dflt = super(TwitchAccount, self).to_str() return self.account.extra_data.get("login", dflt) class TwitchProvider(OAuth2Provider): id = "twitch" name = "Twitch" account_class = TwitchAccount def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): return { "username": data.get("login"), "name": data.get("display_name"), "email": data.get("email"), } def get_default_scope(self): return ["user:read:email"] provider_classes = [TwitchProvider] django-allauth-0.47.0/allauth/socialaccount/providers/twitch/tests.py000066400000000000000000000062771415442050100260200ustar00rootroot00000000000000from django.test.client import RequestFactory from django.urls import reverse from allauth.socialaccount.models import SocialToken from allauth.socialaccount.providers.oauth2.client import OAuth2Error from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase, mocked_response from .provider import TwitchProvider from .views import TwitchOAuth2Adapter class TwitchTests(OAuth2TestsMixin, TestCase): provider_id = TwitchProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "data": [{ "id": "44322889", "login": "dallas", "display_name": "dallas", "type": "staff", "broadcaster_type": "", "description": "Just a gamer playing games and chatting. :)", "profile_image_url": "https://static-cdn.jtvnw.net/jtv_user_pictures/dallas-profile_image-1a2c906ee2c35f12-300x300.png", "offline_image_url": "https://static-cdn.jtvnw.net/jtv_user_pictures/dallas-channel_offline_image-1a2c906ee2c35f12-1920x1080.png", "view_count": 191836881, "email": "login@provider.com" }] } """, ) # noqa def test_response_over_400_raises_OAuth2Error(self): resp_mock = MockedResponse(400, '{"error": "Invalid token"}') expected_error = "Twitch API Error: Invalid token ()" self.check_for_error(resp_mock, expected_error) def test_empty_or_missing_data_key_raises_OAuth2Error(self): resp_mock = MockedResponse(200, '{"data": []}') expected_error = "Invalid data from Twitch API: {'data': []}" self.check_for_error(resp_mock, expected_error) resp_mock = MockedResponse(200, '{"missing_data": "key"}') expected_error = "Invalid data from Twitch API: {'missing_data': 'key'}" self.check_for_error(resp_mock, expected_error) def test_missing_twitch_id_raises_OAuth2Error(self): resp_mock = MockedResponse(200, '{"data": [{"login": "fake_twitch"}]}') expected_error = "Invalid data from Twitch API: {'login': 'fake_twitch'}" self.check_for_error(resp_mock, expected_error) def check_for_error(self, resp_mock, expected_error): with self.assertRaises(OAuth2Error) as error_ctx: self._run_just_complete_login(resp_mock) self.assertEqual(str(error_ctx.exception).replace("u", ""), expected_error) def _run_just_complete_login(self, resp_mock): """ Helper function for checking that Error cases are handled correctly. Running only `complete_login` means we can check that the specific erros are raised before they are caught and rendered to generic error HTML """ request = RequestFactory().get( reverse(self.provider.id + "_login"), {"process": "login"}, ) adapter = TwitchOAuth2Adapter(request) app = adapter.get_provider().get_app(request) token = SocialToken(token="this-is-my-fake-token") with mocked_response(resp_mock): adapter = TwitchOAuth2Adapter(request) adapter.complete_login(request, app, token) django-allauth-0.47.0/allauth/socialaccount/providers/twitch/urls.py000066400000000000000000000002461415442050100256310ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import TwitchProvider urlpatterns = default_urlpatterns(TwitchProvider) django-allauth-0.47.0/allauth/socialaccount/providers/twitch/views.py000066400000000000000000000027351415442050100260060ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.client import OAuth2Error from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import TwitchProvider class TwitchOAuth2Adapter(OAuth2Adapter): provider_id = TwitchProvider.id access_token_url = "https://id.twitch.tv/oauth2/token" authorize_url = "https://id.twitch.tv/oauth2/authorize" profile_url = "https://api.twitch.tv/helix/users" def complete_login(self, request, app, token, **kwargs): headers = { "Authorization": "Bearer {}".format(token.token), "Client-ID": app.client_id, } response = requests.get(self.profile_url, headers=headers) data = response.json() if response.status_code >= 400: error = data.get("error", "") message = data.get("message", "") raise OAuth2Error("Twitch API Error: %s (%s)" % (error, message)) try: user_info = data.get("data", [])[0] except IndexError: raise OAuth2Error("Invalid data from Twitch API: %s" % (data)) if "id" not in user_info: raise OAuth2Error("Invalid data from Twitch API: %s" % (user_info)) return self.get_provider().sociallogin_from_response(request, user_info) oauth2_login = OAuth2LoginView.adapter_view(TwitchOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(TwitchOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/twitter/000077500000000000000000000000001415442050100244705ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/twitter/__init__.py000066400000000000000000000000001415442050100265670ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/twitter/provider.py000066400000000000000000000031221415442050100266720ustar00rootroot00000000000000from allauth.socialaccount.providers.base import AuthAction, ProviderAccount from allauth.socialaccount.providers.oauth.provider import OAuthProvider class TwitterAccount(ProviderAccount): def get_screen_name(self): return self.account.extra_data.get("screen_name") def get_profile_url(self): ret = None screen_name = self.get_screen_name() if screen_name: ret = "http://twitter.com/" + screen_name return ret def get_avatar_url(self): ret = None profile_image_url = self.account.extra_data.get("profile_image_url") if profile_image_url: # Hmm, hack to get our hands on the large image. Not # really documented, but seems to work. ret = profile_image_url.replace("_normal", "") return ret def to_str(self): screen_name = self.get_screen_name() return screen_name or super(TwitterAccount, self).to_str() class TwitterProvider(OAuthProvider): id = "twitter" name = "Twitter" account_class = TwitterAccount def get_auth_url(self, request, action): if action == AuthAction.REAUTHENTICATE: url = "https://api.twitter.com/oauth/authorize" else: url = "https://api.twitter.com/oauth/authenticate" return url def extract_uid(self, data): return data["id"] def extract_common_fields(self, data): return dict( username=data.get("screen_name"), name=data.get("name"), email=data.get("email"), ) provider_classes = [TwitterProvider] django-allauth-0.47.0/allauth/socialaccount/providers/twitter/tests.py000066400000000000000000000074441415442050100262150ustar00rootroot00000000000000# -*- coding: utf-8 -*- from allauth.socialaccount.tests import OAuthTestsMixin from allauth.tests import MockedResponse, TestCase from .provider import TwitterProvider class TwitterTests(OAuthTestsMixin, TestCase): provider_id = TwitterProvider.id def get_mocked_response(self): # FIXME: Replace with actual/complete Twitter response return [ MockedResponse( 200, r""" {"follow_request_sent": false, "profile_use_background_image": true, "id": 45671919, "verified": false, "profile_text_color": "333333", "profile_image_url_https": "https://pbs.twimg.com/profile_images/793142149/r_normal.png", "profile_sidebar_fill_color": "DDEEF6", "is_translator": false, "geo_enabled": false, "entities": {"description": {"urls": []}}, "followers_count": 43, "protected": false, "location": "The Netherlands", "default_profile_image": false, "id_str": "45671919", "status": {"contributors": null, "truncated": false, "text": "RT @denibertovic: Okay I'm definitely using django-allauth from now on. So easy to set up, far less time consuming, and it just works. #dja\u2026", "in_reply_to_status_id": null, "id": 400658301702381568, "favorite_count": 0, "source": "Twitter Web Client", "retweeted": true, "coordinates": null, "entities": {"symbols": [], "user_mentions": [{"indices": [3, 16], "screen_name": "denibertovic", "id": 23508244, "name": "Deni Bertovic", "id_str": "23508244"}], "hashtags": [{"indices": [135, 139], "text": "dja"}], "urls": []}, "in_reply_to_screen_name": null, "id_str": "400658301702381568", "retweet_count": 6, "in_reply_to_user_id": null, "favorited": false, "retweeted_status": {"lang": "en", "favorited": false, "in_reply_to_user_id": null, "contributors": null, "truncated": false, "text": "Okay I'm definitely using django-allauth from now on. So easy to set up, far less time consuming, and it just works. #django", "created_at": "Sun Jul 28 19:56:26 +0000 2013", "retweeted": true, "in_reply_to_status_id": null, "coordinates": null, "id": 361575897674956800, "entities": {"symbols": [], "user_mentions": [], "hashtags": [{"indices": [117, 124], "text": "django"}], "urls": []}, "in_reply_to_status_id_str": null, "in_reply_to_screen_name": null, "source": "web", "place": null, "retweet_count": 6, "geo": null, "in_reply_to_user_id_str": null, "favorite_count": 8, "id_str": "361575897674956800"}, "geo": null, "in_reply_to_user_id_str": null, "lang": "en", "created_at": "Wed Nov 13 16:15:57 +0000 2013", "in_reply_to_status_id_str": null, "place": null}, "utc_offset": 3600, "statuses_count": 39, "description": "", "friends_count": 83, "profile_link_color": "0084B4", "profile_image_url": "http://pbs.twimg.com/profile_images/793142149/r_normal.png", "notifications": false, "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", "profile_background_color": "C0DEED", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", "name": "Raymond Penners", "lang": "nl", "profile_background_tile": false, "favourites_count": 0, "screen_name": "pennersr", "url": null, "created_at": "Mon Jun 08 21:10:45 +0000 2009", "contributors_enabled": false, "time_zone": "Amsterdam", "profile_sidebar_border_color": "C0DEED", "default_profile": true, "following": false, "listed_count": 1} """, ) ] # noqa def test_login(self): account = super(TwitterTests, self).test_login() tw_account = account.get_provider_account() self.assertEqual(tw_account.get_screen_name(), "pennersr") self.assertEqual( tw_account.get_avatar_url(), "http://pbs.twimg.com/profile_images/793142149/r.png", ) self.assertEqual(tw_account.get_profile_url(), "http://twitter.com/pennersr") django-allauth-0.47.0/allauth/socialaccount/providers/twitter/urls.py000066400000000000000000000002471415442050100260320ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth.urls import default_urlpatterns from .provider import TwitterProvider urlpatterns = default_urlpatterns(TwitterProvider) django-allauth-0.47.0/allauth/socialaccount/providers/twitter/views.py000066400000000000000000000026451415442050100262060ustar00rootroot00000000000000import json from allauth.socialaccount.app_settings import QUERY_EMAIL from allauth.socialaccount.providers.oauth.client import OAuth from allauth.socialaccount.providers.oauth.views import ( OAuthAdapter, OAuthCallbackView, OAuthLoginView, ) from .provider import TwitterProvider class TwitterAPI(OAuth): """ Verifying twitter credentials """ _base_url = "https://api.twitter.com/1.1/account/verify_credentials.json" url = _base_url + "?include_email=true" if QUERY_EMAIL else _base_url def get_user_info(self): user = json.loads(self.query(self.url)) return user class TwitterOAuthAdapter(OAuthAdapter): provider_id = TwitterProvider.id request_token_url = "https://api.twitter.com/oauth/request_token" access_token_url = "https://api.twitter.com/oauth/access_token" # Issue #42 -- this one authenticates over and over again... # authorize_url = 'https://api.twitter.com/oauth/authorize' authorize_url = "https://api.twitter.com/oauth/authenticate" def complete_login(self, request, app, token, response): client = TwitterAPI(request, app.client_id, app.secret, self.request_token_url) extra_data = client.get_user_info() return self.get_provider().sociallogin_from_response(request, extra_data) oauth_login = OAuthLoginView.adapter_view(TwitterOAuthAdapter) oauth_callback = OAuthCallbackView.adapter_view(TwitterOAuthAdapter) django-allauth-0.47.0/allauth/socialaccount/providers/untappd/000077500000000000000000000000001415442050100244415ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/untappd/__init__.py000066400000000000000000000000001415442050100265400ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/untappd/client.py000066400000000000000000000031501415442050100262700ustar00rootroot00000000000000import requests from allauth.socialaccount import app_settings from allauth.socialaccount.providers.oauth2.client import ( OAuth2Client, OAuth2Error, ) from .provider import UntappdProvider class UntappdOAuth2Client(OAuth2Client): """ Custom client because Untappd: * uses redirect_url instead of redirect_uri * nests access_token inside an extra 'response' object """ def get_access_token(self, code): data = { "client_id": self.consumer_key, "redirect_url": self.callback_url, "grant_type": "authorization_code", "response_type": "code", "client_secret": self.consumer_secret, "code": code, } params = None self._strip_empty_keys(data) url = self.access_token_url if self.access_token_method == "GET": params = data data = None # Allow custom User Agent to comply with Untappd API settings = app_settings.PROVIDERS.get(UntappdProvider.id, {}) headers = {"User-Agent": settings.get("USER_AGENT", "django-allauth")} # TODO: Proper exception handling resp = requests.request( self.access_token_method, url, params=params, data=data, headers=headers, ) access_token = None if resp.status_code == 200: access_token = resp.json()["response"] if not access_token or "access_token" not in access_token: raise OAuth2Error("Error retrieving access token: %s" % resp.content) return access_token django-allauth-0.47.0/allauth/socialaccount/providers/untappd/provider.py000066400000000000000000000031351415442050100266470ustar00rootroot00000000000000from django.urls import reverse from allauth.account.models import EmailAddress from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class UntappdAccount(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("untappd_url") def get_avatar_url(self): return self.account.extra_data.get("user_avatar") def to_str(self): dflt = super(UntappdAccount, self).to_str() return self.account.extra_data.get("user_name", dflt) class UntappdProvider(OAuth2Provider): id = "untappd" name = "Untappd" account_class = UntappdAccount def get_auth_params(self, request, action): params = super(UntappdProvider, self).get_auth_params(request, action) # Untappd uses redirect_url instead of redirect_uri params["redirect_url"] = request.build_absolute_uri( reverse(self.id + "_callback") ) return params def extract_uid(self, data): return str(data["response"]["user"]["uid"]) def extract_common_fields(self, data): user = data["response"]["user"] return dict( username=user["user_name"], name=user["first_name"] + " " + user["last_name"], ) def extract_email_addresses(self, data): ret = [ EmailAddress( email=data["response"]["user"]["settings"]["email_address"], verified=True, primary=True, ) ] return ret provider_classes = [UntappdProvider] django-allauth-0.47.0/allauth/socialaccount/providers/untappd/tests.py000066400000000000000000000055371415442050100261670ustar00rootroot00000000000000from allauth.socialaccount.providers import registry from allauth.socialaccount.tests import create_oauth2_tests from allauth.tests import MockedResponse from .provider import UntappdProvider class UntappdTests(create_oauth2_tests(registry.by_id(UntappdProvider.id))): def get_login_response_json(self, with_refresh_token=True): return """ { "meta": { "http_code": 200 }, "response": { "access_token": "testac" } }""" def get_mocked_response(self): return MockedResponse( 200, """ { "meta":{ "code":200, "response_time":{ "time":0.29, "measure":"seconds" }, "init_time":{ "time":0.011, "measure":"seconds" } }, "notifications":{ "type":"notifications", "unread_count":{ "comments":0, "toasts":0, "friends":0, "messages":0, "news":0 } }, "response":{ "user":{ "uid":123456, "id":123456, "user_name":"groovecoder", "first_name":"", "last_name":"", "user_avatar":"https:\\/\\/gravatar.com\\/avatar\\/ec25d046746de3be33779256f6957d8f?size=100&d=https%3A%2F%2Funtappd.akamaized.net%2Fsite%2Fassets%2Fimages%2Fdefault_avatar_v2.jpg%3Fv%3D1", "user_avatar_hd":"https:\\/\\/gravatar.com\\/avatar\\/ec25d046746de3be33779256f6957d8f?size=125&d=https%3A%2F%2Funtappd.akamaized.net%2Fsite%2Fassets%2Fimages%2Fdefault_avatar_v2.jpg%3Fv%3D1", "user_cover_photo":"https:\\/\\/untappd.akamaized.net\\/site\\/assets\\/v3\\/images\\/cover_default.jpg", "user_cover_photo_offset":0, "is_private":0, "location":"Testville", "url":"", "bio":"", "is_supporter":0, "relationship":"self", "untappd_url":"http:\\/\\/untappd.com\\/user\\/testuser", "account_type":"user", "stats":{ "total_badges":43, "total_friends":43, "total_checkins":73, "total_beers":61, "total_created_beers":1, "total_followings":9, "total_photos":31 }, "recent_brews":{}, "checkins":{}, "media":{}, "contact":{}, "date_joined":"Tue, 11 Dec 2012 14:27:53 +0000", "settings":{ "badge":{ "badges_to_facebook":1, "badges_to_twitter":1 }, "checkin":{ "checkin_to_facebook":0, "checkin_to_twitter":0, "checkin_to_foursquare":0 }, "navigation":{ "default_to_checkin":0 }, "email_address":"test@example.com" } } } } """, ) django-allauth-0.47.0/allauth/socialaccount/providers/untappd/urls.py000066400000000000000000000002501415442050100257750ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import UntappdProvider urlpatterns = default_urlpatterns(UntappdProvider) django-allauth-0.47.0/allauth/socialaccount/providers/untappd/views.py000066400000000000000000000020341415442050100261470ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .client import UntappdOAuth2Client from .provider import UntappdProvider class UntappdOAuth2Adapter(OAuth2Adapter): client_class = UntappdOAuth2Client provider_id = UntappdProvider.id access_token_url = "https://untappd.com/oauth/authorize/" access_token_method = "GET" authorize_url = "https://untappd.com/oauth/authenticate/" user_info_url = "https://api.untappd.com/v4/user/info/" supports_state = False def complete_login(self, request, app, token, **kwargs): resp = requests.get(self.user_info_url, params={"access_token": token.token}) extra_data = resp.json() # TODO: get and store the email from the user info json return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(UntappdOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(UntappdOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/vimeo/000077500000000000000000000000001415442050100241055ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/vimeo/__init__.py000066400000000000000000000000001415442050100262040ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/vimeo/provider.py000066400000000000000000000011161415442050100263100ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth.provider import OAuthProvider class VimeoAccount(ProviderAccount): pass class VimeoProvider(OAuthProvider): id = "vimeo" name = "Vimeo" account_class = VimeoAccount def get_default_scope(self): scope = [] return scope def extract_uid(self, data): return data["id"] def extract_common_fields(self, data): return dict(name=data.get("display_name"), username=data.get("username")) provider_classes = [VimeoProvider] django-allauth-0.47.0/allauth/socialaccount/providers/vimeo/tests.py000066400000000000000000000027711415442050100256300ustar00rootroot00000000000000# -*- coding: utf-8 -*- from allauth.socialaccount.tests import OAuthTestsMixin from allauth.tests import MockedResponse, TestCase from .provider import VimeoProvider class VimeoTests(OAuthTestsMixin, TestCase): provider_id = VimeoProvider.id def get_mocked_response(self): return [ MockedResponse( 200, """ {"generated_in":"0.0137", "stat":"ok","person":{ "created_on": "2013-04-08 14:24:47", "id":"17574504", "is_contact":"0", "is_plus":"0","is_pro":"0","is_staff":"0","is_subscribed_to":"0", "username":"user17574504","display_name":"Raymond Penners","location":"", "url":[""],"bio":"","number_of_contacts":"0","number_of_uploads":"0", "number_of_likes":"0","number_of_videos":"0", "number_of_videos_appears_in":"0","number_of_albums":"0", "number_of_channels":"0","number_of_groups":"0", "profileurl":"http:\\/\\/vimeo.com\\/user17574504", "videosurl":"http:\\/\\/vimeo.com\\/user17574504\\/videos", "portraits":{"portrait":[{"height":"30","width":"30", "_content": "http:\\/\\/a.vimeocdn.com\\/images_v6\\/portraits\\/portrait_30_yellow.png"}, {"height":"75","width":"75","_content": "http:\\/\\/a.vimeocdn.com\\/images_v6\\/portraits\\/portrait_75_yellow.png"}, {"height":"100","width":"100","_content": "http:\\/\\/a.vimeocdn.com\\/images_v6\\/portraits\\/portrait_100_yellow.png"}, {"height":"300","width":"300","_content": "http:\\/\\/a.vimeocdn.com\\/images_v6\\/portraits\\/portrait_300_yellow.png"}]}}} """, ) ] django-allauth-0.47.0/allauth/socialaccount/providers/vimeo/urls.py000066400000000000000000000002431415442050100254430ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth.urls import default_urlpatterns from .provider import VimeoProvider urlpatterns = default_urlpatterns(VimeoProvider) django-allauth-0.47.0/allauth/socialaccount/providers/vimeo/views.py000066400000000000000000000021701415442050100256140ustar00rootroot00000000000000import json from allauth.socialaccount.providers.oauth.client import OAuth from allauth.socialaccount.providers.oauth.views import ( OAuthAdapter, OAuthCallbackView, OAuthLoginView, ) from .provider import VimeoProvider class VimeoAPI(OAuth): url = "http://vimeo.com/api/rest/v2?method=vimeo.people.getInfo" def get_user_info(self): url = self.url data = json.loads(self.query(url, params=dict(format="json"))) return data["person"] class VimeoOAuthAdapter(OAuthAdapter): provider_id = VimeoProvider.id request_token_url = "https://vimeo.com/oauth/request_token" access_token_url = "https://vimeo.com/oauth/access_token" authorize_url = "https://vimeo.com/oauth/authorize" def complete_login(self, request, app, token, response): client = VimeoAPI(request, app.client_id, app.secret, self.request_token_url) extra_data = client.get_user_info() return self.get_provider().sociallogin_from_response(request, extra_data) oauth_login = OAuthLoginView.adapter_view(VimeoOAuthAdapter) oauth_callback = OAuthCallbackView.adapter_view(VimeoOAuthAdapter) django-allauth-0.47.0/allauth/socialaccount/providers/vimeo_oauth2/000077500000000000000000000000001415442050100253675ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/vimeo_oauth2/__init__.py000066400000000000000000000000001415442050100274660ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/vimeo_oauth2/models.py000066400000000000000000000000001415442050100272120ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/vimeo_oauth2/provider.py000066400000000000000000000012211415442050100275670ustar00rootroot00000000000000""" Provider for Patreon """ from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class VimeoOAuth2Account(ProviderAccount): pass class VimeoOAuth2Provider(OAuth2Provider): id = "vimeo_oauth2" name = "Vimeo" account_class = VimeoOAuth2Account def get_default_scope(self): return ["public", "private"] def extract_uid(self, data): return data.get("uri").split("/")[-1] def extract_common_fields(self, data): return { "fullname": data.get("name"), } provider_classes = [VimeoOAuth2Provider] django-allauth-0.47.0/allauth/socialaccount/providers/vimeo_oauth2/test.py000066400000000000000000000017741415442050100267310ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import VimeoOAuth2Provider class VimeoOAuth2Tests(OAuth2TestsMixin, TestCase): provider_id = VimeoOAuth2Provider.id def get_mocked_response(self): return MockedResponse( 200, """{ "uri": "/users/12345", "name": "AllAuth", "link": "https://vimeo.com/user12345", "created_time": "2012-06-04T00:02:16+00:00", "pictures": { "uri": null, "active": false, "type": "default", "sizes": [{ "width": 30, "height": 30, "link": "https://i.vimeocdn.com/portrait/defaults-blue_30x30.png" }], "resource_key": "1234567890abcdef" }, "resource_key": "1234567890abcdef", "account": "pro" }""", ) # noqa django-allauth-0.47.0/allauth/socialaccount/providers/vimeo_oauth2/urls.py000066400000000000000000000003211415442050100267220ustar00rootroot00000000000000"""URLs for Patreon Provider""" from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import VimeoOAuth2Provider urlpatterns = default_urlpatterns(VimeoOAuth2Provider) django-allauth-0.47.0/allauth/socialaccount/providers/vimeo_oauth2/views.py000066400000000000000000000017171415442050100271040ustar00rootroot00000000000000""" Views for PatreonProvider https://www.patreon.com/platform/documentation/oauth """ import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import VimeoOAuth2Provider class VimeoOAuth2Adapter(OAuth2Adapter): provider_id = VimeoOAuth2Provider.id access_token_url = "https://api.vimeo.com/oauth/access_token" authorize_url = "https://api.vimeo.com/oauth/authorize" profile_url = "https://api.vimeo.com/me/" def complete_login(self, request, app, token, **kwargs): resp = requests.get( self.profile_url, headers={"Authorization": "Bearer " + token.token}, ) extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(VimeoOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(VimeoOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/vk/000077500000000000000000000000001415442050100234065ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/vk/__init__.py000066400000000000000000000000001415442050100255050ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/vk/provider.py000066400000000000000000000027751415442050100256250ustar00rootroot00000000000000from allauth.socialaccount import app_settings from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class VKAccount(ProviderAccount): def get_profile_url(self): return "https://vk.com/id%s" % self.account.extra_data.get("id") def get_avatar_url(self): ret = None photo_big_url = self.account.extra_data.get("photo_big") photo_medium_url = self.account.extra_data.get("photo_medium") if photo_big_url: return photo_big_url elif photo_medium_url: return photo_medium_url else: return ret def to_str(self): first_name = self.account.extra_data.get("first_name", "") last_name = self.account.extra_data.get("last_name", "") name = " ".join([first_name, last_name]).strip() return name or super(VKAccount, self).to_str() class VKProvider(OAuth2Provider): id = "vk" name = "VK" account_class = VKAccount def get_default_scope(self): scope = [] if app_settings.QUERY_EMAIL: scope.append("email") return scope def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): return dict( email=data.get("email"), last_name=data.get("last_name"), username=data.get("screen_name"), first_name=data.get("first_name"), ) provider_classes = [VKProvider] django-allauth-0.47.0/allauth/socialaccount/providers/vk/tests.py000066400000000000000000000023411415442050100251220ustar00rootroot00000000000000from __future__ import absolute_import from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import VKProvider class VKTests(OAuth2TestsMixin, TestCase): provider_id = VKProvider.id def get_mocked_response(self, verified_email=True): return MockedResponse( 200, """ {"response": [{"last_name": "Penners", "university_name": "", "photo": "http://vk.com/images/camera_c.gif", "sex": 2, "photo_medium": "http://vk.com/images/camera_b.gif", "relation": "0", "timezone": 1, "photo_big": "http://vk.com/images/camera_a.gif", "id": 219004864, "universities": [], "city": "1430", "first_name": "Raymond", "faculty_name": "", "online": 1, "counters": {"videos": 0, "online_friends": 0, "notes": 0, "audios": 0, "photos": 0, "followers": 0, "groups": 0, "user_videos": 0, "albums": 0, "friends": 0}, "home_phone": "", "faculty": 0, "nickname": "", "screen_name": "id219004864", "has_mobile": 1, "country": "139", "university": 0, "graduation": 0, "activity": "", "last_seen": {"time": 1377805189}}]} """, ) def get_login_response_json(self, with_refresh_token=True): return '{"user_id": 219004864, "access_token":"testac"}' django-allauth-0.47.0/allauth/socialaccount/providers/vk/urls.py000066400000000000000000000002361415442050100247460ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import VKProvider urlpatterns = default_urlpatterns(VKProvider) django-allauth-0.47.0/allauth/socialaccount/providers/vk/views.py000066400000000000000000000030251415442050100251150ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import VKProvider USER_FIELDS = [ "first_name", "last_name", "nickname", "screen_name", "sex", "bdate", "city", "country", "timezone", "photo", "photo_medium", "photo_big", "photo_max_orig", "has_mobile", "contacts", "education", "online", "counters", "relation", "last_seen", "activity", "universities", ] class VKOAuth2Adapter(OAuth2Adapter): provider_id = VKProvider.id access_token_url = "https://oauth.vk.com/access_token" authorize_url = "https://oauth.vk.com/authorize" profile_url = "https://api.vk.com/method/users.get" def complete_login(self, request, app, token, **kwargs): uid = kwargs["response"].get("user_id") params = { "v": "5.95", "access_token": token.token, "fields": ",".join(USER_FIELDS), } if uid: params["user_ids"] = uid resp = requests.get(self.profile_url, params=params) resp.raise_for_status() extra_data = resp.json()["response"][0] email = kwargs["response"].get("email") if email: extra_data["email"] = email return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(VKOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(VKOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/weibo/000077500000000000000000000000001415442050100240735ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/weibo/__init__.py000066400000000000000000000000001415442050100261720ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/weibo/provider.py000066400000000000000000000017631415442050100263060ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ( ProviderAccount, ProviderException, ) from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class WeiboAccount(ProviderAccount): def get_profile_url(self): # profile_url = "u/3195025850" return "http://www.weibo.com/" + self.account.extra_data.get("profile_url") def get_avatar_url(self): return self.account.extra_data.get("avatar_large") def to_str(self): dflt = super(WeiboAccount, self).to_str() return self.account.extra_data.get("name", dflt) class WeiboProvider(OAuth2Provider): id = "weibo" name = "Weibo" account_class = WeiboAccount def extract_uid(self, data): ret = data.get("idstr") if not ret: raise ProviderException("Missing 'idstr'") return ret def extract_common_fields(self, data): return dict(username=data.get("screen_name"), name=data.get("name")) provider_classes = [WeiboProvider] django-allauth-0.47.0/allauth/socialaccount/providers/weibo/tests.py000066400000000000000000000022531415442050100256110ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import WeiboProvider class WeiboTests(OAuth2TestsMixin, TestCase): provider_id = WeiboProvider.id def get_mocked_response(self): return MockedResponse( 200, """ {"bi_followers_count": 0, "domain": "", "avatar_large": "http://tp3.sinaimg.cn/3195025850/180/0/0", "block_word": 0, "star": 0, "id": 3195025850, "city": "1", "verified": false, "follow_me": false, "verified_reason": "", "followers_count": 6, "location": "\u5317\u4eac \u4e1c\u57ce\u533a", "mbtype": 0, "profile_url": "u/3195025850", "province": "11", "statuses_count": 0, "description": "", "friends_count": 0, "online_status": 0, "mbrank": 0, "idstr": "3195025850", "profile_image_url": "http://tp3.sinaimg.cn/3195025850/50/0/0", "allow_all_act_msg": false, "allow_all_comment": true, "geo_enabled": true, "name": "pennersr", "lang": "zh-cn", "weihao": "", "remark": "", "favourites_count": 0, "screen_name": "pennersr", "url": "", "gender": "f", "created_at": "Tue Feb 19 19:43:39 +0800 2013", "verified_type": -1, "following": false} """, ) django-allauth-0.47.0/allauth/socialaccount/providers/weibo/urls.py000066400000000000000000000002441415442050100254320ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import WeiboProvider urlpatterns = default_urlpatterns(WeiboProvider) django-allauth-0.47.0/allauth/socialaccount/providers/weibo/views.py000066400000000000000000000016401415442050100256030ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import WeiboProvider class WeiboOAuth2Adapter(OAuth2Adapter): provider_id = WeiboProvider.id access_token_url = "https://api.weibo.com/oauth2/access_token" authorize_url = "https://api.weibo.com/oauth2/authorize" profile_url = "https://api.weibo.com/2/users/show.json" def complete_login(self, request, app, token, **kwargs): uid = kwargs.get("response", {}).get("uid") resp = requests.get( self.profile_url, params={"access_token": token.token, "uid": uid} ) extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(WeiboOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(WeiboOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/weixin/000077500000000000000000000000001415442050100242715ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/weixin/__init__.py000066400000000000000000000000001415442050100263700ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/weixin/client.py000066400000000000000000000032251415442050100261230ustar00rootroot00000000000000import requests from collections import OrderedDict from django.utils.http import urlencode from allauth.socialaccount.providers.oauth2.client import ( OAuth2Client, OAuth2Error, ) class WeixinOAuth2Client(OAuth2Client): def get_redirect_url(self, authorization_url, extra_params): params = { "appid": self.consumer_key, "redirect_uri": self.callback_url, "scope": self.scope, "response_type": "code", } if self.state: params["state"] = self.state params.update(extra_params) sorted_params = OrderedDict() for param in sorted(params): sorted_params[param] = params[param] return "%s?%s" % (authorization_url, urlencode(sorted_params)) def get_access_token(self, code): data = { "appid": self.consumer_key, "redirect_uri": self.callback_url, "grant_type": "authorization_code", "secret": self.consumer_secret, "scope": self.scope, "code": code, } params = None self._strip_empty_keys(data) url = self.access_token_url if self.access_token_method == "GET": params = data data = None # TODO: Proper exception handling resp = requests.request(self.access_token_method, url, params=params, data=data) access_token = None if resp.status_code == 200: access_token = resp.json() if not access_token or "access_token" not in access_token: raise OAuth2Error("Error retrieving access token: %s" % resp.content) return access_token django-allauth-0.47.0/allauth/socialaccount/providers/weixin/provider.py000066400000000000000000000014461415442050100265020ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class WeixinAccount(ProviderAccount): def get_avatar_url(self): return self.account.extra_data.get("headimgurl") def to_str(self): return self.account.extra_data.get( "nickname", super(WeixinAccount, self).to_str() ) class WeixinProvider(OAuth2Provider): id = "weixin" name = "Weixin" account_class = WeixinAccount def extract_uid(self, data): return data["openid"] def get_default_scope(self): return ["snsapi_login"] def extract_common_fields(self, data): return dict(username=data.get("nickname"), name=data.get("nickname")) provider_classes = [WeixinProvider] django-allauth-0.47.0/allauth/socialaccount/providers/weixin/tests.py000066400000000000000000000023241415442050100260060ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals from allauth.socialaccount.providers import registry from allauth.socialaccount.tests import create_oauth2_tests from allauth.tests import MockedResponse from .provider import WeixinProvider class WeixinTests(create_oauth2_tests(registry.by_id(WeixinProvider.id))): def get_mocked_response(self): return MockedResponse( 200, """ {"access_token": "OezXcEiiBSKSxW0eoylIeO5cPxb4Ks1RpbXGMv9uiV35032zNHGzXcld-EKsSScE3gRZMrUU78skCbp1ShtZnR0dQB8Wr_LUf7FA-H97Lnd2HgQah_GnkQex-vPFsGEwPPcNAV6q1Vz3uRNgL0MUFg", "city": "Pudong New District", "country": "CN", "expires_in": 7200, "headimgurl": "http://wx.qlogo.cn/mmopen/VkvLVEpoJiaibYsVyW8GzxHibzlnqSM7iaX09r6TWUJXCNQHibHz37krvN65HR1ibEpgH5K5sukcIzA3r1C4KQ9qyyX9XIUdY9lNOk/0", "language": "zh_CN", "nickname": "某某某", "openid": "ohS-VwAJ9GEXlplngwybJ3Z-ZHrI", "privilege": [], "province": "Shanghai", "refresh_token": "OezXcEiiBSKSxW0eoylIeO5cPxb4Ks1RpbXGMv9uiV35032zNHGzXcld-EKsSScEbMnnMqVExcSpj7KRAuBA8BU2j2e_FK5dgBe-ro32k7OuHtznwqqBn5QR7LZGo2-P8G7gG0eitjyZ751sFlnTAw", "scope": "snsapi_login", "sex": 1, "unionid": "ohHrhwKnD9TOunEW0eKTS45vS5Qo"}""", ) # noqa django-allauth-0.47.0/allauth/socialaccount/providers/weixin/urls.py000066400000000000000000000002461415442050100256320ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import WeixinProvider urlpatterns = default_urlpatterns(WeixinProvider) django-allauth-0.47.0/allauth/socialaccount/providers/weixin/views.py000066400000000000000000000025701415442050100260040ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .client import WeixinOAuth2Client from .provider import WeixinProvider class WeixinOAuth2Adapter(OAuth2Adapter): provider_id = WeixinProvider.id access_token_url = "https://api.weixin.qq.com/sns/oauth2/access_token" profile_url = "https://api.weixin.qq.com/sns/userinfo" client_class = WeixinOAuth2Client @property def authorize_url(self): settings = self.get_provider().get_settings() url = settings.get( "AUTHORIZE_URL", "https://open.weixin.qq.com/connect/qrconnect" ) return url def complete_login(self, request, app, token, **kwargs): openid = kwargs.get("response", {}).get("openid") resp = requests.get( self.profile_url, params={"access_token": token.token, "openid": openid}, ) extra_data = resp.json() nickname = extra_data.get("nickname") if nickname: extra_data["nickname"] = nickname.encode("raw_unicode_escape").decode( "utf-8" ) return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(WeixinOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(WeixinOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/windowslive/000077500000000000000000000000001415442050100253405ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/windowslive/__init__.py000066400000000000000000000000001415442050100274370ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/windowslive/provider.py000066400000000000000000000023671415442050100275540ustar00rootroot00000000000000from __future__ import unicode_literals from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class WindowsLiveAccount(ProviderAccount): def to_str(self): name = "{0} {1}".format( self.account.extra_data.get("first_name", ""), self.account.extra_data.get("last_name", ""), ) if name.strip() != "": return name return super(WindowsLiveAccount, self).to_str() class WindowsLiveProvider(OAuth2Provider): id = str("windowslive") name = "Live" account_class = WindowsLiveAccount def get_default_scope(self): """ Doc on scopes available at http://msdn.microsoft.com/en-us/library/dn631845.aspx """ return ["wl.basic", "wl.emails"] def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): try: email = data.get("emails").get("preferred") except AttributeError: email = None return dict( email=email, last_name=data.get("last_name"), first_name=data.get("first_name"), ) provider_classes = [WindowsLiveProvider] django-allauth-0.47.0/allauth/socialaccount/providers/windowslive/tests.py000066400000000000000000000015541415442050100270610ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import WindowsLiveProvider class WindowsLiveTests(OAuth2TestsMixin, TestCase): provider_id = WindowsLiveProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "first_name": "James", "last_name": "Smith", "name": "James Smith", "locale": "en_US", "gender": null, "emails": { "personal": null, "account": "jsmith@example.com", "business": null, "preferred": "jsmith@example.com" }, "link": "https://profile.live.com/", "updated_time": "2014-02-07T00:35:27+0000", "id": "83605e110af6ff98" } """, ) django-allauth-0.47.0/allauth/socialaccount/providers/windowslive/urls.py000066400000000000000000000002601415442050100266750ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import WindowsLiveProvider urlpatterns = default_urlpatterns(WindowsLiveProvider) django-allauth-0.47.0/allauth/socialaccount/providers/windowslive/views.py000066400000000000000000000026521415442050100270540ustar00rootroot00000000000000from __future__ import unicode_literals import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import WindowsLiveProvider class WindowsLiveOAuth2Adapter(OAuth2Adapter): provider_id = WindowsLiveProvider.id access_token_url = "https://login.live.com/oauth20_token.srf" authorize_url = "https://login.live.com/oauth20_authorize.srf" profile_url = "https://apis.live.net/v5.0/me" def complete_login(self, request, app, token, **kwargs): headers = {"Authorization": "Bearer {0}".format(token.token)} resp = requests.get(self.profile_url, headers=headers) # example of whats returned (in python format): # {'first_name': 'James', 'last_name': 'Smith', # 'name': 'James Smith', 'locale': 'en_US', 'gender': None, # 'emails': {'personal': None, 'account': 'jsmith@example.com', # 'business': None, 'preferred': 'jsmith@example.com'}, # 'link': 'https://profile.live.com/', # 'updated_time': '2014-02-07T00:35:27+0000', # 'id': '83605e110af6ff98'} resp.raise_for_status() extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(WindowsLiveOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(WindowsLiveOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/xing/000077500000000000000000000000001415442050100237335ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/xing/__init__.py000066400000000000000000000000001415442050100260320ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/xing/provider.py000066400000000000000000000021271415442050100261410ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth.provider import OAuthProvider class XingAccount(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("permalink") def get_avatar_url(self): return self.account.extra_data.get("photo_urls", {}).get("large") def to_str(self): dflt = super(XingAccount, self).to_str() first_name = self.account.extra_data.get("first_name", "") last_name = self.account.extra_data.get("last_name", "") name = " ".join([first_name, last_name]).strip() return name or dflt class XingProvider(OAuthProvider): id = "xing" name = "Xing" account_class = XingAccount def extract_uid(self, data): return data["id"] def extract_common_fields(self, data): return dict( email=data.get("active_email"), username=data.get("page_name"), first_name=data.get("first_name"), last_name=data.get("last_name"), ) provider_classes = [XingProvider] django-allauth-0.47.0/allauth/socialaccount/providers/xing/tests.py000066400000000000000000000037331415442050100254550ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals from allauth.socialaccount.tests import OAuthTestsMixin from allauth.tests import MockedResponse, TestCase from .provider import XingProvider class XingTests(OAuthTestsMixin, TestCase): provider_id = XingProvider.id def get_mocked_response(self): return [ MockedResponse( 200, """ {"users":[{"id":"20493333_1cd028","active_email":"raymond.penners@example.com", "badges":[],"birth_date":{"year":null,"month":null,"day":null}, "business_address":{"street":null,"zip_code":null,"city":null,"province":null, "country":"NL","email":null,"fax":null,"phone":null,"mobile_phone":null}, "display_name":"Raymond Penners","educational_background": {"primary_school_id":null,"schools":[],"qualifications":[]}, "employment_status":"EMPLOYEE","first_name":"Raymond","gender":"m", "haves":null,"instant_messaging_accounts":{},"interests":null,"languages": {"nl":null},"last_name":"Penners","organisation_member":null, "page_name":"Raymond_Penners", "permalink":"https://www.xing.com/profile/Raymond_Penners", "photo_urls":{"thumb":"https://www.xing.com/img/n/nobody_m.30x40.jpg", "large":"https://www.xing.com/img/n/nobody_m.140x185.jpg","mini_thumb": "https://www.xing.com/img/n/nobody_m.18x24.jpg","maxi_thumb": "https://www.xing.com/img/n/nobody_m.70x93.jpg","medium_thumb": "https://www.xing.com/img/n/nobody_m.57x75.jpg"},"premium_services":[], "private_address":{"street":null,"zip_code":null,"city":null,"province":null, "country":null,"email":"raymond.penners@example.com","fax":null, "phone":null,"mobile_phone":null},"professional_experience": {"primary_company":{"name":null,"url":null,"tag":null,"title":null, "begin_date":null,"end_date":null,"description":null,"industry":"OTHERS", "company_size":null,"career_level":null},"non_primary_companies":[], "awards":[]},"time_zone":{"utc_offset":2.0,"name":"Europe/Berlin"}, "wants":null,"web_profiles":{}}]} """, ) ] django-allauth-0.47.0/allauth/socialaccount/providers/xing/urls.py000066400000000000000000000002411415442050100252670ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth.urls import default_urlpatterns from .provider import XingProvider urlpatterns = default_urlpatterns(XingProvider) django-allauth-0.47.0/allauth/socialaccount/providers/xing/views.py000066400000000000000000000020621415442050100254420ustar00rootroot00000000000000import json from allauth.socialaccount.providers.oauth.client import OAuth from allauth.socialaccount.providers.oauth.views import ( OAuthAdapter, OAuthCallbackView, OAuthLoginView, ) from .provider import XingProvider class XingAPI(OAuth): url = "https://api.xing.com/v1/users/me.json" def get_user_info(self): user = json.loads(self.query(self.url)) return user class XingOAuthAdapter(OAuthAdapter): provider_id = XingProvider.id request_token_url = "https://api.xing.com/v1/request_token" access_token_url = "https://api.xing.com/v1/access_token" authorize_url = "https://www.xing.com/v1/authorize" def complete_login(self, request, app, token, response): client = XingAPI(request, app.client_id, app.secret, self.request_token_url) extra_data = client.get_user_info()["users"][0] return self.get_provider().sociallogin_from_response(request, extra_data) oauth_login = OAuthLoginView.adapter_view(XingOAuthAdapter) oauth_callback = OAuthCallbackView.adapter_view(XingOAuthAdapter) django-allauth-0.47.0/allauth/socialaccount/providers/yahoo/000077500000000000000000000000001415442050100241055ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/yahoo/__init__.py000066400000000000000000000000001415442050100262040ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/yahoo/models.py000066400000000000000000000000331415442050100257360ustar00rootroot00000000000000# Create your models here. django-allauth-0.47.0/allauth/socialaccount/providers/yahoo/provider.py000066400000000000000000000025741415442050100263210ustar00rootroot00000000000000from __future__ import unicode_literals from allauth.socialaccount.models import EmailAddress from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class YahooAccount(ProviderAccount): def to_str(self): name = "{0} {1}".format( self.account.extra_data.get("given_name", ""), self.account.extra_data.get("family_name", ""), ) if name.strip() != "": return name return super(YahooAccount, self).to_str() class YahooProvider(OAuth2Provider): id = str("yahoo") name = "Yahoo" account_class = YahooAccount def get_default_scope(self): """ Doc on scopes available at https://developer.yahoo.com/oauth2/guide/yahoo_scopes/ """ return ["profile", "email"] def extract_uid(self, data): return data["sub"] def extract_common_fields(self, data): return dict( email=data["email"], last_name=data["family_name"], first_name=data["given_name"], ) def extract_email_addresses(self, data): ret = [] email = data.get("email") if email and data.get("email_verified"): ret.append(EmailAddress(email=email, verified=True, primary=True)) return ret provider_classes = [YahooProvider] django-allauth-0.47.0/allauth/socialaccount/providers/yahoo/tests.py000066400000000000000000000012571415442050100256260ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import YahooProvider class YahooTests(OAuth2TestsMixin, TestCase): provider_id = YahooProvider.id def get_mocked_response(self): response_data = """ { "sub": "FSVIDUW3D7FSVIDUW3D72F2F", "name": "Jane Doe", "given_name": "Jane", "family_name": "Doe", "preferred_username": "j.doe", "email": "janedoe@example.com", "email_verified": true, "picture": "http://example.com/janedoe/me.jpg" } """ # noqa return MockedResponse(200, response_data) django-allauth-0.47.0/allauth/socialaccount/providers/yahoo/urls.py000066400000000000000000000002441415442050100254440ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import YahooProvider urlpatterns = default_urlpatterns(YahooProvider) django-allauth-0.47.0/allauth/socialaccount/providers/yahoo/views.py000066400000000000000000000017301415442050100256150ustar00rootroot00000000000000from __future__ import unicode_literals import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import YahooProvider class YahooOAuth2Adapter(OAuth2Adapter): provider_id = YahooProvider.id access_token_url = "https://api.login.yahoo.com/oauth2/get_token" authorize_url = "https://api.login.yahoo.com/oauth2/request_auth" profile_url = "https://api.login.yahoo.com/openid/v1/userinfo" def complete_login(self, request, app, token, **kwargs): headers = {"Authorization": "Bearer {0}".format(token.token)} resp = requests.get(self.profile_url, headers=headers) resp.raise_for_status() extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(YahooOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(YahooOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/yandex/000077500000000000000000000000001415442050100242565ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/yandex/__init__.py000066400000000000000000000000001415442050100263550ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/yandex/provider.py000066400000000000000000000031401415442050100264600ustar00rootroot00000000000000from allauth.account.models import EmailAddress from allauth.socialaccount import app_settings from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class YandexAccout(ProviderAccount): def to_str(self): first_name = self.account.extra_data.get("first_name", "") last_name = self.account.extra_data.get("last_name", "") name = " ".join([first_name, last_name]).strip() return name or super(YandexAccout, self).to_str() class YandexProvider(OAuth2Provider): id = "yandex" name = "Yandex" account_class = YandexAccout def get_default_scope(self): scope = ["login:info"] if app_settings.QUERY_EMAIL: scope.append("login:email") return scope def extract_uid(self, data): return str(data["id"]) def get_user_email(self, data): email = data.get("default_email") if not email: emails = data.get("emails") email = emails[0] if emails else "" return email def extract_common_fields(self, data): email = self.get_user_email(data) return dict( email=email, last_name=data.get("last_name"), username=data.get("display_name"), first_name=data.get("first_name"), ) def extract_email_addresses(self, data): ret = [] email = self.get_user_email(data) if email: ret.append(EmailAddress(email=email, verified=True, primary=True)) return ret provider_classes = [YandexProvider] django-allauth-0.47.0/allauth/socialaccount/providers/yandex/tests.py000066400000000000000000000026471415442050100260030ustar00rootroot00000000000000from __future__ import absolute_import from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import YandexProvider class YandexTests(OAuth2TestsMixin, TestCase): provider_id = YandexProvider.id yandex_data = """ { "login": "vasya", "old_social_login": "uid-mmzxrnry", "default_email": "test@yandex.ru", "id": "1000034426", "client_id": "4760187d81bc4b7799476b42b5103713", "emails": [ "test@yandex.ru", "other-test@yandex.ru" ], "openid_identities": [ "http://openid.yandex.ru/vasya/", "http://vasya.ya.ru/" ] }""" def get_mocked_response(self, data=None): if data is None: data = self.yandex_data return MockedResponse(200, data) def get_login_response_json(self, with_refresh_token=True): return """ { "access_token":"testac", "refresh_token":"1:GN686QVt0mmakDd9:A4pYuW9LGk0_UnlrMIWklk", "token_type":"bearer", "expires_in":124234123534 }""" django-allauth-0.47.0/allauth/socialaccount/providers/yandex/urls.py000066400000000000000000000002461415442050100256170ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import YandexProvider urlpatterns = default_urlpatterns(YandexProvider) django-allauth-0.47.0/allauth/socialaccount/providers/yandex/views.py000066400000000000000000000016051415442050100257670ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import YandexProvider class YandexAuth2Adapter(OAuth2Adapter): provider_id = YandexProvider.id access_token_url = "https://oauth.yandex.ru/token" authorize_url = "https://oauth.yandex.com/authorize" profile_url = "https://login.yandex.ru/info" def complete_login(self, request, app, token, **kwargs): resp = requests.get( self.profile_url, params={"oauth_token": token.token, "format": "json"}, ) resp.raise_for_status() extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(YandexAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(YandexAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/ynab/000077500000000000000000000000001415442050100237175ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/ynab/__init__.py000066400000000000000000000000001415442050100260160ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/ynab/provider.py000066400000000000000000000014341415442050100261250ustar00rootroot00000000000000from allauth.socialaccount.providers.base import AuthAction, ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class Scope(object): ACCESS = "read-only" class YNABAccount(ProviderAccount): pass class YNABProvider(OAuth2Provider): id = "ynab" name = "YNAB" account_class = YNABAccount def get_default_scope(self): scope = [Scope.ACCESS] return scope def get_auth_params(self, request, action): ret = super(YNABProvider, self).get_auth_params(request, action) if action == AuthAction.REAUTHENTICATE: ret["prompt"] = "select_account consent" return ret def extract_uid(self, data): return str(data["data"]["user"]["id"]) provider_classes = [YNABProvider] django-allauth-0.47.0/allauth/socialaccount/providers/ynab/tests.py000066400000000000000000000044061415442050100254370ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import absolute_import, unicode_literals from requests.exceptions import HTTPError from django.test.client import RequestFactory from django.test.utils import override_settings from django.urls import reverse from allauth.socialaccount.models import SocialToken from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase, patch from .provider import YNABProvider @override_settings( SOCIALACCOUNT_AUTO_SIGNUP=True, ACCOUNT_SIGNUP_FORM_CLASS=None, ) # ACCOUNT_EMAIL_VERIFICATION=account_settings # .EmailVerificationMethod.MANDATORY) class YNABTests(OAuth2TestsMixin, TestCase): provider_id = YNABProvider.id def get_mocked_response(self): return MockedResponse( 200, """ {"data": { "user":{ "id": "abcd1234xyz5678" } } } """, ) def test_ynab_compelete_login_401(self): from allauth.socialaccount.providers.ynab.views import ( YNABOAuth2Adapter, ) class LessMockedResponse(MockedResponse): def raise_for_status(self): if self.status_code != 200: raise HTTPError(None) request = RequestFactory().get( reverse(self.provider.id + "_login"), dict(process="login") ) adapter = YNABOAuth2Adapter(request) app = adapter.get_provider().get_app(request) token = SocialToken(token="some_token") response_with_401 = LessMockedResponse( 401, """ {"error": { "errors": [{ "domain": "global", "reason": "authError", "message": "Invalid Credentials", "locationType": "header", "location": "Authorization" } ], "code": 401, "message": "Invalid Credentials" } }""", ) with patch( "allauth.socialaccount.providers.ynab.views.requests" ) as patched_requests: patched_requests.get.return_value = response_with_401 with self.assertRaises(HTTPError): adapter.complete_login(request, app, token) django-allauth-0.47.0/allauth/socialaccount/providers/ynab/urls.py000066400000000000000000000002421415442050100252540ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import YNABProvider urlpatterns = default_urlpatterns(YNABProvider) django-allauth-0.47.0/allauth/socialaccount/providers/ynab/views.py000066400000000000000000000016741415442050100254360ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import YNABProvider class YNABOAuth2Adapter(OAuth2Adapter): provider_id = YNABProvider.id access_token_url = "https://app.youneedabudget.com/oauth/token" authorize_url = "https://app.youneedabudget.com/oauth/authorize" profile_url = "https://api.youneedabudget.com/v1/user" def complete_login(self, request, app, token, **kwargs): resp = requests.get( self.profile_url, headers={"Authorization": "Bearer {}".format(token.token)}, ) resp.raise_for_status() extra_data = resp.json() login = self.get_provider().sociallogin_from_response(request, extra_data) return login oauth2_login = OAuth2LoginView.adapter_view(YNABOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(YNABOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/zoho/000077500000000000000000000000001415442050100237455ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/zoho/__init__.py000066400000000000000000000000001415442050100260440ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/zoho/provider.py000066400000000000000000000022561415442050100261560ustar00rootroot00000000000000from allauth.account.models import EmailAddress from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class ZohoAccount(ProviderAccount): def to_str(self): dflt = super(ZohoAccount, self).to_str() return self.account.extra_data.get("Display_Name", dflt) class ZohoProvider(OAuth2Provider): id = "zoho" name = "Zoho" account_class = ZohoAccount def get_default_scope(self): return ["aaaserver.profile.READ"] def extract_uid(self, data): return data["ZUID"] def extract_common_fields(self, data): return dict( email=data["Email"], username=data["Display_Name"], first_name=data["First_Name"], last_name=data["Last_Name"], ) def extract_email_addresses(self, data): ret = [] email = data.get("Email") if email: ret.append( EmailAddress( email=email, verified=False, primary=True, ) ) return ret provider_classes = [ZohoProvider] django-allauth-0.47.0/allauth/socialaccount/providers/zoho/tests.py000066400000000000000000000006761415442050100254720ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import ZohoProvider class ZohoTests(OAuth2TestsMixin, TestCase): provider_id = ZohoProvider.id def get_mocked_response(self): return MockedResponse( 200, """ {"First_Name":"John","Email":"jdoe@example.com", "Last_Name":"Doe","Display_Name":"JDoee","ZUID":1234567} """, ) django-allauth-0.47.0/allauth/socialaccount/providers/zoho/urls.py000066400000000000000000000002421415442050100253020ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import ZohoProvider urlpatterns = default_urlpatterns(ZohoProvider) django-allauth-0.47.0/allauth/socialaccount/providers/zoho/views.py000066400000000000000000000016401415442050100254550ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import ZohoProvider class ZohoOAuth2Adapter(OAuth2Adapter): provider_id = ZohoProvider.id access_token_url = "https://accounts.zoho.com/oauth/v2/token" authorize_url = "https://accounts.zoho.com/oauth/v2/auth" profile_url = "https://accounts.zoho.com/oauth/user/info" def complete_login(self, request, app, token, **kwargs): resp = requests.get( self.profile_url, headers={"Authorization": "Bearer {}".format(token.token)}, ) resp.raise_for_status() extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(ZohoOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(ZohoOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/providers/zoom/000077500000000000000000000000001415442050100237525ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/zoom/__init__.py000066400000000000000000000000001415442050100260510ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/providers/zoom/provider.py000066400000000000000000000022061415442050100261560ustar00rootroot00000000000000from allauth.account.models import EmailAddress from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class ZoomAccount(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("vanity_url") def get_avatar_url(self): return self.account.extra_data.get("pic_url") def to_str(self): dflt = super(ZoomAccount, self).to_str() return self.account.extra_data.get("name", dflt) class ZoomProvider(OAuth2Provider): id = "zoom" name = "Zoom" account_class = ZoomAccount def extract_uid(self, data): return data["id"] def extract_common_fields(self, data): return dict( email=data["email"], first_name=data["first_name"], last_name=data["last_name"], ) def extract_email_addresses(self, data): ret = [] email = data.get("email") if email and data.get("verified"): ret.append(EmailAddress(email=email, verified=True, primary=True)) return ret provider_classes = [ZoomProvider] django-allauth-0.47.0/allauth/socialaccount/providers/zoom/tests.py000066400000000000000000000023121415442050100254640ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import ZoomProvider class ZoomTests(OAuth2TestsMixin, TestCase): provider_id = ZoomProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "id": "KdYKjnimT4KPd8FFgQt9FQ", "first_name": "Jane", "last_name": "Dev", "email": "jane.dev@email.com", "type": 2, "role_name": "Owner", "pmi": 1234567890, "use_pmi": false, "vanity_url": "https://janedevinc.zoom.us/my/janedev", "personal_meeting_url": "https://janedevinc.zoom.us/j/1234567890", "timezone": "America/Denver", "verified": 1, "dept": "", "created_at": "2019-04-05T15:24:32Z", "last_login_time": "2019-12-16T18:02:48Z", "last_client_version": "4.6.12611.1124(mac)", "pic_url": "https://janedev.zoom.us/p/KdYKjnimFR5Td8KKdQt9FQ/19f6430f-...", "host_key": "533895", "jid": "kdykjnimt4kpd8kkdqt9fq@xmpp.zoom.us", "group_ids": [], "im_group_ids": [ "3NXCD9VFTCOUH8LD-QciGw" ], "account_id": "gVcjZnYYRLDbb_MfgHuaxg", "language": "en-US", "phone_country": "US", "phone_number": "+1 1234567891", "status": "active" } """, ) django-allauth-0.47.0/allauth/socialaccount/providers/zoom/urls.py000066400000000000000000000002421415442050100253070ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import ZoomProvider urlpatterns = default_urlpatterns(ZoomProvider) django-allauth-0.47.0/allauth/socialaccount/providers/zoom/views.py000066400000000000000000000016011415442050100254570ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import ZoomProvider class ZoomOAuth2Adapter(OAuth2Adapter): provider_id = ZoomProvider.id access_token_url = "https://zoom.us/oauth/token" authorize_url = "https://zoom.us/oauth/authorize" profile_url = "https://api.zoom.us/v2/users/me" def complete_login(self, request, app, token, **kwargs): resp = requests.get( self.profile_url, headers={"Authorization": "Bearer {}".format(token.token)}, ) resp.raise_for_status() extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(ZoomOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(ZoomOAuth2Adapter) django-allauth-0.47.0/allauth/socialaccount/signals.py000066400000000000000000000016251415442050100227670ustar00rootroot00000000000000from django.dispatch import Signal # Sent after a user successfully authenticates via a social provider, # but before the login is actually processed. This signal is emitted # for social logins, signups and when connecting additional social # accounts to an account. # Provides the arguments "request", "sociallogin" pre_social_login = Signal() # Sent after a user connects a social account to a their local account. # Provides the arguments "request", "sociallogin" social_account_added = Signal() # Sent after a user connects an already existing social account to a # their local account. The social account will have an updated token and # refreshed extra_data. # Provides the arguments "request", "sociallogin" social_account_updated = Signal() # Sent after a user disconnects a social account from their local # account. # Provides the arguments "request", "socialaccount" social_account_removed = Signal() django-allauth-0.47.0/allauth/socialaccount/templatetags/000077500000000000000000000000001415442050100234435ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/templatetags/__init__.py000066400000000000000000000000001415442050100255420ustar00rootroot00000000000000django-allauth-0.47.0/allauth/socialaccount/templatetags/socialaccount.py000066400000000000000000000056531415442050100266550ustar00rootroot00000000000000from django import template from django.template.defaulttags import token_kwargs from allauth.socialaccount import providers from allauth.utils import get_request_param register = template.Library() class ProviderLoginURLNode(template.Node): def __init__(self, provider_id, params): self.provider_id_var = template.Variable(provider_id) self.params = params def render(self, context): provider_id = self.provider_id_var.resolve(context) request = context.get("request") provider = providers.registry.by_id(provider_id, request) query = dict( [(str(name), var.resolve(context)) for name, var in self.params.items()] ) auth_params = query.get("auth_params", None) scope = query.get("scope", None) process = query.get("process", None) if scope == "": del query["scope"] if auth_params == "": del query["auth_params"] if "next" not in query: next = get_request_param(request, "next") if next: query["next"] = next elif process == "redirect": query["next"] = request.get_full_path() else: if not query["next"]: del query["next"] # get the login url and append query as url parameters return provider.get_login_url(request, **query) @register.tag def provider_login_url(parser, token): """ {% provider_login_url "facebook" next=bla %} {% provider_login_url "openid" openid="http://me.yahoo.com" next=bla %} """ bits = token.split_contents() provider_id = bits[1] params = token_kwargs(bits[2:], parser, support_legacy=False) return ProviderLoginURLNode(provider_id, params) class ProvidersMediaJSNode(template.Node): def render(self, context): request = context["request"] ret = "\n".join( p.media_js(request) for p in providers.registry.get_list(request) ) return ret @register.tag def providers_media_js(parser, token): return ProvidersMediaJSNode() @register.simple_tag def get_social_accounts(user): """ {% get_social_accounts user as accounts %} Then: {{accounts.twitter}} -- a list of connected Twitter accounts {{accounts.twitter.0}} -- the first Twitter account {% if accounts %} -- if there is at least one social account """ accounts = {} for account in user.socialaccount_set.all().iterator(): providers = accounts.setdefault(account.provider, []) providers.append(account) return accounts @register.simple_tag def get_providers(): """ Returns a list of social authentication providers. Usage: `{% get_providers as socialaccount_providers %}`. Then within the template context, `socialaccount_providers` will hold a list of social providers configured for the current site. """ return providers.registry.get_list() django-allauth-0.47.0/allauth/socialaccount/tests.py000066400000000000000000000566071415442050100225030ustar00rootroot00000000000000import json import random import warnings from urllib.parse import parse_qs, urlparse from django.conf import settings from django.contrib.auth.models import AnonymousUser from django.contrib.messages.middleware import MessageMiddleware from django.contrib.sessions.middleware import SessionMiddleware from django.contrib.sites.models import Site from django.test.client import RequestFactory from django.test.utils import override_settings from django.urls import reverse from django.utils.http import urlencode from ..account import app_settings as account_settings from ..account.models import EmailAddress from ..account.utils import user_email, user_username from ..tests import MockedResponse, TestCase, mocked_response from ..utils import get_user_model from . import app_settings, providers from .helpers import complete_social_login from .models import SocialAccount, SocialApp, SocialLogin from .views import signup def setup_app(provider): app = None if not app_settings.PROVIDERS.get(provider.id, {}).get("APP"): app = SocialApp.objects.create( provider=provider.id, name=provider.id, client_id="app123id", key=provider.id, secret="dummy", ) app.sites.add(Site.objects.get_current()) return app class OAuthTestsMixin(object): provider_id = None def get_mocked_response(self): pass def setUp(self): super(OAuthTestsMixin, self).setUp() self.provider = providers.registry.by_id(self.provider_id) self.app = setup_app(self.provider) @override_settings(SOCIALACCOUNT_AUTO_SIGNUP=False) def test_login(self): resp_mocks = self.get_mocked_response() if resp_mocks is None: warnings.warn("Cannot test provider %s, no oauth mock" % self.provider.id) return resp = self.login(resp_mocks) self.assertRedirects(resp, reverse("socialaccount_signup")) resp = self.client.get(reverse("socialaccount_signup")) sociallogin = resp.context["form"].sociallogin data = dict( email=user_email(sociallogin.user), username=str(random.randrange(1000, 10000000)), ) resp = self.client.post(reverse("socialaccount_signup"), data=data) self.assertRedirects(resp, "/accounts/profile/", fetch_redirect_response=False) user = resp.context["user"] self.assertFalse(user.has_usable_password()) account = SocialAccount.objects.get(user=user, provider=self.provider.id) # The following lines don't actually test that much, but at least # we make sure that the code is hit. provider_account = account.get_provider_account() provider_account.get_avatar_url() provider_account.get_profile_url() provider_account.get_brand() provider_account.to_str() return account @override_settings( SOCIALACCOUNT_AUTO_SIGNUP=True, SOCIALACCOUNT_EMAIL_REQUIRED=False, ACCOUNT_EMAIL_REQUIRED=False, ) def test_auto_signup(self): resp_mocks = self.get_mocked_response() if not resp_mocks: warnings.warn("Cannot test provider %s, no oauth mock" % self.provider.id) return resp = self.login(resp_mocks) self.assertRedirects(resp, "/accounts/profile/", fetch_redirect_response=False) self.assertFalse(resp.context["user"].has_usable_password()) def login(self, resp_mocks, process="login"): with mocked_response( MockedResponse( 200, "oauth_token=token&oauth_token_secret=psst", {"content-type": "text/html"}, ) ): resp = self.client.post( reverse(self.provider.id + "_login") + "?" + urlencode(dict(process=process)) ) p = urlparse(resp["location"]) q = parse_qs(p.query) complete_url = reverse(self.provider.id + "_callback") self.assertGreater(q["oauth_callback"][0].find(complete_url), 0) with mocked_response(self.get_access_token_response(), *resp_mocks): resp = self.client.get(complete_url) return resp def get_access_token_response(self): return MockedResponse( 200, "oauth_token=token&oauth_token_secret=psst", {"content-type": "text/html"}, ) def test_authentication_error(self): resp = self.client.get(reverse(self.provider.id + "_callback")) self.assertTemplateUsed( resp, "socialaccount/authentication_error.%s" % getattr(settings, "ACCOUNT_TEMPLATE_EXTENSION", "html"), ) # For backward-compatibility with third-party provider tests that call # create_oauth_tests() rather than using the mixin directly. def create_oauth_tests(provider): class Class(OAuthTestsMixin, TestCase): provider_id = provider.id Class.__name__ = "OAuthTests_" + provider.id return Class class OAuth2TestsMixin(object): provider_id = None def get_mocked_response(self): pass def get_login_response_json(self, with_refresh_token=True): rt = "" if with_refresh_token: rt = ',"refresh_token": "testrf"' return ( """{ "uid":"weibo", "access_token":"testac" %s }""" % rt ) def setUp(self): super(OAuth2TestsMixin, self).setUp() self.provider = providers.registry.by_id(self.provider_id) self.app = setup_app(self.provider) @override_settings(SOCIALACCOUNT_AUTO_SIGNUP=False) def test_login(self): resp_mock = self.get_mocked_response() if not resp_mock: warnings.warn("Cannot test provider %s, no oauth mock" % self.provider.id) return resp = self.login( resp_mock, ) self.assertRedirects(resp, reverse("socialaccount_signup")) def test_account_tokens(self, multiple_login=False): if not app_settings.STORE_TOKENS: return email = "user@example.com" user = get_user_model()(is_active=True) user_email(user, email) user_username(user, "user") user.set_password("test") user.save() EmailAddress.objects.create(user=user, email=email, primary=True, verified=True) self.client.login(username=user.username, password="test") self.login(self.get_mocked_response(), process="connect") if multiple_login: self.login( self.get_mocked_response(), with_refresh_token=False, process="connect", ) # get account sa = SocialAccount.objects.filter(user=user, provider=self.provider.id).get() # The following lines don't actually test that much, but at least # we make sure that the code is hit. provider_account = sa.get_provider_account() provider_account.get_avatar_url() provider_account.get_profile_url() provider_account.get_brand() provider_account.to_str() # get token if self.app: t = sa.socialtoken_set.get() # verify access_token and refresh_token self.assertEqual("testac", t.token) self.assertEqual( t.token_secret, json.loads(self.get_login_response_json(with_refresh_token=True)).get( "refresh_token", "" ), ) def test_account_refresh_token_saved_next_login(self): """ fails if a login missing a refresh token, deletes the previously saved refresh token. Systems such as google's oauth only send a refresh token on first login. """ self.test_account_tokens(multiple_login=True) def login(self, resp_mock, process="login", with_refresh_token=True): resp = self.client.post( reverse(self.provider.id + "_login") + "?" + urlencode(dict(process=process)) ) p = urlparse(resp["location"]) q = parse_qs(p.query) complete_url = reverse(self.provider.id + "_callback") self.assertGreater(q["redirect_uri"][0].find(complete_url), 0) response_json = self.get_login_response_json( with_refresh_token=with_refresh_token ) if isinstance(resp_mock, list): resp_mocks = resp_mock else: resp_mocks = [resp_mock] with mocked_response( MockedResponse(200, response_json, {"content-type": "application/json"}), *resp_mocks, ): resp = self.client.get(complete_url, self.get_complete_parameters(q)) return resp def get_complete_parameters(self, q): return {"code": "test", "state": q["state"][0]} def test_authentication_error(self): resp = self.client.get(reverse(self.provider.id + "_callback")) self.assertTemplateUsed( resp, "socialaccount/authentication_error.%s" % getattr(settings, "ACCOUNT_TEMPLATE_EXTENSION", "html"), ) # For backward-compatibility with third-party provider tests that call # create_oauth2_tests() rather than using the mixin directly. def create_oauth2_tests(provider): class Class(OAuth2TestsMixin, TestCase): provider_id = provider.id Class.__name__ = "OAuth2Tests_" + provider.id return Class class SocialAccountTests(TestCase): def setUp(self): super(SocialAccountTests, self).setUp() site = Site.objects.get_current() for provider in providers.registry.get_list(): app = SocialApp.objects.create( provider=provider.id, name=provider.id, client_id="app123id", key="123", secret="dummy", ) app.sites.add(site) @override_settings( SOCIALACCOUNT_AUTO_SIGNUP=True, ACCOUNT_SIGNUP_FORM_CLASS=None, ACCOUNT_EMAIL_VERIFICATION=account_settings.EmailVerificationMethod.NONE, # noqa ) def test_email_address_created(self): factory = RequestFactory() request = factory.get("/accounts/login/callback/") request.user = AnonymousUser() SessionMiddleware(lambda request: None).process_request(request) MessageMiddleware(lambda request: None).process_request(request) User = get_user_model() user = User() setattr(user, account_settings.USER_MODEL_USERNAME_FIELD, "test") setattr(user, account_settings.USER_MODEL_EMAIL_FIELD, "test@example.com") account = SocialAccount(provider="openid", uid="123") sociallogin = SocialLogin(user=user, account=account) complete_social_login(request, sociallogin) user = User.objects.get(**{account_settings.USER_MODEL_USERNAME_FIELD: "test"}) self.assertTrue( SocialAccount.objects.filter(user=user, uid=account.uid).exists() ) self.assertTrue( EmailAddress.objects.filter(user=user, email=user_email(user)).exists() ) @override_settings( ACCOUNT_EMAIL_REQUIRED=True, ACCOUNT_UNIQUE_EMAIL=True, ACCOUNT_USERNAME_REQUIRED=True, ACCOUNT_AUTHENTICATION_METHOD="email", SOCIALACCOUNT_AUTO_SIGNUP=True, ) def test_email_address_clash_username_required(self): """Test clash on both username and email""" request, resp = self._email_address_clash("test", "test@example.com") self.assertEqual(resp["location"], reverse("socialaccount_signup")) # POST different username/email to social signup form request.method = "POST" request.POST = {"username": "other", "email": "other@example.com"} resp = signup(request) self.assertEqual(resp["location"], "/accounts/profile/") user = get_user_model().objects.get( **{account_settings.USER_MODEL_EMAIL_FIELD: "other@example.com"} ) self.assertEqual(user_username(user), "other") @override_settings( ACCOUNT_EMAIL_REQUIRED=True, ACCOUNT_UNIQUE_EMAIL=True, ACCOUNT_USERNAME_REQUIRED=False, ACCOUNT_AUTHENTICATION_METHOD="email", SOCIALACCOUNT_AUTO_SIGNUP=True, ) def test_email_address_clash_username_not_required(self): """Test clash while username is not required""" request, resp = self._email_address_clash("test", "test@example.com") self.assertEqual(resp["location"], reverse("socialaccount_signup")) # POST email to social signup form (username not present) request.method = "POST" request.POST = {"email": "other@example.com"} resp = signup(request) self.assertEqual(resp["location"], "/accounts/profile/") user = get_user_model().objects.get( **{account_settings.USER_MODEL_EMAIL_FIELD: "other@example.com"} ) self.assertNotEqual(user_username(user), "test") @override_settings( ACCOUNT_EMAIL_REQUIRED=True, ACCOUNT_UNIQUE_EMAIL=True, ACCOUNT_USERNAME_REQUIRED=False, ACCOUNT_AUTHENTICATION_METHOD="email", SOCIALACCOUNT_AUTO_SIGNUP=True, ) def test_email_address_clash_username_auto_signup(self): # Clash on username, but auto signup still works request, resp = self._email_address_clash("test", "other@example.com") self.assertEqual(resp["location"], "/accounts/profile/") user = get_user_model().objects.get( **{account_settings.USER_MODEL_EMAIL_FIELD: "other@example.com"} ) self.assertNotEqual(user_username(user), "test") @override_settings( ACCOUNT_EMAIL_REQUIRED=True, ACCOUNT_USERNAME_BLACKLIST=["username", "username1", "username2"], ACCOUNT_UNIQUE_EMAIL=True, ACCOUNT_USERNAME_REQUIRED=True, ACCOUNT_AUTHENTICATION_METHOD="email", SOCIALACCOUNT_AUTO_SIGNUP=True, ) def test_populate_username_in_blacklist(self): factory = RequestFactory() request = factory.get("/accounts/twitter/login/callback/") request.user = AnonymousUser() SessionMiddleware(lambda request: None).process_request(request) MessageMiddleware(lambda request: None).process_request(request) User = get_user_model() user = User() setattr(user, account_settings.USER_MODEL_USERNAME_FIELD, "username") setattr( user, account_settings.USER_MODEL_EMAIL_FIELD, "username@example.com", ) account = SocialAccount(provider="twitter", uid="123") sociallogin = SocialLogin(user=user, account=account) complete_social_login(request, sociallogin) self.assertNotIn(request.user.username, account_settings.USERNAME_BLACKLIST) def _email_address_clash(self, username, email): User = get_user_model() # Some existig user exi_user = User() user_username(exi_user, "test") user_email(exi_user, "test@example.com") exi_user.save() # A social user being signed up... account = SocialAccount(provider="twitter", uid="123") user = User() user_username(user, username) user_email(user, email) sociallogin = SocialLogin(user=user, account=account) # Signing up, should pop up the social signup form factory = RequestFactory() request = factory.get("/accounts/twitter/login/callback/") request.user = AnonymousUser() SessionMiddleware(lambda request: None).process_request(request) MessageMiddleware(lambda request: None).process_request(request) resp = complete_social_login(request, sociallogin) return request, resp def test_disconnect(self): User = get_user_model() # Some existig user user = User() user_username(user, "test") user_email(user, "test@example.com") user.set_password("test") user.save() account = SocialAccount.objects.create(uid="123", provider="twitter", user=user) self.client.login(username=user.username, password=user.username) resp = self.client.get(reverse("socialaccount_connections")) self.assertTemplateUsed(resp, "socialaccount/connections.html") resp = self.client.post( reverse("socialaccount_connections"), {"account": account.pk} ) self.assertFalse(SocialAccount.objects.filter(pk=account.pk).exists()) @override_settings( ACCOUNT_EMAIL_REQUIRED=True, ACCOUNT_EMAIL_VERIFICATION="mandatory", ACCOUNT_UNIQUE_EMAIL=True, ACCOUNT_USERNAME_REQUIRED=False, ACCOUNT_AUTHENTICATION_METHOD="email", SOCIALACCOUNT_AUTO_SIGNUP=False, ) def test_verified_email_change_at_signup(self): """ Test scenario for when the user changes email at social signup. Current behavior is that both the unverified and verified email are added, and that the user is allowed to pass because he did provide a verified one. """ session = self.client.session User = get_user_model() sociallogin = SocialLogin( user=User(email="verified@example.com"), account=SocialAccount(provider="google"), email_addresses=[ EmailAddress(email="verified@example.com", verified=True, primary=True) ], ) session["socialaccount_sociallogin"] = sociallogin.serialize() session.save() resp = self.client.get(reverse("socialaccount_signup")) form = resp.context["form"] self.assertEqual(form["email"].value(), "verified@example.com") resp = self.client.post( reverse("socialaccount_signup"), data={"email": "unverified@example.org"}, ) self.assertRedirects(resp, "/accounts/profile/", fetch_redirect_response=False) user = User.objects.all()[0] self.assertEqual(user_email(user), "verified@example.com") self.assertTrue( EmailAddress.objects.filter( user=user, email="verified@example.com", verified=True, primary=True, ).exists() ) self.assertTrue( EmailAddress.objects.filter( user=user, email="unverified@example.org", verified=False, primary=False, ).exists() ) @override_settings( ACCOUNT_EMAIL_REQUIRED=True, ACCOUNT_EMAIL_VERIFICATION="mandatory", ACCOUNT_UNIQUE_EMAIL=True, ACCOUNT_USERNAME_REQUIRED=False, ACCOUNT_AUTHENTICATION_METHOD="email", SOCIALACCOUNT_AUTO_SIGNUP=False, ) def test_unverified_email_change_at_signup(self): """ Test scenario for when the user changes email at social signup, while his provider did not provide a verified email. In that case, email verification will kick in. Here, both email addresses are added as well. """ session = self.client.session User = get_user_model() sociallogin = SocialLogin( user=User(email="unverified@example.com"), account=SocialAccount(provider="google"), email_addresses=[ EmailAddress( email="unverified@example.com", verified=False, primary=True, ) ], ) session["socialaccount_sociallogin"] = sociallogin.serialize() session.save() resp = self.client.get(reverse("socialaccount_signup")) form = resp.context["form"] self.assertEqual(form["email"].value(), "unverified@example.com") resp = self.client.post( reverse("socialaccount_signup"), data={"email": "unverified@example.org"}, ) self.assertRedirects(resp, reverse("account_email_verification_sent")) user = User.objects.all()[0] self.assertEqual(user_email(user), "unverified@example.org") self.assertTrue( EmailAddress.objects.filter( user=user, email="unverified@example.com", verified=False, primary=False, ).exists() ) self.assertTrue( EmailAddress.objects.filter( user=user, email="unverified@example.org", verified=False, primary=True, ).exists() ) @override_settings( ACCOUNT_EMAIL_REQUIRED=True, ACCOUNT_EMAIL_VERIFICATION="mandatory", ACCOUNT_UNIQUE_EMAIL=True, ACCOUNT_USERNAME_REQUIRED=False, ACCOUNT_AUTHENTICATION_METHOD="email", SOCIALACCOUNT_AUTO_SIGNUP=False, ) def test_unique_email_validation_signup(self): session = self.client.session User = get_user_model() User.objects.create(email="me@example.com") sociallogin = SocialLogin( user=User(email="me@example.com"), account=SocialAccount(provider="google"), email_addresses=[ EmailAddress(email="me@example.com", verified=True, primary=True) ], ) session["socialaccount_sociallogin"] = sociallogin.serialize() session.save() resp = self.client.get(reverse("socialaccount_signup")) form = resp.context["form"] self.assertEqual(form["email"].value(), "me@example.com") resp = self.client.post( reverse("socialaccount_signup"), data={"email": "me@example.com"} ) self.assertFormError( resp, "form", "email", "An account already exists with this e-mail address." " Please sign in to that account first, then connect" " your Google account.", ) @override_settings( ACCOUNT_EMAIL_REQUIRED=True, ACCOUNT_EMAIL_VERIFICATION="mandatory", ACCOUNT_UNIQUE_EMAIL=True, ACCOUNT_USERNAME_REQUIRED=True, ACCOUNT_AUTHENTICATION_METHOD="email", SOCIALACCOUNT_AUTO_SIGNUP=False, ) def test_social_account_taken_at_signup(self): """ Test scenario for when the user signs up with a social account and uses email address in that social account. But upon seeing the verification screen, they realize that email address is somehow unusable for them, and so backs up and enters a different email address (and is forced to choose a new username) while providing the same social account token which is owned by their first attempt. """ session = self.client.session User = get_user_model() sociallogin = SocialLogin( user=User(email="me1@example.com"), account=SocialAccount(provider="facebook"), ) session["socialaccount_sociallogin"] = sociallogin.serialize() session.save() resp = self.client.get(reverse("socialaccount_signup")) form = resp.context["form"] self.assertEqual(form["email"].value(), "me1@example.com") resp = self.client.post( reverse("socialaccount_signup"), data={"username": "me1", "email": "me1@example.com"}, ) self.assertEqual(resp.status_code, 302) self.assertEqual(User.objects.count(), 1) self.assertEqual(SocialAccount.objects.count(), 1) resp = self.client.get(reverse("socialaccount_signup")) self.assertRedirects(resp, reverse("account_login")) django-allauth-0.47.0/allauth/socialaccount/urls.py000066400000000000000000000006361415442050100223150ustar00rootroot00000000000000from django.urls import path from . import views urlpatterns = [ path( "login/cancelled/", views.login_cancelled, name="socialaccount_login_cancelled", ), path("login/error/", views.login_error, name="socialaccount_login_error"), path("signup/", views.signup, name="socialaccount_signup"), path("connections/", views.connections, name="socialaccount_connections"), ] django-allauth-0.47.0/allauth/socialaccount/views.py000066400000000000000000000101121415442050100224530ustar00rootroot00000000000000from django.contrib import messages from django.contrib.auth.decorators import login_required from django.contrib.sites.shortcuts import get_current_site from django.http import HttpResponseRedirect from django.urls import reverse, reverse_lazy from django.views.generic.base import TemplateView from django.views.generic.edit import FormView from ..account import app_settings as account_settings from ..account.adapter import get_adapter as get_account_adapter from ..account.views import ( AjaxCapableProcessFormViewMixin, CloseableSignupMixin, RedirectAuthenticatedUserMixin, ) from ..utils import get_form_class from . import app_settings, helpers from .adapter import get_adapter from .forms import DisconnectForm, SignupForm from .models import SocialAccount, SocialLogin class SignupView( RedirectAuthenticatedUserMixin, CloseableSignupMixin, AjaxCapableProcessFormViewMixin, FormView, ): form_class = SignupForm template_name = "socialaccount/signup." + account_settings.TEMPLATE_EXTENSION def get_form_class(self): return get_form_class(app_settings.FORMS, "signup", self.form_class) def dispatch(self, request, *args, **kwargs): self.sociallogin = None data = request.session.get("socialaccount_sociallogin") if data: self.sociallogin = SocialLogin.deserialize(data) if not self.sociallogin: return HttpResponseRedirect(reverse("account_login")) return super(SignupView, self).dispatch(request, *args, **kwargs) def is_open(self): return get_adapter(self.request).is_open_for_signup( self.request, self.sociallogin ) def get_form_kwargs(self): ret = super(SignupView, self).get_form_kwargs() ret["sociallogin"] = self.sociallogin return ret def form_valid(self, form): self.request.session.pop("socialaccount_sociallogin", None) form.save(self.request) return helpers.complete_social_signup(self.request, self.sociallogin) def get_context_data(self, **kwargs): ret = super(SignupView, self).get_context_data(**kwargs) ret.update( dict( site=get_current_site(self.request), account=self.sociallogin.account, ) ) return ret def get_authenticated_redirect_url(self): return reverse(connections) signup = SignupView.as_view() class LoginCancelledView(TemplateView): template_name = ( "socialaccount/login_cancelled." + account_settings.TEMPLATE_EXTENSION ) login_cancelled = LoginCancelledView.as_view() class LoginErrorView(TemplateView): template_name = ( "socialaccount/authentication_error." + account_settings.TEMPLATE_EXTENSION ) login_error = LoginErrorView.as_view() class ConnectionsView(AjaxCapableProcessFormViewMixin, FormView): template_name = "socialaccount/connections." + account_settings.TEMPLATE_EXTENSION form_class = DisconnectForm success_url = reverse_lazy("socialaccount_connections") def get_form_class(self): return get_form_class(app_settings.FORMS, "disconnect", self.form_class) def get_form_kwargs(self): kwargs = super(ConnectionsView, self).get_form_kwargs() kwargs["request"] = self.request return kwargs def form_valid(self, form): get_account_adapter().add_message( self.request, messages.INFO, "socialaccount/messages/account_disconnected.txt", ) form.save() return super(ConnectionsView, self).form_valid(form) def get_ajax_data(self): account_data = [] for account in SocialAccount.objects.filter(user=self.request.user): provider_account = account.get_provider_account() account_data.append( { "id": account.pk, "provider": account.provider, "name": provider_account.to_str(), } ) return {"socialaccounts": account_data} connections = login_required(ConnectionsView.as_view()) django-allauth-0.47.0/allauth/templates/000077500000000000000000000000001415442050100201205ustar00rootroot00000000000000django-allauth-0.47.0/allauth/templates/account/000077500000000000000000000000001415442050100215545ustar00rootroot00000000000000django-allauth-0.47.0/allauth/templates/account/account_inactive.html000066400000000000000000000003631415442050100257620ustar00rootroot00000000000000{% extends "account/base.html" %} {% load i18n %} {% block head_title %}{% trans "Account Inactive" %}{% endblock %} {% block content %}

{% trans "Account Inactive" %}

{% trans "This account is inactive." %}

{% endblock %} django-allauth-0.47.0/allauth/templates/account/base.html000066400000000000000000000016351415442050100233610ustar00rootroot00000000000000 {% block head_title %}{% endblock %} {% block extra_head %} {% endblock %} {% block body %} {% if messages %}
Messages:
    {% for message in messages %}
  • {{message}}
  • {% endfor %}
{% endif %}
Menu:
{% block content %} {% endblock %} {% endblock %} {% block extra_body %} {% endblock %} django-allauth-0.47.0/allauth/templates/account/email.html000066400000000000000000000047321415442050100235370ustar00rootroot00000000000000{% extends "account/base.html" %} {% load i18n %} {% block head_title %}{% trans "E-mail Addresses" %}{% endblock %} {% block content %}

{% trans "E-mail Addresses" %}

{% if user.emailaddress_set.all %}

{% trans 'The following e-mail addresses are associated with your account:' %}

{% else %}

{% trans 'Warning:'%} {% trans "You currently do not have any e-mail address set up. You should really add an e-mail address so you can receive notifications, reset your password, etc." %}

{% endif %} {% if can_add_email %}

{% trans "Add E-mail Address" %}

{% csrf_token %} {{ form.as_p }}
{% endif %} {% endblock %} {% block extra_body %} {% endblock %} django-allauth-0.47.0/allauth/templates/account/email/000077500000000000000000000000001415442050100226435ustar00rootroot00000000000000django-allauth-0.47.0/allauth/templates/account/email/base_message.txt000066400000000000000000000005261415442050100260250ustar00rootroot00000000000000{% load i18n %}{% autoescape off %}{% blocktrans with site_name=current_site.name %}Hello from {{ site_name }}!{% endblocktrans %} {% block content %}{% endblock %} {% blocktrans with site_name=current_site.name site_domain=current_site.domain %}Thank you for using {{ site_name }}! {{ site_domain }}{% endblocktrans %} {% endautoescape %} django-allauth-0.47.0/allauth/templates/account/email/email_confirmation_message.txt000066400000000000000000000007441415442050100307540ustar00rootroot00000000000000{% extends "account/email/base_message.txt" %} {% load account %} {% load i18n %} {% block content %}{% autoescape off %}{% user_display user as user_display %}{% blocktrans with site_name=current_site.name site_domain=current_site.domain %}You're receiving this e-mail because user {{ user_display }} has given your e-mail address to register an account on {{ site_domain }}. To confirm this is correct, go to {{ activate_url }}{% endblocktrans %}{% endautoescape %}{% endblock %} django-allauth-0.47.0/allauth/templates/account/email/email_confirmation_signup_message.txt000066400000000000000000000000751415442050100323360ustar00rootroot00000000000000{% include "account/email/email_confirmation_message.txt" %} django-allauth-0.47.0/allauth/templates/account/email/email_confirmation_signup_subject.txt000066400000000000000000000000751415442050100323510ustar00rootroot00000000000000{% include "account/email/email_confirmation_subject.txt" %} django-allauth-0.47.0/allauth/templates/account/email/email_confirmation_subject.txt000066400000000000000000000001771415442050100307670ustar00rootroot00000000000000{% load i18n %} {% autoescape off %} {% blocktrans %}Please Confirm Your E-mail Address{% endblocktrans %} {% endautoescape %} django-allauth-0.47.0/allauth/templates/account/email/password_reset_key_message.txt000066400000000000000000000010221415442050100310170ustar00rootroot00000000000000{% extends "account/email/base_message.txt" %} {% load i18n %} {% block content %}{% autoescape off %}{% blocktrans %}You're receiving this e-mail because you or someone else has requested a password for your user account. It can be safely ignored if you did not request a password reset. Click the link below to reset your password.{% endblocktrans %} {{ password_reset_url }}{% if username %} {% blocktrans %}In case you forgot, your username is {{ username }}.{% endblocktrans %}{% endif %}{% endautoescape %}{% endblock %} django-allauth-0.47.0/allauth/templates/account/email/password_reset_key_subject.txt000066400000000000000000000001621415442050100310360ustar00rootroot00000000000000{% load i18n %} {% autoescape off %} {% blocktrans %}Password Reset E-mail{% endblocktrans %} {% endautoescape %} django-allauth-0.47.0/allauth/templates/account/email_confirm.html000066400000000000000000000016371415442050100252550ustar00rootroot00000000000000{% extends "account/base.html" %} {% load i18n %} {% load account %} {% block head_title %}{% trans "Confirm E-mail Address" %}{% endblock %} {% block content %}

{% trans "Confirm E-mail Address" %}

{% if confirmation %} {% user_display confirmation.email_address.user as user_display %}

{% blocktrans with confirmation.email_address.email as email %}Please confirm that {{ email }} is an e-mail address for user {{ user_display }}.{% endblocktrans %}

{% csrf_token %}
{% else %} {% url 'account_email' as email_url %}

{% blocktrans %}This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request.{% endblocktrans %}

{% endif %} {% endblock %} django-allauth-0.47.0/allauth/templates/account/login.html000066400000000000000000000026011415442050100235510ustar00rootroot00000000000000{% extends "account/base.html" %} {% load i18n %} {% load account socialaccount %} {% block head_title %}{% trans "Sign In" %}{% endblock %} {% block content %}

{% trans "Sign In" %}

{% get_providers as socialaccount_providers %} {% if socialaccount_providers %}

{% blocktrans with site.name as site_name %}Please sign in with one of your existing third party accounts. Or, sign up for a {{ site_name }} account and sign in below:{% endblocktrans %}

    {% include "socialaccount/snippets/provider_list.html" with process="login" %}
{% include "socialaccount/snippets/login_extra.html" %} {% else %}

{% blocktrans %}If you have not created an account yet, then please sign up first.{% endblocktrans %}

{% endif %} {% endblock %} django-allauth-0.47.0/allauth/templates/account/logout.html000066400000000000000000000010061415442050100237500ustar00rootroot00000000000000{% extends "account/base.html" %} {% load i18n %} {% block head_title %}{% trans "Sign Out" %}{% endblock %} {% block content %}

{% trans "Sign Out" %}

{% trans 'Are you sure you want to sign out?' %}

{% csrf_token %} {% if redirect_field_value %} {% endif %}
{% endblock %} django-allauth-0.47.0/allauth/templates/account/messages/000077500000000000000000000000001415442050100233635ustar00rootroot00000000000000django-allauth-0.47.0/allauth/templates/account/messages/cannot_delete_primary_email.txt000066400000000000000000000001561415442050100316440ustar00rootroot00000000000000{% load i18n %} {% blocktrans %}You cannot remove your primary e-mail address ({{email}}).{% endblocktrans %} django-allauth-0.47.0/allauth/templates/account/messages/email_confirmation_sent.txt000066400000000000000000000001321415442050100310100ustar00rootroot00000000000000{% load i18n %} {% blocktrans %}Confirmation e-mail sent to {{email}}.{% endblocktrans %} django-allauth-0.47.0/allauth/templates/account/messages/email_confirmed.txt000066400000000000000000000001211415442050100272330ustar00rootroot00000000000000{% load i18n %} {% blocktrans %}You have confirmed {{email}}.{% endblocktrans %} django-allauth-0.47.0/allauth/templates/account/messages/email_deleted.txt000066400000000000000000000001251415442050100266770ustar00rootroot00000000000000{% load i18n %} {% blocktrans %}Removed e-mail address {{email}}.{% endblocktrans %} django-allauth-0.47.0/allauth/templates/account/messages/logged_in.txt000066400000000000000000000002121415442050100260460ustar00rootroot00000000000000{% load account %} {% load i18n %} {% user_display user as name %} {% blocktrans %}Successfully signed in as {{name}}.{% endblocktrans %} django-allauth-0.47.0/allauth/templates/account/messages/logged_out.txt000066400000000000000000000001101415442050100262440ustar00rootroot00000000000000{% load i18n %} {% blocktrans %}You have signed out.{% endblocktrans %} django-allauth-0.47.0/allauth/templates/account/messages/password_changed.txt000066400000000000000000000001221415442050100274320ustar00rootroot00000000000000{% load i18n %} {% blocktrans %}Password successfully changed.{% endblocktrans %} django-allauth-0.47.0/allauth/templates/account/messages/password_set.txt000066400000000000000000000001161415442050100266370ustar00rootroot00000000000000{% load i18n %} {% blocktrans %}Password successfully set.{% endblocktrans %} django-allauth-0.47.0/allauth/templates/account/messages/primary_email_set.txt000066400000000000000000000001171415442050100276300ustar00rootroot00000000000000{% load i18n %} {% blocktrans %}Primary e-mail address set.{% endblocktrans %} django-allauth-0.47.0/allauth/templates/account/messages/unverified_primary_email.txt000066400000000000000000000001411415442050100311720ustar00rootroot00000000000000{% load i18n %} {% blocktrans %}Your primary e-mail address must be verified.{% endblocktrans %} django-allauth-0.47.0/allauth/templates/account/password_change.html000066400000000000000000000010141415442050100256050ustar00rootroot00000000000000{% extends "account/base.html" %} {% load i18n %} {% block head_title %}{% trans "Change Password" %}{% endblock %} {% block content %}

{% trans "Change Password" %}

{% csrf_token %} {{ form.as_p }} {% trans "Forgot Password?" %}
{% endblock %} django-allauth-0.47.0/allauth/templates/account/password_reset.html000066400000000000000000000014451415442050100255120ustar00rootroot00000000000000{% extends "account/base.html" %} {% load i18n %} {% load account %} {% block head_title %}{% trans "Password Reset" %}{% endblock %} {% block content %}

{% trans "Password Reset" %}

{% if user.is_authenticated %} {% include "account/snippets/already_logged_in.html" %} {% endif %}

{% trans "Forgotten your password? Enter your e-mail address below, and we'll send you an e-mail allowing you to reset it." %}

{% csrf_token %} {{ form.as_p }}

{% blocktrans %}Please contact us if you have any trouble resetting your password.{% endblocktrans %}

{% endblock %} django-allauth-0.47.0/allauth/templates/account/password_reset_done.html000066400000000000000000000007321415442050100265150ustar00rootroot00000000000000{% extends "account/base.html" %} {% load i18n %} {% load account %} {% block head_title %}{% trans "Password Reset" %}{% endblock %} {% block content %}

{% trans "Password Reset" %}

{% if user.is_authenticated %} {% include "account/snippets/already_logged_in.html" %} {% endif %}

{% blocktrans %}We have sent you an e-mail. Please contact us if you do not receive it within a few minutes.{% endblocktrans %}

{% endblock %} django-allauth-0.47.0/allauth/templates/account/password_reset_from_key.html000066400000000000000000000016561415442050100274110ustar00rootroot00000000000000{% extends "account/base.html" %} {% load i18n %} {% block head_title %}{% trans "Change Password" %}{% endblock %} {% block content %}

{% if token_fail %}{% trans "Bad Token" %}{% else %}{% trans "Change Password" %}{% endif %}

{% if token_fail %} {% url 'account_reset_password' as passwd_reset_url %}

{% blocktrans %}The password reset link was invalid, possibly because it has already been used. Please request a new password reset.{% endblocktrans %}

{% else %} {% if form %}
{% csrf_token %} {{ form.as_p }}
{% else %}

{% trans 'Your password is now changed.' %}

{% endif %} {% endif %} {% endblock %} django-allauth-0.47.0/allauth/templates/account/password_reset_from_key_done.html000066400000000000000000000003731415442050100304110ustar00rootroot00000000000000{% extends "account/base.html" %} {% load i18n %} {% block head_title %}{% trans "Change Password" %}{% endblock %} {% block content %}

{% trans "Change Password" %}

{% trans 'Your password is now changed.' %}

{% endblock %} django-allauth-0.47.0/allauth/templates/account/password_set.html000066400000000000000000000006451415442050100251640ustar00rootroot00000000000000{% extends "account/base.html" %} {% load i18n %} {% block head_title %}{% trans "Set Password" %}{% endblock %} {% block content %}

{% trans "Set Password" %}

{% csrf_token %} {{ form.as_p }}
{% endblock %} django-allauth-0.47.0/allauth/templates/account/signup.html000066400000000000000000000011721415442050100237500ustar00rootroot00000000000000{% extends "account/base.html" %} {% load i18n %} {% block head_title %}{% trans "Signup" %}{% endblock %} {% block content %}

{% trans "Sign Up" %}

{% blocktrans %}Already have an account? Then please sign in.{% endblocktrans %}

{% endblock %} django-allauth-0.47.0/allauth/templates/account/signup_closed.html000066400000000000000000000004101415442050100252730ustar00rootroot00000000000000{% extends "account/base.html" %} {% load i18n %} {% block head_title %}{% trans "Sign Up Closed" %}{% endblock %} {% block content %}

{% trans "Sign Up Closed" %}

{% trans "We are sorry, but the sign up is currently closed." %}

{% endblock %} django-allauth-0.47.0/allauth/templates/account/snippets/000077500000000000000000000000001415442050100234215ustar00rootroot00000000000000django-allauth-0.47.0/allauth/templates/account/snippets/already_logged_in.html000066400000000000000000000003141415442050100277350ustar00rootroot00000000000000{% load i18n %} {% load account %} {% user_display user as user_display %}

{% trans "Note" %}: {% blocktrans %}you are already logged in as {{ user_display }}.{% endblocktrans %}

django-allauth-0.47.0/allauth/templates/account/verification_sent.html000066400000000000000000000006651415442050100261640ustar00rootroot00000000000000{% extends "account/base.html" %} {% load i18n %} {% block head_title %}{% trans "Verify Your E-mail Address" %}{% endblock %} {% block content %}

{% trans "Verify Your E-mail Address" %}

{% blocktrans %}We have sent an e-mail to you for verification. Follow the link provided to finalize the signup process. Please contact us if you do not receive it within a few minutes.{% endblocktrans %}

{% endblock %} django-allauth-0.47.0/allauth/templates/account/verified_email_required.html000066400000000000000000000014351415442050100273110ustar00rootroot00000000000000{% extends "account/base.html" %} {% load i18n %} {% block head_title %}{% trans "Verify Your E-mail Address" %}{% endblock %} {% block content %}

{% trans "Verify Your E-mail Address" %}

{% url 'account_email' as email_url %}

{% blocktrans %}This part of the site requires us to verify that you are who you claim to be. For this purpose, we require that you verify ownership of your e-mail address. {% endblocktrans %}

{% blocktrans %}We have sent an e-mail to you for verification. Please click on the link inside this e-mail. Please contact us if you do not receive it within a few minutes.{% endblocktrans %}

{% blocktrans %}Note: you can still change your e-mail address.{% endblocktrans %}

{% endblock %} django-allauth-0.47.0/allauth/templates/openid/000077500000000000000000000000001415442050100213765ustar00rootroot00000000000000django-allauth-0.47.0/allauth/templates/openid/base.html000066400000000000000000000000501415442050100231710ustar00rootroot00000000000000{% extends "socialaccount/base.html" %} django-allauth-0.47.0/allauth/templates/openid/login.html000066400000000000000000000005451415442050100234000ustar00rootroot00000000000000{% extends "openid/base.html" %} {% load i18n %} {% block head_title %}OpenID Sign In{% endblock %} {% block content %}

{% trans 'OpenID Sign In' %}

{% endblock %} django-allauth-0.47.0/allauth/templates/socialaccount/000077500000000000000000000000001415442050100227475ustar00rootroot00000000000000django-allauth-0.47.0/allauth/templates/socialaccount/authentication_error.html000066400000000000000000000005041415442050100300640ustar00rootroot00000000000000{% extends "socialaccount/base.html" %} {% load i18n %} {% block head_title %}{% trans "Social Network Login Failure" %}{% endblock %} {% block content %}

{% trans "Social Network Login Failure" %}

{% trans "An error occurred while attempting to login via your social network account." %}

{% endblock %} django-allauth-0.47.0/allauth/templates/socialaccount/base.html000066400000000000000000000000421415442050100245430ustar00rootroot00000000000000{% extends "account/base.html" %} django-allauth-0.47.0/allauth/templates/socialaccount/connections.html000066400000000000000000000026201415442050100261570ustar00rootroot00000000000000{% extends "socialaccount/base.html" %} {% load i18n %} {% block head_title %}{% trans "Account Connections" %}{% endblock %} {% block content %}

{% trans "Account Connections" %}

{% if form.accounts %}

{% blocktrans %}You can sign in to your account using any of the following third party accounts:{% endblocktrans %}

{% csrf_token %}
{% if form.non_field_errors %}
{{ form.non_field_errors }}
{% endif %} {% for base_account in form.accounts %} {% with base_account.get_provider_account as account %}
{% endwith %} {% endfor %}
{% else %}

{% trans 'You currently have no social network accounts connected to this account.' %}

{% endif %}

{% trans 'Add a 3rd Party Account' %}

    {% include "socialaccount/snippets/provider_list.html" with process="connect" %}
{% include "socialaccount/snippets/login_extra.html" %} {% endblock %} django-allauth-0.47.0/allauth/templates/socialaccount/login.html000066400000000000000000000013501415442050100247440ustar00rootroot00000000000000{% extends "socialaccount/base.html" %} {% load i18n %} {% block content %} {% if process == "connect" %}

{% blocktrans with provider.name as provider %}Connect {{ provider }}{% endblocktrans %}

{% blocktrans with provider.name as provider %}You are about to connect a new third party account from {{ provider }}.{% endblocktrans %}

{% else %}

{% blocktrans with provider.name as provider %}Sign In Via {{ provider }}{% endblocktrans %}

{% blocktrans with provider.name as provider %}You are about to sign in using a third party account from {{ provider }}.{% endblocktrans %}

{% endif %}
{% csrf_token %}
{% endblock %} django-allauth-0.47.0/allauth/templates/socialaccount/login_cancelled.html000066400000000000000000000006741415442050100267460ustar00rootroot00000000000000{% extends "socialaccount/base.html" %} {% load i18n %} {% block head_title %}{% trans "Login Cancelled" %}{% endblock %} {% block content %}

{% trans "Login Cancelled" %}

{% url 'account_login' as login_url %}

{% blocktrans %}You decided to cancel logging in to our site using one of your existing accounts. If this was a mistake, please proceed to sign in.{% endblocktrans %}

{% endblock %} django-allauth-0.47.0/allauth/templates/socialaccount/messages/000077500000000000000000000000001415442050100245565ustar00rootroot00000000000000django-allauth-0.47.0/allauth/templates/socialaccount/messages/account_connected.txt000066400000000000000000000001321415442050100307710ustar00rootroot00000000000000{% load i18n %} {% blocktrans %}The social account has been connected.{% endblocktrans %} django-allauth-0.47.0/allauth/templates/socialaccount/messages/account_connected_other.txt000066400000000000000000000001631415442050100321760ustar00rootroot00000000000000{% load i18n %} {% blocktrans %}The social account is already connected to a different account.{% endblocktrans %} django-allauth-0.47.0/allauth/templates/socialaccount/messages/account_connected_updated.txt000066400000000000000000000000751415442050100325050ustar00rootroot00000000000000{% extends "socialaccount/messages/account_connected.txt" %} django-allauth-0.47.0/allauth/templates/socialaccount/messages/account_disconnected.txt000066400000000000000000000001351415442050100314740ustar00rootroot00000000000000{% load i18n %} {% blocktrans %}The social account has been disconnected.{% endblocktrans %} django-allauth-0.47.0/allauth/templates/socialaccount/signup.html000066400000000000000000000014031415442050100251400ustar00rootroot00000000000000{% extends "socialaccount/base.html" %} {% load i18n %} {% block head_title %}{% trans "Signup" %}{% endblock %} {% block content %}

{% trans "Sign Up" %}

{% blocktrans with provider_name=account.get_provider.name site_name=site.name %}You are about to use your {{provider_name}} account to login to {{site_name}}. As a final step, please complete the following form:{% endblocktrans %}

{% endblock %} django-allauth-0.47.0/allauth/templates/socialaccount/snippets/000077500000000000000000000000001415442050100246145ustar00rootroot00000000000000django-allauth-0.47.0/allauth/templates/socialaccount/snippets/login_extra.html000066400000000000000000000000631415442050100300140ustar00rootroot00000000000000{% load socialaccount %} {% providers_media_js %} django-allauth-0.47.0/allauth/templates/socialaccount/snippets/provider_list.html000066400000000000000000000012271415442050100303710ustar00rootroot00000000000000{% load socialaccount %} {% get_providers as socialaccount_providers %} {% for provider in socialaccount_providers %} {% if provider.id == "openid" %} {% for brand in provider.get_brands %}
  • {{brand.name}}
  • {% endfor %} {% endif %}
  • {{provider.name}}
  • {% endfor %} django-allauth-0.47.0/allauth/templates/tests/000077500000000000000000000000001415442050100212625ustar00rootroot00000000000000django-allauth-0.47.0/allauth/templates/tests/test_403_csrf.html000066400000000000000000000001541415442050100245320ustar00rootroot00000000000000{% load socialaccount %} Sign In django-allauth-0.47.0/allauth/tests.py000066400000000000000000000147371415442050100176520ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals import json import requests from datetime import date, datetime import django from django.core.files.base import ContentFile from django.db import models from django.test import RequestFactory, TestCase from django.utils.http import base36_to_int, int_to_base36 from django.views import csrf from . import utils try: from unittest.mock import Mock, patch except ImportError: from mock import Mock, patch # noqa class MockedResponse(object): def __init__(self, status_code, content, headers=None): if headers is None: headers = {} self.status_code = status_code self.content = content.encode("utf8") self.headers = headers def json(self): return json.loads(self.text) def raise_for_status(self): pass @property def text(self): return self.content.decode("utf8") class mocked_response: def __init__(self, *responses): self.responses = list(responses) def __enter__(self): self.orig_get = requests.get self.orig_post = requests.post self.orig_request = requests.request def mockable_request(f): def new_f(*args, **kwargs): if self.responses: return self.responses.pop(0) return f(*args, **kwargs) return new_f requests.get = mockable_request(requests.get) requests.post = mockable_request(requests.post) requests.request = mockable_request(requests.request) def __exit__(self, type, value, traceback): requests.get = self.orig_get requests.post = self.orig_post requests.request = self.orig_request class BasicTests(TestCase): def setUp(self): self.factory = RequestFactory() def test_generate_unique_username(self): examples = [ ("a.b-c@example.com", "a.b-c"), ("Üsêrnamê", "username"), ("User Name", "user_name"), ("", "user"), ] for input, username in examples: self.assertEqual(utils.generate_unique_username([input]), username) def test_email_validation(self): s = "this.email.address.is.a.bit.too.long.but.should.still.validate@example.com" # noqa self.assertEqual(s, utils.valid_email_or_none(s)) def test_serializer(self): class SomeValue: pass some_value = SomeValue() class SomeField(models.Field): def get_prep_value(self, value): return "somevalue" if django.VERSION < (3, 0): def from_db_value(self, value, expression, connection, context): return some_value else: def from_db_value(self, value, expression, connection): return some_value class SomeModel(models.Model): dt = models.DateTimeField() t = models.TimeField() d = models.DateField() img1 = models.ImageField() img2 = models.ImageField() img3 = models.ImageField() something = SomeField() def method(self): pass instance = SomeModel( dt=datetime.now(), d=date.today(), something=some_value, t=datetime.now().time(), ) content_file = ContentFile(b"%PDF") content_file.name = "foo.pdf" instance.img1 = content_file instance.img2 = "foo.png" # make sure serializer doesn't fail if a method is attached to # the instance instance.method = method instance.nonfield = "hello" data = utils.serialize_instance(instance) instance2 = utils.deserialize_instance(SomeModel, data) self.assertEqual(getattr(instance, "method", None), method) self.assertEqual(getattr(instance2, "method", None), None) self.assertEqual(instance2.something, some_value) self.assertEqual(instance2.img1.name, "foo.pdf") self.assertEqual(instance2.img2.name, "foo.png") self.assertEqual(instance2.img3.name, "") self.assertEqual(instance.nonfield, instance2.nonfield) self.assertEqual(instance.d, instance2.d) self.assertEqual(instance.dt.date(), instance2.dt.date()) for t1, t2 in [ (instance.t, instance2.t), (instance.dt.time(), instance2.dt.time()), ]: self.assertEqual(t1.hour, t2.hour) self.assertEqual(t1.minute, t2.minute) self.assertEqual(t1.second, t2.second) # AssertionError: datetime.time(10, 6, 28, 705776) # != datetime.time(10, 6, 28, 705000) self.assertEqual(int(t1.microsecond / 1000), int(t2.microsecond / 1000)) def test_serializer_binary_field(self): class SomeBinaryModel(models.Model): bb = models.BinaryField() bb_empty = models.BinaryField() instance = SomeBinaryModel(bb=b"some binary data") serialized = utils.serialize_instance(instance) deserialized = utils.deserialize_instance(SomeBinaryModel, serialized) self.assertEqual(serialized["bb"], "c29tZSBiaW5hcnkgZGF0YQ==") self.assertEqual(serialized["bb_empty"], "") self.assertEqual(deserialized.bb, b"some binary data") self.assertEqual(deserialized.bb_empty, b"") def test_build_absolute_uri(self): self.assertEqual( utils.build_absolute_uri(None, "/foo"), "http://example.com/foo" ) self.assertEqual( utils.build_absolute_uri(None, "/foo", protocol="ftp"), "ftp://example.com/foo", ) self.assertEqual( utils.build_absolute_uri(None, "http://foo.com/bar"), "http://foo.com/bar", ) def test_int_to_base36(self): n = 55798679658823689999 b36 = "brxk553wvxbf3" assert int_to_base36(n) == b36 assert base36_to_int(b36) == n def test_templatetag_with_csrf_failure(self): # Generate a fictitious GET request request = self.factory.get("/tests/test_403_csrf.html") # Simulate a CSRF failure by calling the View directly # This template is using the `provider_login_url` templatetag response = csrf.csrf_failure(request, template_name="tests/test_403_csrf.html") # Ensure that CSRF failures with this template # tag succeed with the expected 403 response self.assertEqual(response.status_code, 403) django-allauth-0.47.0/allauth/urls.py000066400000000000000000000013601415442050100174610ustar00rootroot00000000000000from importlib import import_module from django.urls import include, path from allauth.socialaccount import providers from . import app_settings urlpatterns = [path("", include("allauth.account.urls"))] if app_settings.SOCIALACCOUNT_ENABLED: urlpatterns += [path("social/", include("allauth.socialaccount.urls"))] # Provider urlpatterns, as separate attribute (for reusability). provider_urlpatterns = [] for provider in providers.registry.get_list(): try: prov_mod = import_module(provider.get_package() + ".urls") except ImportError: continue prov_urlpatterns = getattr(prov_mod, "urlpatterns", None) if prov_urlpatterns: provider_urlpatterns += prov_urlpatterns urlpatterns += provider_urlpatterns django-allauth-0.47.0/allauth/utils.py000066400000000000000000000256131415442050100176430ustar00rootroot00000000000000import base64 import importlib import json import random import re import string import unicodedata from collections import OrderedDict from urllib.parse import urlsplit import django from django.contrib.auth import get_user_model from django.contrib.sites.models import Site from django.core.exceptions import FieldDoesNotExist, ImproperlyConfigured from django.core.serializers.json import DjangoJSONEncoder from django.core.validators import ValidationError, validate_email from django.db.models import FileField from django.db.models.fields import ( BinaryField, DateField, DateTimeField, EmailField, TimeField, ) from django.utils import dateparse from django.utils.encoding import force_bytes, force_str # Magic number 7: if you run into collisions with this number, then you are # of big enough scale to start investing in a decent user model... MAX_USERNAME_SUFFIX_LENGTH = 7 USERNAME_SUFFIX_CHARS = [string.digits] * 4 + [string.ascii_letters] * ( MAX_USERNAME_SUFFIX_LENGTH - 4 ) def _generate_unique_username_base(txts, regex=None): from .account.adapter import get_adapter adapter = get_adapter() username = None regex = regex or r"[^\w\s@+.-]" for txt in txts: if not txt: continue username = unicodedata.normalize("NFKD", force_str(txt)) username = username.encode("ascii", "ignore").decode("ascii") username = force_str(re.sub(regex, "", username).lower()) # Django allows for '@' in usernames in order to accomodate for # project wanting to use e-mail for username. In allauth we don't # use this, we already have a proper place for putting e-mail # addresses (EmailAddress), so let's not use the full e-mail # address and only take the part leading up to the '@'. username = username.split("@")[0] username = username.strip() username = re.sub(r"\s+", "_", username) # Finally, validating base username without database lookups etc. try: username = adapter.clean_username(username, shallow=True) break except ValidationError: pass return username or "user" def get_username_max_length(): from .account.app_settings import USER_MODEL_USERNAME_FIELD if USER_MODEL_USERNAME_FIELD is not None: User = get_user_model() max_length = User._meta.get_field(USER_MODEL_USERNAME_FIELD).max_length else: max_length = 0 return max_length def generate_username_candidate(basename, suffix_length): max_length = get_username_max_length() suffix = "".join( random.choice(USERNAME_SUFFIX_CHARS[i]) for i in range(suffix_length) ) return basename[0 : max_length - len(suffix)] + suffix def generate_username_candidates(basename): from .account.app_settings import USERNAME_MIN_LENGTH if len(basename) >= USERNAME_MIN_LENGTH: ret = [basename] else: ret = [] min_suffix_length = max(1, USERNAME_MIN_LENGTH - len(basename)) max_suffix_length = min(get_username_max_length(), MAX_USERNAME_SUFFIX_LENGTH) for suffix_length in range(min_suffix_length, max_suffix_length): ret.append(generate_username_candidate(basename, suffix_length)) return ret def generate_unique_username(txts, regex=None): from allauth.account.utils import filter_users_by_username from .account.adapter import get_adapter from .account.app_settings import USER_MODEL_USERNAME_FIELD adapter = get_adapter() basename = _generate_unique_username_base(txts, regex) candidates = generate_username_candidates(basename) existing_usernames = filter_users_by_username(*candidates).values_list( USER_MODEL_USERNAME_FIELD, flat=True ) existing_usernames = set([n.lower() for n in existing_usernames]) for candidate in candidates: if candidate.lower() not in existing_usernames: try: return adapter.clean_username(candidate, shallow=True) except ValidationError: pass # This really should not happen raise NotImplementedError("Unable to find a unique username") def valid_email_or_none(email): ret = None try: if email: validate_email(email) if len(email) <= EmailField().max_length: ret = email except ValidationError: pass return ret def email_address_exists(email, exclude_user=None): from .account import app_settings as account_settings from .account.models import EmailAddress emailaddresses = EmailAddress.objects if exclude_user: emailaddresses = emailaddresses.exclude(user=exclude_user) ret = emailaddresses.filter(email__iexact=email).exists() if not ret: email_field = account_settings.USER_MODEL_EMAIL_FIELD if email_field: users = get_user_model().objects if exclude_user: users = users.exclude(pk=exclude_user.pk) ret = users.filter(**{email_field + "__iexact": email}).exists() return ret def import_attribute(path): assert isinstance(path, str) pkg, attr = path.rsplit(".", 1) ret = getattr(importlib.import_module(pkg), attr) return ret def import_callable(path_or_callable): if not hasattr(path_or_callable, "__call__"): ret = import_attribute(path_or_callable) else: ret = path_or_callable return ret SERIALIZED_DB_FIELD_PREFIX = "_db_" def serialize_instance(instance): """ Since Django 1.6 items added to the session are no longer pickled, but JSON encoded by default. We are storing partially complete models in the session (user, account, token, ...). We cannot use standard Django serialization, as these are models are not "complete" yet. Serialization will start complaining about missing relations et al. """ data = {} for k, v in instance.__dict__.items(): if k.startswith("_") or callable(v): continue try: field = instance._meta.get_field(k) if isinstance(field, BinaryField): v = force_str(base64.b64encode(v)) elif isinstance(field, FileField): if v and not isinstance(v, str): v = v.name # Check if the field is serializable. If not, we'll fall back # to serializing the DB values which should cover most use cases. try: json.dumps(v, cls=DjangoJSONEncoder) except TypeError: v = field.get_prep_value(v) k = SERIALIZED_DB_FIELD_PREFIX + k except FieldDoesNotExist: pass data[k] = v return json.loads(json.dumps(data, cls=DjangoJSONEncoder)) def deserialize_instance(model, data): ret = model() for k, v in data.items(): is_db_value = False if k.startswith(SERIALIZED_DB_FIELD_PREFIX): k = k[len(SERIALIZED_DB_FIELD_PREFIX) :] is_db_value = True if v is not None: try: f = model._meta.get_field(k) if isinstance(f, DateTimeField): v = dateparse.parse_datetime(v) elif isinstance(f, TimeField): v = dateparse.parse_time(v) elif isinstance(f, DateField): v = dateparse.parse_date(v) elif isinstance(f, BinaryField): v = force_bytes(base64.b64decode(force_bytes(v))) elif is_db_value: try: # This is quite an ugly hack, but will cover most # use cases... # The signature of `from_db_value` changed in Django 3 # https://docs.djangoproject.com/en/3.0/releases/3.0/#features-removed-in-3-0 if django.VERSION < (3, 0): v = f.from_db_value(v, None, None, None) else: v = f.from_db_value(v, None, None) except Exception: raise ImproperlyConfigured( "Unable to auto serialize field '{}', custom" " serialization override required".format(k) ) except FieldDoesNotExist: pass setattr(ret, k, v) return ret def set_form_field_order(form, field_order): """ This function is a verbatim copy of django.forms.Form.order_fields() to support field ordering below Django 1.9. field_order is a list of field names specifying the order. Append fields not included in the list in the default order for backward compatibility with subclasses not overriding field_order. If field_order is None, keep all fields in the order defined in the class. Ignore unknown fields in field_order to allow disabling fields in form subclasses without redefining ordering. """ if field_order is None: return fields = OrderedDict() for key in field_order: try: fields[key] = form.fields.pop(key) except KeyError: # ignore unknown fields pass fields.update(form.fields) # add remaining fields in original order form.fields = fields def build_absolute_uri(request, location, protocol=None): """request.build_absolute_uri() helper Like request.build_absolute_uri, but gracefully handling the case where request is None. """ from .account import app_settings as account_settings if request is None: site = Site.objects.get_current() bits = urlsplit(location) if not (bits.scheme and bits.netloc): uri = "{proto}://{domain}{url}".format( proto=account_settings.DEFAULT_HTTP_PROTOCOL, domain=site.domain, url=location, ) else: uri = location else: uri = request.build_absolute_uri(location) # NOTE: We only force a protocol if we are instructed to do so # (via the `protocol` parameter, or, if the default is set to # HTTPS. The latter keeps compatibility with the debatable use # case of running your site under both HTTP and HTTPS, where one # would want to make sure HTTPS links end up in password reset # mails even while they were initiated on an HTTP password reset # form. if not protocol and account_settings.DEFAULT_HTTP_PROTOCOL == "https": protocol = account_settings.DEFAULT_HTTP_PROTOCOL # (end NOTE) if protocol: uri = protocol + ":" + uri.partition(":")[2] return uri def get_form_class(forms, form_id, default_form): form_class = forms.get(form_id, default_form) if isinstance(form_class, str): form_class = import_attribute(form_class) return form_class def get_request_param(request, param, default=None): if request is None: return default return request.POST.get(param) or request.GET.get(param, default) django-allauth-0.47.0/docs/000077500000000000000000000000001415442050100154205ustar00rootroot00000000000000django-allauth-0.47.0/docs/Makefile000066400000000000000000000127341415442050100170670ustar00rootroot00000000000000# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = _build # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . # the i18n builder cannot share the environment and doctrees with the others I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " singlehtml to make a single large HTML file" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " devhelp to make HTML files and a Devhelp project" @echo " epub to make an epub" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " latexpdf to make LaTeX files and run them through pdflatex" @echo " text to make text files" @echo " man to make manual pages" @echo " texinfo to make Texinfo files" @echo " info to make Texinfo files and run them through makeinfo" @echo " gettext to make PO message catalogs" @echo " changes to make an overview of all changed/added/deprecated items" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" clean: -rm -rf $(BUILDDIR)/* html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." singlehtml: $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml @echo @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/django-allauth.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/django-allauth.qhc" devhelp: $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp @echo @echo "Build finished." @echo "To view the help file:" @echo "# mkdir -p $$HOME/.local/share/devhelp/django-allauth" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/django-allauth" @echo "# devhelp" epub: $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub @echo @echo "Build finished. The epub file is in $(BUILDDIR)/epub." latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make' in that directory to run these through (pdf)latex" \ "(use \`make latexpdf' here to do that automatically)." latexpdf: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through pdflatex..." $(MAKE) -C $(BUILDDIR)/latex all-pdf @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." text: $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text @echo @echo "Build finished. The text files are in $(BUILDDIR)/text." man: $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man @echo @echo "Build finished. The manual pages are in $(BUILDDIR)/man." texinfo: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." @echo "Run \`make' in that directory to run these through makeinfo" \ "(use \`make info' here to do that automatically)." info: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo "Running Texinfo files through makeinfo..." make -C $(BUILDDIR)/texinfo info @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." gettext: $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale @echo @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." django-allauth-0.47.0/docs/advanced.rst000066400000000000000000000244641415442050100177310ustar00rootroot00000000000000Advanced Usage ============== HTTPS ----- This app currently provides no functionality for enforcing views to be HTTPS only, or switching from HTTP to HTTPS (and back) on demand. There are third party packages aimed at providing precisely this, so please use these. What is provided is the following: - The protocol to be used for generating links (e.g. password forgotten) for e-mails is configurable by means of the ``ACCOUNT_DEFAULT_HTTP_PROTOCOL`` setting. - Automatically switching to HTTPS is built-in for OAuth providers that require this (e.g. Amazon). However, remembering the original protocol before the switch and switching back after the login is not provided. Custom User Models ------------------ If you use a custom user model you need to specify what field represents the ``username``, if any. Here, ``username`` really refers to the field representing the nickname that the user uses to login, and not to some unique identifier (possibly including an e-mail address) as is the case for Django's ``AbstractBaseUser.USERNAME_FIELD``. Therefore, if your custom user model does not have a ``username`` field (again, not to be mistaken with an e-mail address or user id), you will need to set ``ACCOUNT_USER_MODEL_USERNAME_FIELD`` to ``None``. This will disable username related functionality in ``allauth``. Remember to also set ``ACCOUNT_USERNAME_REQUIRED`` to ``False``. Similarly, you will need to set ``ACCOUNT_USER_MODEL_EMAIL_FIELD`` to ``None`` or to the proper field (if other than ``email``). For example, if you want to use a custom user model that has ``email`` as the identifying field, and you don't want to collect usernames, you need the following in your settings.py:: ACCOUNT_USER_MODEL_USERNAME_FIELD = None ACCOUNT_EMAIL_REQUIRED = True ACCOUNT_USERNAME_REQUIRED = False ACCOUNT_AUTHENTICATION_METHOD = 'email' Creating and Populating User instances -------------------------------------- The following adapter methods can be used to intervene in how User instances are created and populated with data - ``allauth.account.adapter.DefaultAccountAdapter``: - ``is_open_for_signup(self, request)``: The default function returns ``True``. You can override this method by returning ``False`` if you want to disable account signup. - ``new_user(self, request)``: Instantiates a new, empty ``User``. - ``save_user(self, request, user, form)``: Populates and saves the ``User`` instance using information provided in the signup form. - ``populate_username(self, request, user)``: Fills in a valid username, if required and missing. If the username is already present, then it is assumed to be valid (unique). - ``confirm_email(self, request, email_address)``: Marks the email address as confirmed and saves to the db. - ``generate_unique_username(self, txts, regex=None)``: Returns a unique username from the combination of strings present in txts iterable. A regex pattern can be passed to the method to make sure the generated username matches it. - ``allauth.socialaccount.adapter.DefaultSocialAccountAdapter``: - ``is_open_for_signup(self, request, socialaccount)``: The default function returns that is the same as ``ACCOUNT_ADAPTER`` in ``settings.py``. You can override this method by returning ``True``/``False`` if you want to enable/disable socialaccount signup. - ``new_user(self, request, sociallogin)``: Instantiates a new, empty ``User``. - ``save_user(self, request, sociallogin, form=None)``: Populates and saves the ``User`` instance (and related social login data). The signup form is not available in case of auto signup. - ``populate_user(self, request, sociallogin, data)``: Hook that can be used to further populate the user instance (``sociallogin.account.user``). Here, ``data`` is a dictionary of common user properties (``first_name``, ``last_name``, ``email``, ``username``, ``name``) that the provider already extracted for you. Invitations ----------- Invitation handling is not supported, and most likely will not be any time soon. An invitation app could cover anything ranging from invitations of new users, to invitations of existing users to participate in restricted parts of the site. All in all, the scope of invitation handling is large enough to warrant being addressed in an app of its own. Still, everything is in place to easily hook up any third party invitation app. The account adapter (``allauth.account.adapter.DefaultAccountAdapter``) offers the following methods: - ``is_open_for_signup(self, request)``. You can override this method to, for example, inspect the session to check if an invitation was accepted. - ``stash_verified_email(self, request, email)``. If an invitation was accepted by following a link in an email, then there is no need to send email verification mails after the signup is completed. Use this method to record the fact that an email address was verified. Sending Email -------------- Emails sent (e.g. in case of password forgotten or email confirmation) can be altered by providing your own templates. Templates are named as follows:: account/email/email_confirmation_signup_subject.txt account/email/email_confirmation_signup_message.txt account/email/email_confirmation_subject.txt account/email/email_confirmation_message.txt In case you want to include an HTML representation, add an HTML template as follows:: account/email/email_confirmation_signup_message.html account/email/email_confirmation_message.html The project does not contain any HTML email templates out of the box. When you do provide these yourself, note that both the text and HTML versions of the message are sent. If this does not suit your needs, you can hook up your own custom mechanism by overriding the ``send_mail`` method of the account adapter (``allauth.account.adapter.DefaultAccountAdapter``). Custom Redirects ---------------- If redirecting to statically configurable URLs (as specified in your project settings) is not flexible enough, then you can override the following adapter methods: - ``allauth.account.adapter.DefaultAccountAdapter``: - ``get_login_redirect_url(self, request)`` - ``get_logout_redirect_url(self, request)`` - ``get_email_confirmation_redirect_url(self, request)`` - ``get_signup_redirect_url(self, request)`` - ``allauth.socialaccount.adapter.DefaultSocialAccountAdapter``: - ``get_connect_redirect_url(self, request, socialaccount)`` For example, redirecting to ``/accounts//`` can be implemented as follows:: # project/settings.py: ACCOUNT_ADAPTER = 'project.users.adapter.MyAccountAdapter' # project/users/adapter.py: from django.conf import settings from allauth.account.adapter import DefaultAccountAdapter class MyAccountAdapter(DefaultAccountAdapter): def get_login_redirect_url(self, request): path = "/accounts/{username}/" return path.format(username=request.user.username) Messages -------- The Django messages framework (``django.contrib.messages``) is used if it is listed in ``settings.INSTALLED_APPS``. All messages (as in ``django.contrib.messages``) are configurable by overriding their respective template. If you want to disable a message, simply override the message template with a blank one. Admin ----- The Django admin site (``django.contrib.admin``) does not use Django allauth by default. Since Django admin provides a custom login view, it does not go through the normal Django allauth workflow. .. warning:: This limitation means that Django allauth features are not applied to the Django admin site: * ``ACCOUNT_LOGIN_ATTEMPTS_LIMIT`` and ``ACCOUNT_LOGIN_ATTEMPTS_TIMEOUT`` do not protect Django’s admin login from being brute forced. * Any other custom workflow that overrides the Django allauth adapter's login method will not be applied. An easy workaround for this is to require users to login before going to the Django admin site's login page (note that the following would need to be applied to every instance of ``AdminSite``): .. code-block:: python from django.contrib import admin from django.contrib.auth.decorators import login_required admin.site.login = login_required(admin.site.login) Customizing providers --------------------- When an existing provider doesn't quite meet your needs, you might find yourself needing to customize a provider. This can be achieved by subclassing an existing provider and making your changes there. Providers are defined as django applications, so typically customizing one will mean creating a django application in your project. This application will contain your customized urls.py, views.py and provider.py files. The behaviour that can be customized is beyond the scope of this documentation. .. warning:: In your ``provider.py`` file, you will need to expose the provider class by having a module level attribute called ``provider_classes`` with your custom classes in a list. This allows your custom provider to be registered properly on the basis of the ``INSTALLED_APPS`` setting. Be sure to use a custom id property on your provider class such that its default URLs do not clash with the provider you are subclassing. .. code-block:: python class GoogleNoDefaultScopeProvider(GoogleProvider): id = 'google_no_scope' def get_default_scope(self): return [] provider_classes = [GoogleNoDefaultScopeProvider] Changing provider scopes ------------------------ Some projects may need more scopes than the default required for authentication purposes. Scopes can be modified via ``SOCIALACCOUNT_PROVIDERS`` in your project settings.py file. .. code-block:: python SOCIALACCOUNT_PROVIDERS = { '': { 'SCOPE': [...] } } You need to obtain the default scopes that allauth uses by looking in ``allauth/socialaccount/providers//provider.py`` and look for ``def get_default_scope(self):`` method. Copy those default scopes into the SCOPE list shown above. Example of adding calendar.readonly scope to Google scopes:: SOCIALACCOUNT_PROVIDERS = { 'google': { 'SCOPE': [ 'profile', 'email', 'openid', 'https://www.googleapis.com/auth/calendar.readonly' ], } } django-allauth-0.47.0/docs/conf.py000066400000000000000000000175021415442050100167240ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # django-allauth documentation build configuration file, created by # sphinx-quickstart on Wed Jun 6 22:58:42 2012. # # This file is execfile()d with the current directory set to its containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. # sys.path.insert(0, os.path.abspath('.')) # -- General configuration ----------------------------------------------------- # If your documentation needs a minimal Sphinx version, state it here. # needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. extensions = [] # Add any paths that contain templates here, relative to this directory. templates_path = ["_templates"] # The suffix of source filenames. source_suffix = ".rst" # The encoding of source files. # source_encoding = 'utf-8-sig' # The master toctree document. master_doc = "index" # General information about the project. project = u"django-allauth" copyright = u"2017, Raymond Penners" # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. version = "0.43" # The full version, including alpha/beta/rc tags. release = "0.43.0" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: # today = '' # Else, today_fmt is used as the format for a strftime call. # today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns = ["_build"] # The reST default role (used for this markup: `text`) to use for all documents. # default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. # add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). # add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. # show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = "sphinx" # A list of ignored prefixes for module index sorting. # modindex_common_prefix = [] # -- Options for HTML output --------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. html_theme = "default" # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. # html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. # html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". # html_title = None # A shorter title for the navigation bar. Default is the same as html_title. # html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. # html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. # html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". # html_static_path = ['_static'] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. # html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. # html_use_smartypants = True # Custom sidebar templates, maps document names to template names. # html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. # html_additional_pages = {} # If false, no module index is generated. # html_domain_indices = True # If false, no index is generated. # html_use_index = True # If true, the index is split into individual pages for each letter. # html_split_index = False # If true, links to the reST sources are added to the pages. # html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. # html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. # html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. # html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). # html_file_suffix = None # Output file base name for HTML help builder. htmlhelp_basename = "django-allauthdoc" # -- Options for LaTeX output -------------------------------------------------- latex_elements = { # The paper size ('letterpaper' or 'a4paper'). #'papersize': 'letterpaper', # The font size ('10pt', '11pt' or '12pt'). #'pointsize': '10pt', # Additional stuff for the LaTeX preamble. #'preamble': '', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass [howto/manual]). latex_documents = [ ( "index", "django-allauth.tex", u"django-allauth Documentation", u"Raymond Penners", "manual", ), ] # The name of an image file (relative to this directory) to place at the top of # the title page. # latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. # latex_use_parts = False # If true, show page references after internal links. # latex_show_pagerefs = False # If true, show URL addresses after external links. # latex_show_urls = False # Documents to append as an appendix to all manuals. # latex_appendices = [] # If false, no module index is generated. # latex_domain_indices = True # -- Options for manual page output -------------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ ( "index", "django-allauth", u"django-allauth Documentation", [u"Raymond Penners"], 1, ) ] # If true, show URL addresses after external links. # man_show_urls = False # -- Options for Texinfo output ------------------------------------------------ # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ ( "index", "django-allauth", u"django-allauth Documentation", u"Raymond Penners", "django-allauth", "One line description of project.", "Miscellaneous", ), ] # Documents to append as an appendix to all manuals. # texinfo_appendices = [] # If false, no module index is generated. # texinfo_domain_indices = True # How to display URL addresses: 'footnote', 'no', or 'inline'. # texinfo_show_urls = 'footnote' django-allauth-0.47.0/docs/configuration.rst000066400000000000000000000333521415442050100210270ustar00rootroot00000000000000Configuration ============= Available settings: ACCOUNT_ADAPTER (="allauth.account.adapter.DefaultAccountAdapter") Specifies the adapter class to use, allowing you to alter certain default behaviour. ACCOUNT_AUTHENTICATED_LOGIN_REDIRECTS (=True) The default behaviour is to redirect authenticated users to ``LOGIN_REDIRECT_URL`` when they try accessing login/signup pages. By changing this setting to ``False``, logged in users will not be redirected when they access login/signup pages. ACCOUNT_AUTHENTICATION_METHOD (="username" | "email" | "username_email") Specifies the login method to use -- whether the user logs in by entering their username, e-mail address, or either one of both. Setting this to "email" requires ACCOUNT_EMAIL_REQUIRED=True ACCOUNT_CONFIRM_EMAIL_ON_GET (=False) Determines whether or not an e-mail address is automatically confirmed by a GET request. `GET is not designed to modify the server state `_, though it is commonly used for email confirmation. To avoid requiring user interaction, consider using POST via Javascript in your email confirmation template as an alternative to setting this to True. ACCOUNT_EMAIL_CONFIRMATION_ANONYMOUS_REDIRECT_URL (=settings.LOGIN_URL) The URL to redirect to after a successful e-mail confirmation, in case no user is logged in. ACCOUNT_EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL (=None) The URL to redirect to after a successful e-mail confirmation, in case of an authenticated user. Set to ``None`` to use ``settings.LOGIN_REDIRECT_URL``. ACCOUNT_EMAIL_CONFIRMATION_EXPIRE_DAYS (=3) Determines the expiration date of email confirmation mails (# of days). ACCOUNT_EMAIL_CONFIRMATION_HMAC (=True) In order to verify an email address a key is mailed identifying the email address to be verified. In previous versions, a record was stored in the database for each ongoing email confirmation, keeping track of these keys. Current versions use HMAC based keys that do not require server side state. ACCOUNT_EMAIL_REQUIRED (=False) The user is required to hand over an e-mail address when signing up. ACCOUNT_EMAIL_VERIFICATION (="optional") Determines the e-mail verification method during signup -- choose one of ``"mandatory"``, ``"optional"``, or ``"none"``. Setting this to `"mandatory"` requires `ACCOUNT_EMAIL_REQUIRED` to be `True` When set to "mandatory" the user is blocked from logging in until the email address is verified. Choose "optional" or "none" to allow logins with an unverified e-mail address. In case of "optional", the e-mail verification mail is still sent, whereas in case of "none" no e-mail verification mails are sent. ACCOUNT_EMAIL_SUBJECT_PREFIX (="[Site] ") Subject-line prefix to use for email messages sent. By default, the name of the current ``Site`` (``django.contrib.sites``) is used. ACCOUNT_DEFAULT_HTTP_PROTOCOL (="http") The default protocol used for when generating URLs, e.g. for the password forgotten procedure. Note that this is a default only -- see the section on HTTPS for more information. ACCOUNT_EMAIL_CONFIRMATION_COOLDOWN (=180) The cooldown period (in seconds) after a confirmation email is sent, during which further emails are not sent. Note that this cooldown is ignored if you are using HMAC confirmation and you need to disable HMAC by setting **ACCOUNT_EMAIL_CONFIRMATION_HMAC=False** in order for a cooldown to be employed. ACCOUNT_EMAIL_MAX_LENGTH(=254) Maximum length of the email field. You won't need to alter this unless using MySQL with the InnoDB storage engine and the ``utf8mb4`` charset, and only in versions lower than 5.7.7, because the default InnoDB settings don't allow indexes bigger than 767 bytes. When using ``utf8mb4``, characters are 4-bytes wide, so at maximum column indexes can be 191 characters long (767/4). Unfortunately Django doesn't allow specifying index lengths, so the solution is to reduce the length in characters of indexed text fields. More information can be found at `MySQL's documentation on converting between 3-byte and 4-byte Unicode character sets `_. ACCOUNT_MAX_EMAIL_ADDRESSES(=None) The maximum amount of email addresses a user can associate to his account. It is safe to change this setting for an already running project -- it will not negatively affect users that already exceed the allowed amount. Note that if you set the maximum to 1, users will not be able to change their email address as they are unable to add the new address, followed by removing the old address. ACCOUNT_FORMS (={}) Used to override forms, for example: ``{'login': 'myapp.forms.LoginForm'}`` Possible keys (and default values): * ``add_email``: :class:`allauth.account.forms.AddEmailForm` * ``change_password``: :class:`allauth.account.forms.ChangePasswordForm` * ``disconnect``: :class:`allauth.socialaccount.forms.DisconnectForm` * ``login``: :class:`allauth.account.forms.LoginForm` * ``reset_password``: :class:`allauth.account.forms.ResetPasswordForm` * ``reset_password_from_key``: :class:`allauth.account.forms.ResetPasswordKeyForm` * ``set_password``: :class:`allauth.account.forms.SetPasswordForm` * ``signup``: :class:`allauth.account.forms.SignupForm` * ``signup``: :class:`allauth.socialaccount.forms.SignupForm` ACCOUNT_LOGIN_ATTEMPTS_LIMIT (=5) Number of failed login attempts. When this number is exceeded, the user is prohibited from logging in for the specified ``ACCOUNT_LOGIN_ATTEMPTS_TIMEOUT`` seconds. Set to ``None`` to disable this functionality. Important: while this protects the allauth login view, it does not protect Django's admin login from being brute forced. ACCOUNT_LOGIN_ATTEMPTS_TIMEOUT (=300) Time period, in seconds, from last unsuccessful login attempt, during which the user is prohibited from trying to log in. ACCOUNT_LOGIN_ON_EMAIL_CONFIRMATION (=False) The default behaviour is not log users in and to redirect them to ``ACCOUNT_EMAIL_CONFIRMATION_ANONYMOUS_REDIRECT_URL``. By changing this setting to ``True``, users will automatically be logged in once they confirm their email address. Note however that this only works when confirming the email address **immediately after signing up**, assuming users didn't close their browser or used some sort of private browsing mode. ACCOUNT_LOGOUT_ON_GET (=False) Determines whether or not the user is automatically logged out by a GET request. `GET is not designed to modify the server state `_, and in this case it can be dangerous. See `LogoutView in the documentation `_ for details. ACCOUNT_LOGOUT_ON_PASSWORD_CHANGE (=False) Determines whether or not the user is automatically logged out after changing or setting their password. See documentation for `Django's session invalidation on password change `_. ACCOUNT_LOGIN_ON_PASSWORD_RESET (=False) By changing this setting to ``True``, users will automatically be logged in once they have reset their password. By default they are redirected to the password reset done page. ACCOUNT_LOGOUT_REDIRECT_URL (=`settings.LOGOUT_REDIRECT_URL or "/"`) The URL (or URL name) to return to after the user logs out. Defaults to Django's `LOGOUT_REDIRECT_URL`, unless that is empty, then `"/"` is used. ACCOUNT_PASSWORD_INPUT_RENDER_VALUE (=False) ``render_value`` parameter as passed to ``PasswordInput`` fields. ACCOUNT_PRESERVE_USERNAME_CASING (=True) This setting determines whether the username is stored in lowercase (``False``) or whether its casing is to be preserved (``True``). Note that when casing is preserved, potentially expensive ``__iexact`` lookups are performed when filter on username. For now, the default is set to ``True`` to maintain backwards compatibility. ACCOUNT_SESSION_REMEMBER (=None) Controls the life time of the session. Set to ``None`` to ask the user ("Remember me?"), ``False`` to not remember, and ``True`` to always remember. ACCOUNT_SIGNUP_EMAIL_ENTER_TWICE (=False) When signing up, let the user type in their email address twice to avoid typo's. ACCOUNT_SIGNUP_FORM_CLASS (=None) A string pointing to a custom form class (e.g. 'myapp.forms.SignupForm') that is used during signup to ask the user for additional input (e.g. newsletter signup, birth date). This class should implement a ``def signup(self, request, user)`` method, where user represents the newly signed up user. ACCOUNT_SIGNUP_PASSWORD_ENTER_TWICE (=True) When signing up, let the user type in their password twice to avoid typos. ACCOUNT_SIGNUP_REDIRECT_URL (=``settings.LOGIN_REDIRECT_URL``) The URL (or URL name) to redirect to directly after signing up. Note that users are only redirected to this URL if the signup went through uninterruptedly, for example, without any side steps due to email verification. If your project requires the user to always pass through certain onboarding views after signup, you will have to keep track of state indicating whether or not the user successfully onboarded, and handle accordingly. ACCOUNT_TEMPLATE_EXTENSION (="html") A string defining the template extension to use, defaults to ``html``. ACCOUNT_USERNAME_BLACKLIST (=[]) A list of usernames that can't be used by user. ACCOUNT_UNIQUE_EMAIL (=True) Enforce uniqueness of e-mail addresses. The ``emailaddress.email`` model field is set to ``UNIQUE``. Forms prevent a user from registering with or adding an additional email address if that email address is in use by another account. ACCOUNT_USER_DISPLAY (=a callable returning ``user.username``) A callable (or string of the form ``'some.module.callable_name'``) that takes a user as its only argument and returns the display name of the user. The default implementation returns ``user.username``. ACCOUNT_USER_MODEL_EMAIL_FIELD (="email") The name of the field containing the ``email``, if any. See custom user models. ACCOUNT_USER_MODEL_USERNAME_FIELD (="username") The name of the field containing the ``username``, if any. See custom user models. ACCOUNT_USERNAME_MIN_LENGTH (=1) An integer specifying the minimum allowed length of a username. ACCOUNT_USERNAME_REQUIRED (=True) The user is required to enter a username when signing up. Note that the user will be asked to do so even if ``ACCOUNT_AUTHENTICATION_METHOD`` is set to ``email``. Set to ``False`` when you do not wish to prompt the user to enter a username. ACCOUNT_USERNAME_VALIDATORS (=None) A path (``'some.module.validators.custom_username_validators'``) to a list of custom username validators. If left unset, the validators setup within the user model username field are used. Example:: # In validators.py from django.contrib.auth.validators import ASCIIUsernameValidator custom_username_validators = [ASCIIUsernameValidator()] # In settings.py ACCOUNT_USERNAME_VALIDATORS = 'some.module.validators.custom_username_validators' SOCIALACCOUNT_ADAPTER (="allauth.socialaccount.adapter.DefaultSocialAccountAdapter") Specifies the adapter class to use, allowing you to alter certain default behaviour. SOCIALACCOUNT_AUTO_SIGNUP (=True) Attempt to bypass the signup form by using fields (e.g. username, email) retrieved from the social account provider. If a conflict arises due to a duplicate e-mail address the signup form will still kick in. SOCIALACCOUNT_EMAIL_VERIFICATION (=ACCOUNT_EMAIL_VERIFICATION) As ``ACCOUNT_EMAIL_VERIFICATION``, but for social accounts. SOCIALACCOUNT_EMAIL_REQUIRED (=ACCOUNT_EMAIL_REQUIRED) The user is required to hand over an e-mail address when signing up using a social account. SOCIALACCOUNT_FORMS (={}) Used to override forms, for example: ``{'signup': 'myapp.forms.SignupForm'}`` SOCIALACCOUNT_LOGIN_ON_GET (=False) Controls whether or not the endpoints for initiating a social login (for example, "/accounts/google/login/") require a POST request to initiate the handshake. For security considerations, it is strongly recommended to require POST requests. SOCIALACCOUNT_PROVIDERS (= dict) Dictionary containing provider specific settings. The 'APP' section for each provider is generic to all providers and can also be specified in the database using a ``SocialApp`` model instance instead of here. All other sections are provider-specific and are documented in the `for each provider separately `__. Example:: SOCIALACCOUNT_PROVIDERS = { "github": { # For each provider, you can choose whether or not the # email address(es) retrieved from the provider are to be # interpreted as verified. "VERIFIED_EMAIL": True }, "google": { # For each OAuth based provider, either add a ``SocialApp`` # (``socialaccount`` app) containing the required client # credentials, or list them here: "APP": { "client_id": "123", "secret": "456", "key": "" }, # These are provider-specific settings that can only be # listed here: "SCOPE": [ "profile", "email", ], "AUTH_PARAMS": { "access_type": "online", } } } SOCIALACCOUNT_QUERY_EMAIL (=ACCOUNT_EMAIL_REQUIRED) Request e-mail address from 3rd party account provider? E.g. using OpenID AX, or the Facebook "email" permission. SOCIALACCOUNT_STORE_TOKENS (=True) Indicates whether or not the access tokens are stored in the database. django-allauth-0.47.0/docs/decorators.rst000066400000000000000000000014141415442050100203170ustar00rootroot00000000000000Decorators ========== Verified E-mail Required ------------------------ Even when email verification is not mandatory during signup, there may be circumstances during which you really want to prevent unverified users from proceeding. For this purpose you can use the following decorator:: from allauth.account.decorators import verified_email_required @verified_email_required def verified_users_only_view(request): ... The behavior is as follows: - If the user isn't logged in, it acts identically to the ``login_required`` decorator. - If the user is logged in but has no verified e-mail address, an e-mail verification mail is automatically resent and the user is presented with a page informing them they need to verify their email address. django-allauth-0.47.0/docs/faq.rst000066400000000000000000000103151415442050100167210ustar00rootroot00000000000000Frequently Asked Questions ========================== Overall ------- Why don't you implement support for ... ? ***************************************** This app is just about authentication. Anything that is project specific, such as making choices on what to display in a profile page, or, what information is stored for a user (e.g. home address, or favorite color?), is beyond scope and therefore not offered. This information is nice and all, but... I need more! ***************************************************** Here are a few third party resources to help you get started: - https://dev.to/gajesh/the-complete-django-allauth-guide-la3 - https://learndjango.com/tutorials/django-allauth-tutorial - https://www.youtube.com/watch?v=2QLAc7RJ99s - https://speakerdeck.com/tedtieken/signing-up-and-signing-in-users-in-django-with-django-allauth - https://stackoverflow.com/questions/tagged/django-allauth - http://www.sarahhagstrom.com/2013/09/the-missing-django-allauth-tutorial/ - https://github.com/aellerton/demo-allauth-bootstrap I think I found a security issue... now what? ********************************************* Please report security issues only to django-allauth-security@googlegroups.com. This is a private list only open to long-time, highly trusted django-allauth developers, and its archives are not public. You may also want to subscribe to django-allauth-announce@googlegroups.com to get notified about security releases. Troubleshooting --------------- The /accounts/ URL is giving me a 404 ************************************* There is no such URL. Try ``/accounts/login/`` instead. When I attempt to login I run into a 404 on /accounts/profile/ ************************************************************** When you end up here you have successfully logged in. However, you will need to implement a view for this URL yourself, as whatever is to be displayed here is project specific. You can also decide to redirect elsewhere: https://docs.djangoproject.com/en/dev/ref/settings/#login-redirect-url When I sign up I run into connectivity errors (connection refused et al) ************************************************************************ You probably have not got an e-mail (SMTP) server running on the machine you are developing on. Therefore, ``allauth`` is unable to send verification mails. You can work around this by adding the following line to ``settings.py``:: EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' This will avoid the need for an SMTP server as e-mails will be printed to the console. For more information, please refer to: https://docs.djangoproject.com/en/dev/ref/settings/#email-host Why did you just close my issue? ******************************** Time is limited and I have to pick my battles. Please do not file the following types of issues: - **Support questions, installation instructions, "How do I...?":** please direct these questions elsewhere, for example here: https://stackoverflow.com/questions/tagged/django-allauth - **Documentation related complaints:** while the documentation can most certainly be improved, I am adhering to the debatable principle that keeping open issues around with respect to documentation is not very helpful in improving things. Please step in and file a pull request if you feel there is something unclear. - **Project specific integration trouble:** In cases where ``allauth`` is just one piece of the puzzle and for example a stack trace indicates another module crashing, please try to come up stripped version of the issue where it is clear that ``allauth`` is the one that is misbehaving. - **Social login trouble:** There are many reasons why the social login for a provider is not working for you. Common causes are errors in setting up the credential for the OAuth app and/or having setup invalid callback URLs. Filing issues stating that things are not working for you is not very helpful. It is simply not feasible to debug your specific setup. If you really do think that there is an issue in ``allauth``, please do the initial debugging and analysis yourself, and, provide detailed information in the issue. If the issue does not point to any concrete issue in ``allauth``, it is likely to get closed. django-allauth-0.47.0/docs/forms.rst000066400000000000000000000205011415442050100172760ustar00rootroot00000000000000Forms ===== The following forms can be overridden as needed in order to: - Add extra fields for extra required information - Override save to add extra functionality on save Overriding Save --------------- If you decide to add fields to a form, you will need to manually save the custom fields' data. ACCOUNT_FORMS ------------- Default Settings:: ACCOUNT_FORMS = { 'login': 'allauth.account.forms.LoginForm', 'signup': 'allauth.account.forms.SignupForm', 'add_email': 'allauth.account.forms.AddEmailForm', 'change_password': 'allauth.account.forms.ChangePasswordForm', 'set_password': 'allauth.account.forms.SetPasswordForm', 'reset_password': 'allauth.account.forms.ResetPasswordForm', 'reset_password_from_key': 'allauth.account.forms.ResetPasswordKeyForm', 'disconnect': 'allauth.socialaccount.forms.DisconnectForm', } login (``allauth.account.forms.LoginForm``) ******************************************* Used on `account_login `__ view. ``save`` is not called, you need to override ``login`` :: from allauth.account.forms import LoginForm class MyCustomLoginForm(LoginForm): def login(self, *args, **kwargs): # Add your own processing here. # You must return the original result. return super(MyCustomLoginForm, self).login(*args, **kwargs) You have access to the following: - ``self.user`` is the User object that is logging in. ``settings.py``:: ACCOUNT_FORMS = {'login': 'mysite.forms.MyCustomLoginForm'} signup (``allauth.account.forms.SignupForm``) ********************************************* Used on `account_signup `__ view. :: from allauth.account.forms import SignupForm class MyCustomSignupForm(SignupForm): def save(self, request): # Ensure you call the parent class's save. # .save() returns a User object. user = super(MyCustomSignupForm, self).save(request) # Add your own processing here. # You must return the original result. return user ``settings.py``:: ACCOUNT_FORMS = {'signup': 'mysite.forms.MyCustomSignupForm'} add_email (``allauth.account.forms.AddEmailForm``) ************************************************** Used on `account_email `__ view. :: from allauth.account.forms import AddEmailForm class MyCustomAddEmailForm(AddEmailForm): def save(self): # Ensure you call the parent class's save. # .save() returns an allauth.account.models.EmailAddress object. email_address_obj = super(MyCustomAddEmailForm, self).save() # Add your own processing here. # You must return the original result. return email_address_obj You have access to the following: - ``self.user`` is the User object that is logged in. ``settings.py``:: ACCOUNT_FORMS = {'add_email': 'mysite.forms.MyCustomAddEmailForm'} change_password (``allauth.account.forms.ChangePasswordForm``) ************************************************************** Used on `account_change_password `__ view. :: from allauth.account.forms import ChangePasswordForm class MyCustomChangePasswordForm(ChangePasswordForm): def save(self): # Ensure you call the parent class's save. # .save() does not return anything super(MyCustomChangePasswordForm, self).save() # Add your own processing here. You have access to the following: - ``self.user`` is the User object that is logged in. ``settings.py``:: ACCOUNT_FORMS = {'change_password': 'mysite.forms.MyCustomChangePasswordForm'} set_password (``allauth.account.forms.SetPasswordForm``) ******************************************************** Used on `account_set_password `__ view. :: from allauth.account.forms import SetPasswordForm class MyCustomSetPasswordForm(SetPasswordForm): def save(self): # Ensure you call the parent class's save. # .save() does not return anything super(MyCustomSetPasswordForm, self).save() # Add your own processing here. You have access to the following: - ``self.user`` is the User object that is logged in. ``settings.py``:: ACCOUNT_FORMS = {'set_password': 'mysite.forms.MyCustomSetPasswordForm'} reset_password (``allauth.account.forms.ResetPasswordForm``) ************************************************************ Used on `account_reset_password `__ view. :: from allauth.account.forms import ResetPasswordForm class MyCustomResetPasswordForm(ResetPasswordForm): def save(self): # Ensure you call the parent class's save. # .save() returns a string containing the email address supplied email_address = super(MyCustomResetPasswordForm, self).save() # Add your own processing here. # Ensure you return the original result return email_address You have access to the following: - ``self.users`` is a list of all possible User objects with matching email address. ``settings.py``:: ACCOUNT_FORMS = {'reset_password': 'mysite.forms.MyCustomResetPasswordForm'} reset_password_from_key (``allauth.account.forms.ResetPasswordKeyForm``) ************************************************************************ Used on `account_reset_password `__ view. :: from allauth.account.forms import ResetPasswordKeyForm class MyCustomResetPasswordKeyForm(ResetPasswordKeyForm): def save(self): # Add your own processing here. # Ensure you call the parent class's save. # .save() does not return anything super(MyCustomResetPasswordKeyForm, self).save() You have access to the following: - ``self.user`` is the User object. ``settings.py``:: ACCOUNT_FORMS = {'reset_password_from_key': 'mysite.forms.MyCustomResetPasswordKeyForm'} SOCIALACCOUNT_FORMS ------------------- Default Settings:: SOCIALACCOUNT_FORMS = { 'disconnect': 'allauth.socialaccount.forms.DisconnectForm', 'signup': 'allauth.socialaccount.forms.SignupForm', } signup (``allauth.socialaccount.forms.SignupForm``) *************************************************** Used on socialaccount_signup view used when someone initially signs up with a social account and needs to create an account. :: from allauth.socialaccount.forms import SignupForm class MyCustomSocialSignupForm(SignupForm): def save(self, request): # Ensure you call the parent class's save. # .save() returns a User object. user = super(MyCustomSocialSignupForm, self).save(request) # Add your own processing here. # You must return the original result. return user You have access to the following: - ``self.socialaccount`` ``settings.py``:: SOCIALACCOUNT_FORMS = {'signup': 'mysite.forms.MyCustomSocialSignupForm'} disconnect (``allauth.socialaccount.forms.DisconnectForm``) *********************************************************** Used on socialaccount_connections view, used when removing a social account. :: from allauth.socialaccount.forms import DisconnectForm class MyCustomSocialDisconnectForm(DisconnectForm): def save(self): # Add your own processing here if you do need access to the # socialaccount being deleted. # Ensure you call the parent class's save. # .save() does not return anything super(MyCustomSocialDisconnectForm, self).save() # Add your own processing here if you don't need access to the # socialaccount being deleted. You have access to the following: - ``self.request`` is the request object - ``self.accounts`` is a list containing all of the user's SocialAccount objects. - ``self.cleaned_data['account']`` contains the socialaccount being deleted. ``.save()`` issues the delete. So if you need access to the socialaccount beforehand, move your code before ``.save()``. ``settings.py``:: SOCIALACCOUNT_FORMS = {'disconnect': 'mysite.forms.MyCustomSocialDisconnectForm'} django-allauth-0.47.0/docs/index.rst000066400000000000000000000006671415442050100172720ustar00rootroot00000000000000.. django-allauth documentation master file, created by sphinx-quickstart on Wed Jun 6 22:58:42 2012. .. include:: ../README.rst Contents ======== .. toctree:: :maxdepth: 2 overview installation configuration providers signals views forms templates decorators advanced faq release-notes support ================== Indices and tables ================== * :ref:`genindex` * :ref:`search` django-allauth-0.47.0/docs/installation.rst000066400000000000000000000202351415442050100206550ustar00rootroot00000000000000Installation ============ Django ------ Python package:: pip install django-allauth settings.py (Important - Please note 'django.contrib.sites' is required as INSTALLED_APPS):: # Specify the context processors as follows: TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ # Already defined Django-related contexts here # `allauth` needs this from django 'django.template.context_processors.request', ], }, }, ] AUTHENTICATION_BACKENDS = [ ... # Needed to login by username in Django admin, regardless of `allauth` 'django.contrib.auth.backends.ModelBackend', # `allauth` specific authentication methods, such as login by e-mail 'allauth.account.auth_backends.AuthenticationBackend', ... ] INSTALLED_APPS = [ ... # The following apps are required: 'django.contrib.auth', 'django.contrib.messages', 'django.contrib.sites', 'allauth', 'allauth.account', 'allauth.socialaccount', # ... include the providers you want to enable: 'allauth.socialaccount.providers.agave', 'allauth.socialaccount.providers.amazon', 'allauth.socialaccount.providers.amazon_cognito', 'allauth.socialaccount.providers.angellist', 'allauth.socialaccount.providers.apple', 'allauth.socialaccount.providers.asana', 'allauth.socialaccount.providers.auth0', 'allauth.socialaccount.providers.authentiq', 'allauth.socialaccount.providers.azure', 'allauth.socialaccount.providers.baidu', 'allauth.socialaccount.providers.basecamp', 'allauth.socialaccount.providers.battlenet', 'allauth.socialaccount.providers.bitbucket', 'allauth.socialaccount.providers.bitbucket_oauth2', 'allauth.socialaccount.providers.bitly', 'allauth.socialaccount.providers.box', 'allauth.socialaccount.providers.cern', 'allauth.socialaccount.providers.cilogon', 'allauth.socialaccount.providers.coinbase', 'allauth.socialaccount.providers.dataporten', 'allauth.socialaccount.providers.daum', 'allauth.socialaccount.providers.digitalocean', 'allauth.socialaccount.providers.discord', 'allauth.socialaccount.providers.disqus', 'allauth.socialaccount.providers.douban', 'allauth.socialaccount.providers.doximity', 'allauth.socialaccount.providers.draugiem', 'allauth.socialaccount.providers.dropbox', 'allauth.socialaccount.providers.dwolla', 'allauth.socialaccount.providers.edmodo', 'allauth.socialaccount.providers.edx', 'allauth.socialaccount.providers.eventbrite', 'allauth.socialaccount.providers.eveonline', 'allauth.socialaccount.providers.evernote', 'allauth.socialaccount.providers.exist', 'allauth.socialaccount.providers.facebook', 'allauth.socialaccount.providers.feedly', 'allauth.socialaccount.providers.figma', 'allauth.socialaccount.providers.fivehundredpx', 'allauth.socialaccount.providers.flickr', 'allauth.socialaccount.providers.foursquare', 'allauth.socialaccount.providers.frontier', 'allauth.socialaccount.providers.fxa', 'allauth.socialaccount.providers.gitea', 'allauth.socialaccount.providers.github', 'allauth.socialaccount.providers.gitlab', 'allauth.socialaccount.providers.globus', 'allauth.socialaccount.providers.google', 'allauth.socialaccount.providers.gumroad', 'allauth.socialaccount.providers.hubic', 'allauth.socialaccount.providers.instagram', 'allauth.socialaccount.providers.jupyterhub', 'allauth.socialaccount.providers.kakao', 'allauth.socialaccount.providers.keycloak', 'allauth.socialaccount.providers.line', 'allauth.socialaccount.providers.linkedin', 'allauth.socialaccount.providers.linkedin_oauth2', 'allauth.socialaccount.providers.mailchimp', 'allauth.socialaccount.providers.mailru', 'allauth.socialaccount.providers.mediawiki', 'allauth.socialaccount.providers.meetup', 'allauth.socialaccount.providers.microsoft', 'allauth.socialaccount.providers.naver', 'allauth.socialaccount.providers.nextcloud', 'allauth.socialaccount.providers.odnoklassniki', 'allauth.socialaccount.providers.openid', 'allauth.socialaccount.providers.openstreetmap', 'allauth.socialaccount.providers.orcid', 'allauth.socialaccount.providers.patreon', 'allauth.socialaccount.providers.paypal', 'allauth.socialaccount.providers.persona', 'allauth.socialaccount.providers.pinterest', 'allauth.socialaccount.providers.quickbooks', 'allauth.socialaccount.providers.reddit', 'allauth.socialaccount.providers.robinhood', 'allauth.socialaccount.providers.salesforce', 'allauth.socialaccount.providers.sharefile', 'allauth.socialaccount.providers.shopify', 'allauth.socialaccount.providers.slack', 'allauth.socialaccount.providers.soundcloud', 'allauth.socialaccount.providers.spotify', 'allauth.socialaccount.providers.stackexchange', 'allauth.socialaccount.providers.steam', 'allauth.socialaccount.providers.stocktwits', 'allauth.socialaccount.providers.strava', 'allauth.socialaccount.providers.stripe', 'allauth.socialaccount.providers.telegram', 'allauth.socialaccount.providers.trainingpeaks', 'allauth.socialaccount.providers.trello', 'allauth.socialaccount.providers.tumblr', 'allauth.socialaccount.providers.twentythreeandme', 'allauth.socialaccount.providers.twitch', 'allauth.socialaccount.providers.twitter', 'allauth.socialaccount.providers.untappd', 'allauth.socialaccount.providers.vimeo', 'allauth.socialaccount.providers.vimeo_oauth2', 'allauth.socialaccount.providers.vk', 'allauth.socialaccount.providers.weibo', 'allauth.socialaccount.providers.weixin', 'allauth.socialaccount.providers.windowslive', 'allauth.socialaccount.providers.xing', 'allauth.socialaccount.providers.yahoo', 'allauth.socialaccount.providers.yandex', 'allauth.socialaccount.providers.ynab', 'allauth.socialaccount.providers.zoho', 'allauth.socialaccount.providers.zoom', 'allauth.socialaccount.providers.okta', 'allauth.socialaccount.providers.feishu', ... ] SITE_ID = 1 # Provider specific settings SOCIALACCOUNT_PROVIDERS = { 'google': { # For each OAuth based provider, either add a ``SocialApp`` # (``socialaccount`` app) containing the required client # credentials, or list them here: 'APP': { 'client_id': '123', 'secret': '456', 'key': '' } } } urls.py:: urlpatterns = [ ... path('accounts/', include('allauth.urls')), ... ] Note that you do not necessarily need the URLs provided by ``django.contrib.auth.urls``. Instead of the URLs ``login``, ``logout``, and ``password_change`` (among others), you can use the URLs provided by ``allauth``: ``account_login``, ``account_logout``, ``account_set_password``... Post-Installation ----------------- In your Django root execute the command below to create your database tables:: python manage.py migrate Now start your server, visit your admin pages (e.g. http://localhost:8000/admin/) and follow these steps: - Add a ``Site`` for your domain, matching ``settings.SITE_ID`` (``django.contrib.sites`` app). - For each OAuth based provider, either add a ``SocialApp`` (``socialaccount`` app) containing the required client credentials, or, make sure that these are configured via the ``SOCIALACCOUNT_PROVIDERS[]['APP']`` setting (see example above). django-allauth-0.47.0/docs/overview.rst000066400000000000000000000076051415442050100200300ustar00rootroot00000000000000Overview ======== Requirements ------------ - Python 3.5, 3.6, 3.7, 3.8 or 3.9 - Django (2.0+) - python-openid or python3-openid (depending on your Python version) - requests and requests-oauthlib Supported Flows --------------- - Signup of both local and social accounts - Connecting more than one social account to a local account - Disconnecting a social account -- requires setting a password if only the local account remains - Optional instant-signup for social accounts -- no questions asked - E-mail address management (multiple e-mail addresses, setting a primary) - Password forgotten flow - E-mail address verification flow Supported Providers ------------------- - 23andMe (OAuth2) - 500px - AgaveAPI (OAuth2) - Amazon (OAuth2) - Amazon Cognito (OAuth2) - AngelList (OAuth2) - Apple ("OAuth2") - Asana (OAuth2) - Auth0 (OAuth2) - Authentiq (OAuth2) - Azure (OAuth2) - Baidu (OAuth2) - Basecamp (OAuth2) - Battle.net (OAuth2) - Bitbucket (OAuth, OAuth2) - Bitly (OAuth2) - Box (OAuth2) - CERN (OAuth2) - CILogon (OAuth2) - Coinbase (OAuth2) - Dataporten (OAuth2) - Daum (OAuth2) - Digital Ocean (OAuth2) - Discord (OAuth2) - Disqus (OAuth2) - Douban (OAuth2) - Doximity (OAuth2) - Draugiem - Dropbox (OAuth, OAuth2) - Dwolla (OAuth2) - Edmodo (OAuth2) - Edx (open.edx.org) (OAuth2) - Eve Online (OAuth2) - Eventbrite (OAuth2) - Evernote (OAuth) - Exist (OAuth2) - Facebook (both OAuth2 and JS SDK) - Feedly (OAuth2) - Figma (OAuth2) - Firefox Accounts (OAuth2) - Flickr (OAuth) - FourSquare (OAuth2) - Frontier (OAuth2) - Gitea (OAuth2) - Github (OAuth2) - GitLab (OAuth2) - Globus (OAuth2) - Google (OAuth2) - Gumroad (OAuth2) - Hubic (OAuth2) - Instagram (OAuth2) - JupyterHub (OAuth2) - Kakao (OAuth2) - Keycloak (OAuth2) - Line (OAuth2) - LinkedIn (OAuth, OAuth2) - Mail.Ru (OAuth2) - MailChimp (OAuth2) - MediaWiki (OAuth2) - Meetup (OAuth2) - Microsoft (Graph) (OAuth2) - Naver (OAuth2) - NetIQ/Microfocus AccessManager (OAuth2) - NextCloud (OAuth2) - Odnoklassniki (OAuth2) - Okta (OAuth2) - OpenId - OpenStreetMap (OAuth) - ORCID (OAuth2) - Patreon (OAuth2) - Paypal (OAuth2) - Persona - Pinterest (OAuth2) - QuickBooks (OAuth2) - Reddit (OAuth2) - Robinhood (OAuth2) - Salesforce (OAuth2) - ShareFile (OAuth2) - Shopify (OAuth2) - Slack (OAuth2) - SoundCloud (OAuth2) - Spotify (OAuth2) - Stack Exchange (OAuth2) - Steam (OpenID) - Stocktwits (OAuth2) - Strava (OAuth2) - Stripe (OAuth2) - Telegram - TrainingPeaks (OAuth2) - Trello (OAuth) - Tumblr (OAuth) - Twitch (OAuth2) - Twitter (OAuth) - Untappd (OAuth2) - Vimeo (OAuth, OAuth2) - VK (OAuth2) - Weibo (OAuth2) - Weixin (OAuth2) - Windows Live (OAuth2) - Xing (OAuth) - Yahoo (OAuth2) - Yandex (OAuth2) - YNAB (OAuth2) - Zoho (Oauth2) - Zoom (OAuth2) - Feishu (OAuth2) Note: OAuth/OAuth2 support is built using a common code base, making it easy to add support for additional OAuth/OAuth2 providers. More will follow soon... Features -------- - Supports multiple authentication schemes (e.g. login by user name, or by e-mail), as well as multiple strategies for account verification (ranging from none to e-mail verification). - All access tokens are consistently stored so that you can publish wall updates etc. Architecture & Design --------------------- - Pluggable signup form for asking additional questions during signup. - Support for connecting multiple social accounts to a Django user account. - The required consumer keys and secrets for interacting with Facebook, Twitter and the likes are to be configured in the database via the Django admin using the SocialApp model. - Consumer keys, tokens make use of the Django sites framework. This is especially helpful for larger multi-domain projects, but also allows for easy switching between a development (localhost) and production setup without messing with your settings and database. django-allauth-0.47.0/docs/providers.rst000066400000000000000000001711231415442050100201740ustar00rootroot00000000000000Providers ========= Most providers require you to sign up for a so called API client or app, containing a client ID and API secret. You must add a ``SocialApp`` record per provider via the Django admin containing these app credentials. When creating the OAuth app on the side of the provider pay special attention to the callback URL (sometimes also referred to as redirect URL). If you do not configure this correctly, you will receive login failures when attempting to log in, such as:: An error occurred while attempting to login via your social network account. Use a callback URL of the form:: http://example.com/accounts/twitter/login/callback/ http://example.com/accounts/soundcloud/login/callback/ ... For local development, use the following:: http://127.0.0.1:8000/accounts/twitter/login/callback/ 23andMe ------- App registration (get your key and secret here) https://api.23andme.com/dev/ Development callback URL http://localhost:8000/accounts/23andme/login/callback/ 500px ----- App registration (get your key and secret here) https://500px.com/settings/applications Development callback URL http://localhost:8000/accounts/500px/login/callback/ AgaveAPI -------- Account Signup https://public.agaveapi.co/create_account App registration Run ``client-create`` from the cli: https://bitbucket.org/agaveapi/cli/overview Development callback URL http://localhost:8000/accounts/agave/login/callback/ *May require https url, even for localhost* .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'agave': { 'API_URL': 'https://api.tacc.utexas.edu', } } In the absense of a specified API_URL, the default Agave tenant is https://public.agaveapi.co/ Amazon ------ Amazon requires secure OAuth callback URLs (``redirect_uri``), please see the section on HTTPS about how this is handled. App registration (get your key and secret here) http://login.amazon.com/manageApps Development callback URL https://example.com/accounts/amazon/login/callback/ Amazon Cognito -------------- App registration (get your key and secret here) 1. Go to your https://console.aws.amazon.com/cognito/ and create a Cognito User Pool if you haven't already. 2. Go to General Settings > App Clients section and create a new App Client if you haven't already. Please make sure you select the option to generate a secret key. 3. Go to App Integration > App Client Settings section and: 1. Enable Cognito User Pool as an identity provider. 2. Set the callback and sign-out URLs. (see next section for development callback URL) 3. Enable Authorization Code Grant OAuth flow. 4. Select the OAuth scopes you'd like to allow. 4. Go to App Integration > Domain Name section and create a domain prefix for your Cognito User Pool. Development callback URL: http://localhost:8000/accounts/amazon-cognito/login/callback/ In addition, you'll need to specify your user pool's domain like so: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'amazon_cognito': { 'DOMAIN': 'https://.auth.us-east-1.amazoncognito.com', } } Your domain prefix is the value you specified in step 4 of the app registration process. If you provided a custom domain such as accounts.example.com provide that instead. AngelList --------- App registration (get your key and secret here) https://angel.co/api/oauth/clients Development callback URL http://localhost:8000/accounts/angellist/login/callback/ Apple ----- App registration (create an App ID and then a related Service ID here) https://developer.apple.com/account/resources/certificates/list Private Key registration (be sure to save it) https://developer.apple.com/account/resources/authkeys/list Development callback URL http://domain.com/accounts/apple/login/callback/ Add the following configuration to your settings: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { "apple": { "APP": { # Your service identifier. "client_id": "your.service.id", # The Key ID (visible in the "View Key Details" page). "secret": "KEYID", # Member ID/App ID Prefix -- you can find it below your name # at the top right corner of the page, or it’s your App ID # Prefix in your App ID. "key": "MEMAPPIDPREFIX", # The certificate you downloaded when generating the key. "certificate_key": """-----BEGIN PRIVATE KEY----- s3cr3ts3cr3ts3cr3ts3cr3ts3cr3ts3cr3ts3cr3ts3cr3ts3cr3ts3cr3ts3cr 3ts3cr3ts3cr3ts3cr3ts3cr3ts3cr3ts3cr3ts3cr3ts3cr3ts3cr3ts3cr3ts3 c3ts3cr3t -----END PRIVATE KEY----- """ } } } Note: Sign In With Apple uses a slight variation of OAuth2, which uses a POST instead of a GET. Unlike a GET with SameSite=Lax, the session cookie will not get sent along with a POST. If you encounter 'PermissionDenied' errors during Apple log in, check that you don't have any 3rd party middleweare that is generating a new session on this cross-origin POST, as this will prevent the login process from being able to access the original session after the POST completes. Auth0 ----- App registration (get your key and secret here) https://manage.auth0.com/#/clients Development callback URL http://localhost:8000/accounts/auth0/login/callback/ You'll need to specify the base URL for your Auth0 domain: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'auth0': { 'AUTH0_URL': 'https://your.auth0domain.auth0.com', } } Authentiq --------- Browse to https://www.authentiq.com/developers to get started. App registration https://dashboard.authentiq.com/ Sign in or register with your Authentiq ID (select ``Download the app`` while signing in if you don't have Authentiq ID yet). Development redirect URL http://localhost:8000/accounts/authentiq/login/callback/ While testing you can leave the ``Redirect URIs`` field empty in the dashboard. You can specify what identity details to request via the ``SCOPE`` parameter. .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'authentiq': { 'SCOPE': ['email', 'aq:name'] } } Valid scopes include: ``email``, ``phone``, ``address``, ``aq:name``, ``aq:location``. The default is to request a user's name, and email address if ``SOCIALACCOUNT_QUERY_EMAIL=True``. You can request and require a verified email address by setting ``SOCIALACCOUNT_EMAIL_VERIFICATION=True`` and ``SOCIALACCOUNT_EMAIL_REQUIRED=True``. Baidu ----- The Baidu OAuth2 authentication documentation: http://developer.baidu.com/wiki/index.php?title=docs/oauth/refresh http://developer.baidu.com/wiki/index.php?title=docs/oauth/rest/file_data_apis_lista Basecamp -------- App registration (get your key and secret here) https://integrate.37signals.com/ The Basecamp OAuth2 authentication documentation https://github.com/basecamp/api/blob/master/sections/authentication.md#oauth-2 Development callback URL https://localhost:8000/accounts/basecamp/login/callback/ Battle.net ---------- The Battle.net OAuth2 authentication documentation https://develop.battle.net/documentation/guides/using-oauth Register your app here (Blizzard account required) https://develop.battle.net/access/clients/create Development callback URL https://localhost:8000/accounts/battlenet/login/callback/ Note that in order to use battletags as usernames, you are expected to override either the ``username`` field on your User model, or to pass a custom validator which will accept the ``#`` character using the ``ACCOUNT_USERNAME_VALIDATORS`` setting. Such a validator is available in ``socialaccount.providers.battlenet.validators.BattletagUsernameValidator``. The following Battle.net settings are available: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'battlenet': { 'SCOPE': ['wow.profile', 'sc2.profile'], 'REGION': 'us', } } SCOPE: Scope can be an array of the following options: ``wow.profile`` allows access to the user's World of Warcraft characters. ``sc2.profile`` allows access to the user's StarCraft 2 profile. The default setting is ``[]``. REGION: Either ``apac``, ``cn``, ``eu``, ``kr``, ``sea``, ``tw`` or ``us`` Sets the default region to use, can be overriden using query parameters in the URL, for example: ``?region=eu``. Defaults to ``us``. Bitbucket --------- App registration (get your key and secret here) https://bitbucket.org/account/user/{{yourusername}}/oauth-consumers/new Make sure you select the Account:Read permission. Development callback URL http://127.0.0.1:8000/accounts/bitbucket_oauth2/login/callback/ Note that Bitbucket calls the ``client_id`` *Key* in their user interface. Don't get confused by that; use the *Key* value for your ``client_id`` field. Box --- App registration (get your key and secret here) https://app.box.com/developers/services/edit/ Development callback URL http://localhost:8000/accounts/box/login/callback/ CERN ---- App registration (get your key and secret here) https://sso-management.web.cern.ch/OAuth/RegisterOAuthClient.aspx CERN OAuth2 Documentation https://espace.cern.ch/authentication/CERN%20Authentication/OAuth.aspx CILogon ---- CILogon is a federated identity provider for hundreds of universities and research institutions around the world. App registration (get your key and secret here) https://cilogon.org/oauth2/register CILogon OIDC/OAuth2 Documentation https://www.cilogon.org/oidc Dataporten ---------- App registration (get your key and secret here) https://docs.dataporten.no/docs/gettingstarted/ Development callback URL http://localhost:8000/accounts/dataporten/login/callback daum ---- App registration (get your key and secret here) https://developers.daum.net/console Development callback URL http://127.0.0.1:8000/accounts/daum/login/callback/ DigitalOcean ------------ App registration (get your key and secret here) https://cloud.digitalocean.com/settings/applications Development callback URL http://127.0.0.1:8000/accounts/digitalocean/login/callback/ With the acquired access token you will have read permissions on the API by default. If you also need write access specify the scope as follows. See https://developers.digitalocean.com/documentation/oauth/#scopes for details. .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'digitalocean': { 'SCOPE': [ 'read write', ], } } Discord ------- App registration and management (get your key and secret here) https://discordapp.com/developers/applications/me Make sure to Add Redirect URI to your application. Development callback (redirect) URL http://127.0.0.1:8000/accounts/discord/login/callback/ Doximity -------- Doximity OAuth2 implementation documentation https://www.doximity.com/developers/documentation#oauth Request API keys here https://www.doximity.com/developers/api_signup Development callback URL http://localhost:8000/accounts/doximity/login/callback/ Draugiem -------- App registration (get your key and secret here) https://www.draugiem.lv/applications/dev/create/?type=4 Authentication documentation https://www.draugiem.lv/applications/dev/docs/passport/ Development callback URL http://localhost:8000/accounts/draugiem/login/callback/ Dropbox ------- App registration (get your key and secret here) https://www.dropbox.com/developers/apps/ Development callback URL http://localhost:8000/accounts/dropbox/login/callback/ Dwolla ------------ App registration (get your key and secret here) https://dashboard-uat.dwolla.com/applications Development callback URL http://127.0.0.1:8000/accounts/dwolla/login/callback/ .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'dwolla': { 'SCOPE': [ 'Send', 'Transactions', 'Funding', 'AccountInfoFull', ], 'ENVIROMENT':'sandbox', } } Edmodo ------ Edmodo OAuth2 documentation https://developers.edmodo.com/edmodo-connect/edmodo-connect-overview-getting-started/ You can optionally specify additional permissions to use. If no ``SCOPE`` value is set, the Edmodo provider will use ``basic`` by default: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'edmodo': { 'SCOPE': [ 'basic', 'read_groups', 'read_connections', 'read_user_email', 'create_messages', 'write_library_items', ] } } Edx ------ Open Edx OAuth2 documentation https://course-catalog-api-guide.readthedocs.io/en/latest/authentication/ It is necessary to set ``EDX_URL`` to your open edx installation. If no ``EDX_URL`` value is set, the Edx provider will use ``https://edx.org`` which does not work: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'edx': { 'EDX_URL': "https://openedx.local", } } Eve Online ---------- Register your application at ``https://developers.eveonline.com/applications/create``. Note that if you have ``STORE_TOKENS`` enabled (the default), you will need to set up your application to be able to request an OAuth scope. This means you will need to set it as having "CREST Access". The least obtrusive scope is "publicData". Eventbrite ------------------ Log in and click your profile name in the top right navigation, then select ``Account Settings``. Choose ``App Management`` near the bottom of the left navigation column. You can then click ``Create A New App`` on the upper left corner. App registration https://www.eventbrite.com/myaccount/apps/ Fill in the form with the following link Development callback URL http://127.0.0.1:8000/accounts/eventbrite/login/callback/ for both the ``Application URL`` and ``OAuth Redirect URI``. Evernote -------- Register your OAuth2 application at ``https://dev.evernote.com/doc/articles/authentication.php``: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'evernote': { 'EVERNOTE_HOSTNAME': 'evernote.com' # defaults to sandbox.evernote.com } } Exist ----- Register your OAuth2 app in apps page: https://exist.io/account/apps/ During development set the callback url to: http://localhost:8000/accounts/exist/login/callback/ In production replace localhost with whatever domain you're hosting your app on. If your app is writing to certain attributes you need to specify this during the creation of the app. The following Exist settings are available: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'exist': { 'SCOPE': ['read+write'], } } SCOPE: The default scope is ``read``. If you'd like to change this set the scope to ``read+write``. For more information: OAuth documentation: http://developer.exist.io/#oauth2-authentication API documentation: http://developer.exist.io/ Facebook -------- For Facebook both OAuth2 and the Facebook Connect Javascript SDK are supported. You can even mix the two. An advantage of the Javascript SDK may be a more streamlined user experience as you do not leave your site. Furthermore, you do not need to worry about tailoring the login dialog depending on whether or not you are using a mobile device. Yet, relying on Javascript may not be everybody's cup of tea. To initiate a login use: .. code-block:: python {% load socialaccount %} {% providers_media_js %} Facebook Connect or: .. code-block:: python {% load socialaccount %} Facebook OAuth2 The following Facebook settings are available: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'facebook': { 'METHOD': 'oauth2', 'SDK_URL': '//connect.facebook.net/{locale}/sdk.js', 'SCOPE': ['email', 'public_profile'], 'AUTH_PARAMS': {'auth_type': 'reauthenticate'}, 'INIT_PARAMS': {'cookie': True}, 'FIELDS': [ 'id', 'first_name', 'last_name', 'middle_name', 'name', 'name_format', 'picture', 'short_name' ], 'EXCHANGE_TOKEN': True, 'LOCALE_FUNC': 'path.to.callable', 'VERIFIED_EMAIL': False, 'VERSION': 'v7.0', } } METHOD: Either ``js_sdk`` or ``oauth2``. The default is ``oauth2``. SDK_URL: If needed, use ``SDK_URL`` to override the default Facebook JavaScript SDK URL, ``//connect.facebook.net/{locale}/sdk.js``. This may be necessary, for example, when using the `Customer Chat Plugin `_. If the ``SDK_URL`` contains a ``{locale}`` format string named argument, the locale given by the ``LOCALE_FUNC`` will be used to generate the ``SDK_URL``. SCOPE: By default, the ``email`` scope is required depending on whether or not ``SOCIALACCOUNT_QUERY_EMAIL`` is enabled. Apps using permissions beyond ``email`` and ``public_profile`` require review by Facebook. See `Permissions with Facebook Login `_ for more information. AUTH_PARAMS: Use ``AUTH_PARAMS`` to pass along other parameters to the ``FB.login`` JS SDK call. FIELDS: The fields to fetch from the Graph API ``/me/?fields=`` endpoint. For example, you could add the ``'friends'`` field in order to capture the user's friends that have also logged into your app using Facebook (requires ``'user_friends'`` scope). EXCHANGE_TOKEN: The JS SDK returns a short-lived token suitable for client-side use. Set ``EXCHANGE_TOKEN = True`` to make a server-side request to upgrade to a long-lived token before storing in the ``SocialToken`` record. See `Expiration and Extending Tokens `_. LOCALE_FUNC: The locale for the JS SDK is chosen based on the current active language of the request, taking a best guess. This can be customized using the ``LOCALE_FUNC`` setting, which takes either a callable or a path to a callable. This callable must take exactly one argument, the request, and return `a valid Facebook locale `_ as a string, e.g. US English: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'facebook': { 'LOCALE_FUNC': lambda request: 'en_US' } } VERIFIED_EMAIL: It is not clear from the Facebook documentation whether or not the fact that the account is verified implies that the e-mail address is verified as well. For example, verification could also be done by phone or credit card. To be on the safe side, the default is to treat e-mail addresses from Facebook as unverified. But, if you feel that is too paranoid, then use this setting to mark them as verified. Due to lack of an official statement from the side of Facebook, attempts have been made to `reverse engineer the meaning of the verified flag `_. Do know that by setting this to ``True`` you may be introducing a security risk. VERSION: The Facebook Graph API version to use. The default is ``v7.0``. App registration (get your key and secret here) A key and secret key can be obtained by `creating an app `_. After registration you will need to make it available to the public. In order to do that your app first has to be `reviewed by Facebook `_. Development callback URL Leave your App Domains empty and put ``http://localhost:8000`` in the section labeled ``Website with Facebook Login``. Note that you'll need to add your site's actual domain to this section once it goes live. Figma ------------------ App registration (get your key and secret here) https://www.figma.com/developers/apps Development callback URL http://localhost:8000/accounts/figma/login/callback/ Firefox Accounts ---------------- The Firefox Accounts provider is currently limited to Mozilla relying services but there is the intention, in the future, to allow third-party services to delegate authentication. There is no committed timeline for this. The provider is OAuth2 based. More info: https://developer.mozilla.org/en-US/Firefox_Accounts Note: This is not the same as the Mozilla Persona provider below. The following Firefox Accounts settings are available: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'fxa': { 'SCOPE': ['profile'], 'OAUTH_ENDPOINT': 'https://oauth.accounts.firefox.com/v1', 'PROFILE_ENDPOINT': 'https://profile.accounts.firefox.com/v1', } } SCOPE: Requested OAuth2 scope. Default is ['profile'], which will work for applications on the Mozilla trusted whitelist. If your application is not on the whitelist, then define SCOPE to be ['profile:email', 'profile:uid']. OAUTH_ENDPOINT: Explicitly set the OAuth2 endpoint. Default is the production endpoint "https://oauth.accounts.firefox.com/v1". PROFILE_ENDPOINT: Explicitly set the profile endpoint. Default is the production endpoint and is "https://profile.accounts.firefox.com/v1". Flickr ------ App registration (get your key and secret here) https://www.flickr.com/services/apps/create/ You can optionally specify the application permissions to use. If no ``perms`` value is set, the Flickr provider will use ``read`` by default. .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'flickr': { 'AUTH_PARAMS': { 'perms': 'write', } } } More info: https://www.flickr.com/services/api/auth.oauth.html#authorization Frontier -------- The Frontier provider is OAuth2 based. Client registration ******************* Frontier Developments switched to OAuth2 based authentication in early 2019. Before a developer can use the authentication and CAPI (Companion API) service from Frontier, they must first apply for access. Go to https://user.frontierstore.net/ and apply for access. Once your application is approved for access. Under "Developer Zone", you will see a list of authorized clients granted access. To add access for your client, click on the "Create Client" button and fill out the form and submit the form. After creating the client access, click on "View" to reveal your Client ID and Shared Key. You can also regenerate the key in an event tha your shared key is compromised. Configuring Django ****************** The app credentials are configured for your Django installation via the admin interface. Create a new socialapp through ``/admin/socialaccount/socialapp/``. Fill in the form as follows: * Provider, "Frontier" * Name, your pick, suggest "Frontier" * Client id, is called "Client ID" by Frontier * Secret key, is called "Shared Key" by Frontier * Key, is not needed, leave blank. Optionally, you can specify the scope to use as follows: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'frontier': { 'SCOPE': ['auth', 'capi'], 'VERIFIED_EMAIL': True }, } Gitea ------ App registration (get your key and secret here) https://gitea.com/user/settings/applications Development callback URL http://127.0.0.1:8000/accounts/github/login/callback/ Self-hosted Support ****************** If you use a self-hosted Gitea instance add your server URL to your Django settings as follows: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'gitea': { 'GITEA_URL': 'https://your.gitea-server.domain', } } GitHub ------ App registration (get your key and secret here) https://github.com/settings/applications/new Development callback URL http://127.0.0.1:8000/accounts/github/login/callback/ If you want more than just read-only access to public data, specify the scope as follows. See https://developer.github.com/v3/oauth/#scopes for details. .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'github': { 'SCOPE': [ 'user', 'repo', 'read:org', ], } } Enterprise Support ****************** If you use GitHub Enterprise add your server URL to your Django settings as follows: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'github': { 'GITHUB_URL': 'https://your.github-server.domain', } } GitLab ------ The GitLab provider works by default with https://gitlab.com. It allows you to connect to your private GitLab server and use GitLab as an OAuth2 authentication provider as described in GitLab docs at http://doc.gitlab.com/ce/integration/oauth_provider.html The following GitLab settings are available, if unset https://gitlab.com will be used, with a ``read_user`` scope. GITLAB_URL: Override endpoint to request an authorization and access token. For your private GitLab server you use: ``https://your.gitlab.server.tld`` SCOPE: The ``read_user`` scope is required for the login procedure, and is the default. If more access is required, the scope should be set here. Example: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'gitlab': { 'GITLAB_URL': 'https://your.gitlab.server.tld', 'SCOPE': ['api'], }, } Globus ------ Registering an application: https://developers.globus.org/ By default, you will have access to the openid, profile, and offline_access scopes. With the offline_access scope, the API will provide you with a refresh token. For additional scopes, see the Globus API docs: https://docs.globus.org/api/auth/reference/ .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'globus': { 'SCOPE': [ 'openid', 'profile', 'email', 'urn:globus:auth:scope:transfer.api.globus.org:all' ] } } Google ------ The Google provider is OAuth2 based. More info: https://developers.google.com/identity/protocols/OAuth2 App registration **************** Create a google app to obtain a key and secret through the developer console. Google Developer Console https://console.developers.google.com/ After you create a project you will have to create a "Client ID" and fill in some project details for the consent form that will be presented to the client. Under "APIs & auth" go to "Credentials" and create a new Client ID. Probably you will want a "Web application" Client ID. Provide your domain name or test domain name in "Authorized JavaScript origins". Finally fill in ``http://127.0.0.1:8000/accounts/google/login/callback/`` in the "Authorized redirect URI" field. You can fill multiple URLs, one for each test domain. After creating the Client ID you will find all details for the Django configuration on this page. Users that login using the app will be presented a consent form. For this to work additional information is required. Under "APIs & auth" go to "Consent screen" and at least provide an email and product name. Django configuration ******************** The app credentials are configured for your Django installation via the admin interface. Create a new socialapp through ``/admin/socialaccount/socialapp/``. Fill in the form as follows: * Provider, "Google" * Name, your pick, suggest "Google" * Client id, is called "Client ID" by Google * Secret key, is called "Client secret" by Google * Key, is not needed, leave blank. Optionally, you can specify the scope to use as follows: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'google': { 'SCOPE': [ 'profile', 'email', ], 'AUTH_PARAMS': { 'access_type': 'online', } } } By default (if you do not specify ``SCOPE``), ``profile`` scope is requested, and optionally ``email`` scope depending on whether or not ``SOCIALACCOUNT_QUERY_EMAIL`` is enabled. You must set ``AUTH_PARAMS['access_type']`` to ``offline`` in order to receive a refresh token on first login and on reauthentication requests (which is needed to refresh authentication tokens in the background, without involving the user's browser). When unspecified, Google defaults to ``online``. Gumroad --------- App registration (get your key and secret here) https://help.gumroad.com/article/280-create-application-api Development callback URL http://localhost:8000/accounts/instagram/login/callback/ Instagram --------- App registration (get your key and secret here) https://www.instagram.com/developer/clients/manage/ Development callback URL http://localhost:8000/accounts/instagram/login/callback/ JupyterHub ---------- Documentation on configuring a key and secret key https://jupyterhub.readthedocs.io/en/stable/api/services.auth.html Development callback URL http://localhost:800/accounts/jupyterhub/login/callback/ Specify the URL of your JupyterHub server as follows: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'jupyterhub': { 'API_URL': 'https://jupyterhub.example.com', } } Kakao ----- App registration (get your key here) https://developers.kakao.com/apps Development callback URL http://localhost:8000/accounts/kakao/login/callback/ Keycloak -------- Creating and Registering the Client https://www.keycloak.org/docs/latest/getting_started/index.html#creating-and-registering-the-client Development callback URL http://localhost:8000/accounts/keycloak/login/callback/ The following Keycloak settings are available. KEYCLOAK_URL: The url of your hosted keycloak server, it must end with ``/auth``. For example, you can use: ``https://your.keycloak.server/auth`` KEYCLOAK_URL_ALT: An alternate url of your hosted keycloak server, it must end with ``/auth``. For example, you can use: ``https://your.keycloak.server/auth`` This can be used when working with Docker on localhost, with a frontend and a backend hosted in different containers. KEYCLOAK_REAML: The name of the ``realm`` you want to use. Example: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'keycloak': { 'KEYCLOAK_URL': 'https://keycloak.custom/auth', 'KEYCLOAK_REALM': 'master' } } Line ---- scope options https://developers.line.biz/en/docs/line-login/integrate-line-login/#scopes App registration, create a Line login channel (get your channel_id and channel_secret here) https://developers.line.biz/console/ Development callback URL http://127.0.0.1:8000/accounts/line/login/callback/ .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'line': { 'APP': { 'client_id': 'LINE_LOGIN_CHANNEL_ID', 'secret': 'LINE_LOGIN_CHANNEL_SECRET' }, "SCOPE": ['profile', 'openid', 'email'] } } LinkedIn -------- The LinkedIn provider comes in two flavors: OAuth 1.0 (``allauth.socialaccount.providers.linkedin``) and OAuth 2.0 (``allauth.socialaccount.providers.linkedin_oauth2``). You can specify the scope and fields to fetch as follows: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'linkedin': { 'SCOPE': [ 'r_basicprofile', 'r_emailaddress' ], 'PROFILE_FIELDS': [ 'id', 'first-name', 'last-name', 'email-address', 'picture-url', 'public-profile-url', ] } } By default, ``r_emailaddress`` scope is required depending on whether or not ``SOCIALACCOUNT_QUERY_EMAIL`` is enabled. Note: if you are experiencing issues where it seems as if the scope has no effect you may be using an old LinkedIn app that is not scope enabled. Please refer to ``https://developer.linkedin.com/forum/when-will-old-apps-have-scope-parameter-enabled`` for more background information. Furthermore, we have experienced trouble upgrading from OAuth 1.0 to OAuth 2.0 using the same app. Attempting to do so resulted in a weird error message when fetching the access token:: missing required parameters, includes an invalid parameter value, parameter more then once. : Unable to retrieve access token : authorization code not found If you are using tokens originating from the mobile SDK, you will need to specify additional headers: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'linkedin': { 'HEADERS': { 'x-li-src': 'msdk' } } } App registration (get your key and secret here) https://www.linkedin.com/secure/developer?newapp= Authorized Redirect URLs (OAuth2) ********************************* Add any you need (up to 200) consisting of: {``ACCOUNT_DEFAULT_HTTP_PROTOCOL``}://{hostname}{:optional_port}/{allauth_base_url}/linkedin_oauth2/login/callback/ For example when using the built-in django server and default settings: http://localhost:8000/accounts/linkedin_oauth2/login/callback/ Development "Accept" and "Cancel" redirect URL (OAuth 1.0a) *********************************************************** Leave the OAuth1 redirect URLs empty. MailChimp (OAuth2) ------------------ MailChimp has a simple API for working with your own data and a `good library`_ already exists for this use. However, to allow other MailChimp users to use an app you develop, the OAuth2 API allows those users to give or revoke access without creating a key themselves. .. _good library: https://pypi.python.org/pypi/mailchimp3 Registering a new app ********************* Instructions for generating your own OAuth2 app can be found at https://developer.mailchimp.com/documentation/mailchimp/guides/how-to-use-oauth2/. It is worth reading that carefully before following the instructions below. Login via https://login.mailchimp.com/, which will redirect you to ``https://usX.admin.mailchimp.com/`` where the prefix ``usX`` (``X`` is an integer) is the subdomain you need to connect to. Click on your username in the top right corner and select *Profile*. On the next page select *Extras* then click API keys, which should lead you to: App registration (where ``X`` is dependent on your account) https://usX.admin.mailchimp.com/account/oauth2/ Fill in the form with the following URL for local development: Development callback URL https://127.0.0.1:8000/accounts/mailchimp/login/callback/ Testing Locally *************** Note the requirement of **https**. If you would like to test OAuth2 authentication locally before deploying a default django project will raise errors because development mode does not support ``https``. One means of circumventing this is to install ``django-extensions``:: pip install django-extensions add it to your ``INSTALLED_APPS`` .. code-block:: python INSTALLED_APPS = ( ... 'django_extensions', ... ) and then run:: ./manage.py runserver_plus --cert cert which should allow you to test locally via https://127.0.0.1:8000. Some browsers may require enabling this on localhost and not support by default and ask for permission. MediaWiki --------- MediaWiki OAuth2 documentation: https://www.mediawiki.org/wiki/OAuth/For_Developers The following MediaWiki settings are available: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'mediawiki': { 'REST_API': 'https://meta.wikimedia.org/w/rest.php', 'USERPAGE_TEMPLATE': 'https://meta.wikimedia.org/wiki/{username}', } } REST_API: Base URL of the MediaWiki site's REST API. USERPAGE_TEMPLATE: Link template for linking to users. Must have a ``{username}`` format field. With the default settings, Wikimedia user identities (meta.wikimedia.org) will be used. App registration for Wikimedia wikis: https://meta.wikimedia.org/wiki/Special:OAuthConsumerRegistration/propose Microsoft Graph ----------------- Microsoft Graph API is the gateway to connect to mail, calendar, contacts, documents, directory, devices and more. Apps can be registered (for consumer key and secret) here https://apps.dev.microsoft.com/ By default, `common` (`organizations` and `consumers`) tenancy is configured for the login. To restrict it, change the `tenant` setting as shown below. .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'microsoft': { 'tenant': 'organizations', } } Naver ----- App registration (get your key and secret here) https://developers.naver.com/appinfo Development callback URL http://localhost:8000/accounts/naver/login/callback/ NetIQ/Microfocus AccessManager (NAM) ----------------------------------- The following AccessManager settings are available: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'netiq': { 'NETIQ_URL': 'https://my.identity.provider.example.org', } } App registration (get your key and secret here) is done by the administrator of your NetIQ/Microfocus AccessManager. NextCloud --------- The following NextCloud settings are available: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'nextcloud': { 'SERVER': 'https://nextcloud.example.org', } } App registration (get your key and secret here) https://nextcloud.example.org/settings/admin/security Odnoklassniki ------------- App registration (get your key and secret here) http://apiok.ru/wiki/pages/viewpage.action?pageId=42476486 Development callback URL http://example.com/accounts/odnoklassniki/login/callback/ Okta ----- .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'okta': { 'OKTA_BASE_URL': 'example.okta.com', } } Okta OIDC https://developer.okta.com/docs/reference/api/oidc/ OpenID ------ The OpenID provider does not require any settings per se. However, a typical OpenID login page presents the user with a predefined list of OpenID providers and allows the user to input their own OpenID identity URL in case their provider is not listed by default. The list of providers displayed by the builtin templates can be configured as follows: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'openid': { 'SERVERS': [ dict(id='yahoo', name='Yahoo', openid_url='http://me.yahoo.com'), dict(id='hyves', name='Hyves', openid_url='http://hyves.nl'), dict(id='google', name='Google', openid_url='https://www.google.com/accounts/o8/id'), ] } } You can manually specify extra_data you want to request from server as follows:: SOCIALACCOUNT_PROVIDERS = \ { 'openid': { 'SERVERS': [ dict(id='mojeid', name='MojeId', openid_url='https://mojeid.cz/endpoint/', extra_attributes = [ ('phone', 'http://axschema.org/contact/phone/default', False), ('birth_date', 'http://axschema.org/birthDate', False,), ])]}} Attributes are in form (id, name, required) where id is key in extra_data field of socialaccount, name is identifier of requested attribute and required specifies whether attribute is required. If you want to manually include login links yourself, you can use the following template tag: .. code-block:: python {% load socialaccount %} Google The OpenID provider can be forced to operate in stateless mode as follows:: SOCIALACCOUNT_PROVIDERS = \ { 'openid': { 'SERVERS': [ dict(id='steam', name='Steam', openid_url='https://steamcommunity.com/openid', stateless=True, )]}} OpenStreetMap ------------- Register your client application under `My Settings`/`oauth settings`: https://www.openstreetmap.org/user/{Display Name}/oauth_clients In this page you will get your key and secret For more information: OpenStreetMap OAuth documentation: https://wiki.openstreetmap.org/wiki/OAuth ORCID ----- The ORCID provider should work out of the box provided that you are using the Production ORCID registry and the public API. In other settings, you will need to define the API you are using in your site's settings, as follows: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'orcid': { # Base domain of the API. Default value: 'orcid.org', for the production API 'BASE_DOMAIN':'sandbox.orcid.org', # for the sandbox API # Member API or Public API? Default: False (for the public API) 'MEMBER_API': True, # for the member API } } Patreon ------- The following Patreon settings are available: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'patreon': { 'VERSION': 'v1', 'SCOPE': ['pledges-to-me', 'users', 'my-campaign'], } } VERSION: API version. Either ``v1`` or ``v2``. Defaults to ``v1``. SCOPE: Defaults to the scope above if using API v1. If using v2, the scope defaults to ``['identity', 'identity[email]', 'campaigns', 'campaigns.members']``. API documentation: https://www.patreon.com/platform/documentation/clients App registration (get your key and secret for the API here): https://www.patreon.com/portal/registration/register-clients Development callback URL http://127.0.0.1:8000/accounts/patreon/login/callback/ Paypal ------ The following Paypal settings are available: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'paypal': { 'SCOPE': ['openid', 'email'], 'MODE': 'live', } } SCOPE: In the Paypal developer site, you must also check the required attributes for your application. For a full list of scope options, see https://developer.paypal.com/docs/integration/direct/identity/attributes/ MODE: Either ``live`` or ``test``. Set to test to use the Paypal sandbox. App registration (get your key and secret here) https://developer.paypal.com/webapps/developer/applications/myapps Development callback URL http://example.com/accounts/paypal/login/callback Persona ------- Note: Mozilla Persona was shut down on November 30th 2016. See `the announcement `_ for details. Mozilla Persona requires one setting, the "AUDIENCE" which needs to be the hardcoded hostname and port of your website. See https://developer.mozilla.org/en-US/Persona/Security_Considerations#Explicitly_specify_the_audience_parameter for more information why this needs to be set explicitly and can't be derived from user provided data: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'persona': { 'AUDIENCE': 'https://www.example.com', } } The optional ``REQUEST_PARAMETERS`` dictionary contains parameters that are passed as is to the ``navigator.id.request()`` method to influence the look and feel of the Persona dialog: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'persona': { 'AUDIENCE': 'https://www.example.com', 'REQUEST_PARAMETERS': {'siteName': 'Example'}, } } Pinterest --------- The Pinterest OAuth2 documentation: https://developers.pinterest.com/docs/api/overview/#authentication You can optionally specify additional permissions to use. If no ``SCOPE`` value is set, the Pinterest provider will use ``read_public`` by default. .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'pinterest': { 'SCOPE': [ 'read_public', 'read_relationships', ] } } SCOPE: For a full list of scope options, see https://developers.pinterest.com/docs/api/overview/#scopes QuickBooks ---------- App registration (get your key and secret here) https://developers.intuit.com/v2/ui#/app/startcreate Development callback URL http://localhost:8000/accounts/quickbooks/login/callback/ You can specify sandbox mode by adding the following to the SOCIALACCOUNT_PROVIDERS in your settings. You can also add space-delimited scope to utilize the QuickBooks Payments and Payroll API .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'quickbooks': { 'SANDBOX': TRUE, 'SCOPE': [ 'openid', 'com.intuit.quickbooks.accounting com.intuit.quickbooks.payment', 'profile', 'phone', ] } } Reddit ------ App registration (get your key and secret here) https://www.reddit.com/prefs/apps/ Development callback URL http://localhost:8000/accounts/reddit/login/callback/ By default, access to Reddit is temporary. You can specify the ``duration`` auth parameter to make it ``permanent``. You can optionally specify additional permissions to use. If no ``SCOPE`` value is set, the Reddit provider will use ``identity`` by default. In addition, you should override your user agent to comply with Reddit's API rules, and specify something in the format ``:: (by /u/)``. Otherwise, you will risk additional rate limiting in your application. .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'reddit': { 'AUTH_PARAMS': {'duration': 'permanent'}, 'SCOPE': ['identity', 'submit'], 'USER_AGENT': 'django:myappid:1.0 (by /u/yourredditname)', } } Salesforce ---------- The Salesforce provider requires you to set the login VIP as the provider model's 'key' (in addition to client id and secret). Production environments use https://login.salesforce.com/. Sandboxes use https://test.salesforce.com/. HTTPS is required for the callback. Development callback URL https://localhost:8000/accounts/salesforce/login/callback/ Salesforce OAuth2 documentation https://developer.salesforce.com/page/Digging_Deeper_into_OAuth_2.0_on_Force.com To Use: - Include allauth.socialaccount.providers.salesforce in INSTALLED_APPS - In a new Salesforce Developer Org, create a Connected App with OAuth (minimum scope id, openid), and a callback URL - Create a Social application in Django admin, with client id, client key, and login_url (in "key" field) ShareFile --------- The following ShareFile settings are available. https://api.sharefile.com/rest/ SUBDOMAIN: Subdomain of your organization with ShareFile. This is required. Example: ``test`` for ``https://test.sharefile.com`` APICP: Defaults to ``secure``. Refer to the ShareFile documentation if you need to change this value. DEFAULT_URL: Defaults to ``https://secure.sharefile.com`` Refer to the ShareFile documentation if you need to change this value. Example: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'sharefile': { 'SUBDOMAIN': 'TEST', 'APICP': 'sharefile.com', 'DEFAULT_URL': 'https://secure.sharefile.com', } } Shopify ------- The Shopify provider requires a ``shop`` parameter to login. For example, for a shop ``petstore.myshopify.com``, use this:: /accounts/shopify/login/?shop=petstore You can create login URLs like these as follows: .. code-block:: python {% provider_login_url "shopify" shop="petstore" %} For setting up authentication in your app, use this url as your ``App URL`` (if your server runs at localhost:8000):: http://localhost:8000/accounts/shopify/login/ And set ``Redirection URL`` to:: http://localhost:8000/accounts/shopify/login/callback/ **Embedded Apps** If your Shopify app is embedded you will want to tell allauth to do the required JS (rather than server) redirect.:: SOCIALACCOUNT_PROVIDERS = { 'shopify': { 'IS_EMBEDDED': True, } } Note that there is more an embedded app creator must do in order to have a page work as an iFrame within Shopify (building the x_frame_exempt landing page, handing session expiration, etc...). However that functionality is outside the scope of django-allauth. **Online/per-user access mode** Shopify has two access modes, offline (the default) and online/per-user. Enabling 'online' access will cause all-auth to tie the logged in Shopify user to the all-auth account (rather than the shop as a whole).:: SOCIALACCOUNT_PROVIDERS = { 'shopify': { 'AUTH_PARAMS': {'grant_options[]': 'per-user'}, } } Slack ----- App registration (get your key and secret here) https://api.slack.com/apps/new Development callback URL http://example.com/accounts/slack/login/callback/ API documentation https://api.slack.com/docs/sign-in-with-slack SoundCloud ---------- SoundCloud allows you to choose between OAuth1 and OAuth2. Choose the latter. App registration (get your key and secret here) http://soundcloud.com/you/apps/new Development callback URL http://example.com/accounts/soundcloud/login/callback/ Stack Exchange -------------- Register your OAuth2 app over at ``http://stackapps.com/apps/oauth/register``. Do not enable "Client Side Flow". For local development you can simply use "localhost" for the OAuth domain. As for all providers, provider specific data is stored in ``SocialAccount.extra_data``. For Stack Exchange we need to choose what data to store there by choosing the Stack Exchange site (e.g. Stack Overflow, or Server Fault). This can be controlled by means of the ``SITE`` setting: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'stackexchange': { 'SITE': 'stackoverflow', } } Steam ----- Steam is an OpenID-compliant provider. However, the `steam` provider allows access to more of the user's details such as username, full name, avatar, etc. You need to register an API key here: https://steamcommunity.com/dev/apikey Copy the Key supplied by the website above into BOTH Client ID and Secret Key fields of the Social Application. Stocktwits ---------- App Registration https://api.stocktwits.com/developers/apps/new - Site Domain, Must be an external url (127.0.0.1 and localhost do not work). - Consumer key is your ``client id`` - Consumer secret is your ``secret key`` Strava ------ Register your OAuth2 app in api settings page: https://strava.com/settings/api In this page you will get your key and secret Development callback URL (only the domain is required on strava.com/settings/api) http://example.com/accounts/strava/login/callback/ For more information: Strava auth documentation: https://developers.strava.com/docs/authentication/ API documentation: https://developers.strava.com/docs/reference/ Stripe ------ You register your OAUth2 app via the Connect->Settings page of the Stripe dashboard: https://dashboard.stripe.com/account/applications/settings This page will provide you with both a Development and Production `client_id`. You can also register your OAuth2 app callback on the Settings page in the "Website URL" box, e.g.: http://example.com/accounts/stripe/login/callback/ However, the OAuth2 secret key is not on this page. The secret key is the same secret key that you use with the Stripe API generally. This can be found on the Stripe dashboard API page: https://dashboard.stripe.com/account/apikeys See more in documentation https://stripe.com/docs/connect/standalone-accounts TrainingPeaks ------------- You need to request an API Partnership to get your OAth credentials: https://api.trainingpeaks.com/request-access Make sure to request scope `athlete:profile` to be able to use OAuth for user login (default if setting `SCOPE` is omitted). In development you should only use the sandbox services, which is the default unless you set `USE_PRODUCTION` to `True`. .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'trainingpeaks': { 'SCOPE': ['athlete:profile'], 'USE_PRODUCTION': False, } } API documentation: https://github.com/TrainingPeaks/PartnersAPI/wiki Trello ------ Register the application at https://trello.com/app-key You get one application key per account. Save the "Key" to "Client id", the "Secret" to "Secret Key" and "Key" to the "Key" field. Verify which scope you need at https://developers.trello.com/page/authorization Need to change the default scope? Add or update the `trello` setting to `settings.py` .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'trello': { 'AUTH_PARAMS': { 'scope': 'read,write', }, }, } Twitch ------ App registration (get your key and secret here) http://dev.twitch.tv/console Development callback URL http://localhost:8000/accounts/twitch/login/callback/ Twitter ------- You will need to create a Twitter app and configure the Twitter provider for your Django application via the admin interface. App registration **************** To register an app on Twitter you will need a Twitter account. With an account, you can create a new app via:: https://apps.twitter.com/app/new In the app creation form fill in the development callback URL:: http://127.0.0.1:8000/accounts/twitter/login/callback/ Twitter won't allow using http://localhost:8000. For production use a callback URL such as:: http://{{yourdomain}}.com/accounts/twitter/login/callback/ To allow users to login without authorizing each session, select "Allow this application to be used to Sign in with Twitter" under the application's "Settings" tab. App database configuration through admin **************************************** The second part of setting up the Twitter provider requires you to configure your Django application. Configuration is done by creating a Socialapp object in the admin. Add a social app on the admin page:: /admin/socialaccount/socialapp/ Use the twitter keys tab of your application to fill in the form. It's located:: https://apps.twitter.com/app/{{yourappid}}/keys The configuration is as follows: * Provider, "Twitter" * Name, your pick, suggest "Twitter" * Client id, is called "Consumer Key (API Key)" on Twitter * Secret key, is called "Consumer Secret (API Secret)" on Twitter * Key, is not needed, leave blank Untappd ------- App registration **************** https://untappd.com/api/register?register=new In the app creation form fill in the development callback URL, e.g.:: http://127.0.0.1:8000/accounts/untappd/login/callback/ For production, make it your production host, e.g.:: http://yoursite.com/accounts/untappd/login/callback/ SocialApp configuration *********************** The configuration values come from your API dashboard on Untappd: https://untappd.com/api/dashboard * Provider: "Untappd" * Name: "Untappd" * Client id: "Client ID" from Untappd * Secret key: "Client Secret" from Untappd * Sites: choose your site In addition, you should override your user agent to comply with Untappd's API rules, and specify something in the format ``::``. Otherwise, you will risk additional rate limiting in your application. .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'untappd': { 'USER_AGENT': 'django:myappid:1.0', } } Telegram -------- .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'telegram': { 'TOKEN': 'insert-token-received-from-botfather' } } Vimeo ----- App registration (get your key and secret here) https://developer.vimeo.com/apps Development callback URL http://localhost:8000/a Vimeo (OAuth 2) --------------- App registration (get your key and secret here) https://developer.vimeo.com/apps Development callback URL http://localhost:8000/accounts/vimeo_oauth2/login/callback/ VK -- App registration https://vk.com/editapp?act=create Development callback URL ("Site address") http://localhost Windows Live ------------ The Windows Live provider currently does not use any settings in ``SOCIALACCOUNT_PROVIDERS``. App registration (get your key and secret here) https://apps.dev.microsoft.com/#/appList Development callback URL http://localhost:8000/accounts/windowslive/login/callback/ Microsoft calls the "client_id" an "Application Id" and it is a UUID. Also, the "client_secret" is not created by default, you must edit the application after it is created, then click "Generate New Password" to create it. Weibo ----- Register your OAuth2 app over at ``http://open.weibo.com/apps``. Unfortunately, Weibo does not allow for specifying a port number in the authorization callback URL. So for development purposes you have to use a callback url of the form ``http://127.0.0.1/accounts/weibo/login/callback/`` and run ``runserver 127.0.0.1:80``. Weixin ------ The Weixin OAuth2 documentation: https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=&lang=zh_CN Weixin supports two kinds of oauth2 authorization, one for open platform and one for media platform, AUTHORIZE_URL is the only difference between them, you can specify ``AUTHORIZE_URL`` in setting, If no ``AUTHORIZE_URL`` value is set will support open platform by default, which value is ``https://open.weixin.qq.com/connect/qrconnect``. You can optionally specify additional scope to use. If no ``SCOPE`` value is set, will use ``snsapi_login`` by default(for Open Platform Account, need registration). Other ``SCOPE`` options are: snsapi_base, snsapi_userinfo. .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'weixin': { 'AUTHORIZE_URL': 'https://open.weixin.qq.com/connect/oauth2/authorize', # for media platform 'SCOPE': ['snsapi_base'], } } Xing ---- App registration (get your key and secret here) https://dev.xing.com/applications Development callback URL http://localhost:8000 Yahoo ------ Register your OAuth2 app below and enter the resultant client id and secret into admin https://developer.yahoo.com/apps/create/ The Redirect URL requires secure URLs, please see the section on HTTPS about how this is handled. When you register the app within yahoo, ensure you select the following API Permissions - OpenID Connect Permissions - Email - Profile When copying the supplied Client ID and Client Secret, do not include the 4 starting spaces. Yandex ------ App registration (get key and secret here) https://oauth.yandex.com/client/new Development callback URL https://oauth.yandex.com/verification_code Yandex OAuth app has many different access rights for its services. For the basic access level, you just need to a choose "Yandex.Passport API" section and check "Access to email address" and "Access to username, first name and surname, gender". Everything else is optional. YNAB ------ App Registration https://app.youneedabudget.com/settings/developer Development callback URL http://127.0.0.1:8000/accounts/ynab/login/callback/ Default SCOPE permissions are 'read-only'. If this is the desired functionality, do not add SCOPE entry with ynab app in SOCIALACCOUNT_PROVIDERS. Otherwise, adding SCOPE and an empty string will give you read / write. .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'ynab': { 'SCOPE': '' } } Zoho ---- App Registration https://api-console.zoho.com/add Select "Server-base Applications" Authorized Redirect URI http://127.0.0.1:8000/accounts/zoho/login/callback/ Zoom ---- App Registration https://marketplace.zoom.us/develop/create Development callback URL http://127.0.0.1:8000/accounts/zoom/login/callback/ Select scope user:read during app registration. Feishu ---- App Registration https://open.feishu.cn/app Authorized Redirect URI http://127.0.0.1:8000/accounts/feishu/login/callback/ Into the developer background https://open.feishu.cn/app, click on the create self-built application, obtain app_id and app_secret. In the configuration of application security domain name added to redirect URL, such as https://open.feishu.cn/document. Redirect URL is the interface through which the application obtains the user's identity by using the user login pre-authorization code after the user has logged in. If it is not configured or configured incorrectly, the open platform will prompt the request to be illegal. django-allauth-0.47.0/docs/release-notes.rst000066400000000000000000000001131415442050100207130ustar00rootroot00000000000000============= Release Notes ============= .. include:: ../ChangeLog.rst django-allauth-0.47.0/docs/signals.rst000066400000000000000000000053651415442050100176230ustar00rootroot00000000000000Signals ======= There are several signals emitted during authentication flows. You can hook to them for your own needs. allauth.account --------------- - ``allauth.account.signals.user_logged_in(request, user)`` Sent when a user logs in. - ``allauth.account.signals.user_logged_out(request, user)`` Sent when a user logs out. - ``allauth.account.signals.user_signed_up(request, user)`` Sent when a user signs up for an account. This signal is typically followed by a ``user_logged_in``, unless e-mail verification prohibits the user to log in. - ``allauth.account.signals.password_set(request, user)`` Sent when a password has been successfully set for the first time. - ``allauth.account.signals.password_changed(request, user)`` Sent when a password has been successfully changed. - ``allauth.account.signals.password_reset(request, user)`` Sent when a password has been successfully reset. - ``allauth.account.signals.email_confirmed(request, email_address)`` Sent after the email address in the db was updated and set to confirmed. - ``allauth.account.signals.email_confirmation_sent(request, confirmation, signup)`` Sent right after the email confirmation is sent. - ``allauth.account.signals.email_changed(request, user, from_email_address, to_email_address)`` Sent when a primary email address has been changed. - ``allauth.account.signals.email_added(request, user, email_address)`` Sent when a new email address has been added. - ``allauth.account.signals.email_removed(request, user, email_address)`` Sent when an email address has been deleted. allauth.socialaccount --------------------- - ``allauth.socialaccount.signals.pre_social_login(request, sociallogin)`` Sent after a user successfully authenticates via a social provider, but before the login is fully processed. This signal is emitted as part of the social login and/or signup process, as well as when connecting additional social accounts to an existing account. Access tokens and profile information, if applicable for the provider, is provided. - ``allauth.socialaccount.signals.social_account_added(request, sociallogin)`` Sent after a user connects a social account to a their local account. - ``allauth.socialaccount.signals.social_account_updated(request, sociallogin)`` Sent after a social account has been updated. This happens when a user logs in using an already connected social account, or completes a `connect` flow for an already connected social account. Useful if you need to unpack extra data for social accounts as they are updated. - ``allauth.socialaccount.signals.social_account_removed(request, socialaccount)`` Sent after a user disconnects a social account from their local account. django-allauth-0.47.0/docs/support.rst000066400000000000000000000001101415442050100176560ustar00rootroot00000000000000.. include:: ../README.rst :start-after: with flows that just work. django-allauth-0.47.0/docs/templates.rst000066400000000000000000000055501415442050100201550ustar00rootroot00000000000000Templates ========= Overridable templates --------------------- ``allauth`` ships many templates, viewable in the `allauth/templates `__ directory. For instance, the view corresponding to the ``account_login`` URL uses the template ``account/login.html``. If you create a file with this name in your code layout, it can override the one shipped with ``allauth``. Template Tags ------------- The following template tag libraries are available: - ``account``: tags for dealing with accounts in general - ``socialaccount``: tags focused on social accounts Account Tags ************ Use ``user_display`` to render a user name without making assumptions on how the user is represented (e.g. render the username, or first name?):: {% load account %} {% user_display user %} Or, if you need to use in a ``{% blocktrans %}``:: {% load account %} {% user_display user as user_display %} {% blocktrans %}{{ user_display }} has logged in...{% endblocktrans %} Then, override the ``ACCOUNT_USER_DISPLAY`` setting with your project specific user display callable. Social Account Tags ******************* Use the ``provider_login_url`` tag to generate provider specific login URLs:: {% load socialaccount %} Google Twitter Here, you can pass along an optional ``process`` parameter that indicates how to process the social login. You can choose between ``login`` and ``connect``:: Connect a Twitter account Furthermore, you can pass along an ``action`` parameter with value ``reauthenticate`` to indicate that you want the user to be re-prompted for authentication even if they already signed in before. For now, this is supported by Facebook, Google and Twitter only. For Javascript based logins (e.g. when you enable the Facebook JS SDK), you will need to make sure that the required Javascript is loaded. The following tag loads all scripts for the enabled providers:: {% providers_media_js %} For easy access to the social accounts for a user use:: {% get_social_accounts user as accounts %} Then:: {{accounts.twitter}} -- a list of connected Twitter accounts {{accounts.twitter.0}} -- the first Twitter account {% if accounts %} -- if there is at least one social account Finally, social authentication providers configured for the current site can be retrieved via:: {% get_providers as socialaccount_providers %} Which will populate the ``socialaccount_providers`` variable in the template context with a list of configured social authentication providers. This supersedes the context processor used in version 0.21 and below. django-allauth-0.47.0/docs/views.rst000066400000000000000000000065371415442050100173220ustar00rootroot00000000000000Views ===== Login (``account_login``) ------------------------- Users login via the ``allauth.account.views.LoginView`` view over at ``/accounts/login/`` (URL name ``account_login``). When users attempt to login while their account is inactive (``user.is_active``) they are presented with the ``account/account_inactive.html`` template. Signup (``account_signup``) --------------------------- Users sign up via the ``allauth.account.views.SignupView`` view over at ``/accounts/signup/`` (URL name ``account_signup``). Logout (``account_logout``) ---------------------------- The logout view (``allauth.account.views.LogoutView``) over at ``/accounts/logout/`` (URL name ``account_logout``) requests for confirmation before logging out. The user is logged out only when the confirmation is received by means of a POST request. If you are wondering why, consider what happens when a malicious user embeds the following image in a post:: For this and more background information on the subject, see: - https://code.djangoproject.com/ticket/15619 - http://stackoverflow.com/questions/3521290/logout-get-or-post If you insist on having logout on GET, then please consider adding a bit of Javascript to automatically turn a click on a logout link into a POST. As a last resort, you can set ``ACCOUNT_LOGOUT_ON_GET`` to ``True``. Password Management ------------------- Authenticated users can manage their password account using the ``allauth.account.views.PasswordSetView`` and ``allauth.account.views.PasswordChangeView`` views, over at ``/accounts/password/set/`` respectively ``/accounts/password/change/`` (URL names ``account_set_password`` and ``account_change_password`` respectively). Users are redirected between these views, according to whether or not they have setup a password (``user.has_usable_password()``). Typically, when users signup via a social provider they will not have a password set. Password Reset (``account_reset_password``) ------------------------------------------- Users can request a password reset using the ``allauth.account.views.PasswordResetView`` view over at ``/accounts/password/reset/`` (URL name ``account_reset_password``). An e-mail will be sent containing a reset link pointing to ``PasswordResetFromKeyView`` view. E-mails Management (``account_email``) -------------------------------------- Users manage the e-mail addresses tied to their account using the ``allauth.account.views.EmailView`` view over at ``/accounts/email/`` (URL name ``account_email``). Here, users can add (and verify) e-mail addresses, remove e-mail addresses, and choose a new primary e-mail address. E-mail Verification ------------------- Depending on the setting ``ACCOUNT_EMAIL_VERIFICATION``, a verification e-mail is sent pointing to the ``allauth.account.views.ConfirmEmailView`` view. The setting ``ACCOUNT_CONFIRM_EMAIL_ON_GET`` determines whether users have to manually confirm the address by submiting a confirmation form, or whether the address is automatically confirmed by a mere GET request. Social Connections (``socialaccount_connections``) -------------------------------------------------- The ``allauth.socialaccount.views.ConnectionsView`` view over at ``/accounts/social/connections/`` (URL name ``socialaccount_connections``) allows users to manage the social accounts tied to their local account. django-allauth-0.47.0/example/000077500000000000000000000000001415442050100161235ustar00rootroot00000000000000django-allauth-0.47.0/example/README.rst000066400000000000000000000023511415442050100176130ustar00rootroot00000000000000=============================== Running the example application =============================== Assuming you use virtualenv, follow these steps to download and run the django-allauth example application in this directory: :: $ git clone git://github.com/pennersr/django-allauth.git $ cd django-allauth/example $ virtualenv venv $ . venv/bin/activate $ pip install .. Now we need to create the database tables and an admin user. Run the following and when prompted to create a superuser choose yes and follow the instructions: :: $ python manage.py migrate $ python manage.py createsuperuser Now you need to run the Django development server: :: $ python manage.py runserver You should then be able to open your browser on http://127.0.0.1:8000 and see a page with links to sign in or sign up. Example Bootstrap templates --------------------------- There are templates in the ``templates/bootstrap/allauth/account/`` that can be used with Twitter's `Bootstrap `_ library. To use these templates, in addition to the above commands, you will need to :: $ pip install django-bootstrap-form and put ``bootstrapform`` into ``INSTALLED_APPS`` in your ``settings.py`` file. django-allauth-0.47.0/example/example/000077500000000000000000000000001415442050100175565ustar00rootroot00000000000000django-allauth-0.47.0/example/example/__init__.py000066400000000000000000000000001415442050100216550ustar00rootroot00000000000000django-allauth-0.47.0/example/example/demo/000077500000000000000000000000001415442050100205025ustar00rootroot00000000000000django-allauth-0.47.0/example/example/demo/__init__.py000066400000000000000000000001701415442050100226110ustar00rootroot00000000000000import django if django.VERSION < (3, 2): # pragma: no cover default_app_config = "example.demo.apps.DemoConfig" django-allauth-0.47.0/example/example/demo/apps.py000066400000000000000000000033201415442050100220150ustar00rootroot00000000000000from django.apps import AppConfig from django.db.models.signals import post_migrate from django.utils.translation import gettext_lazy as _ def setup_dummy_social_apps(sender, **kwargs): """ `allauth` needs tokens for OAuth based providers. So let's setup some dummy tokens """ from django.contrib.sites.models import Site from allauth.socialaccount.models import SocialApp from allauth.socialaccount.providers import registry from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider from allauth.socialaccount.providers.oauth.provider import OAuthProvider site = Site.objects.get_current() for provider in registry.get_list(): if isinstance(provider, OAuth2Provider) or isinstance(provider, OAuthProvider): try: SocialApp.objects.get(provider=provider.id, sites=site) except SocialApp.DoesNotExist: print( "Installing dummy application credentials for %s." " Authentication via this provider will not work" " until you configure proper credentials via the" " Django admin (`SocialApp` models)" % provider.id ) app = SocialApp.objects.create( provider=provider.id, secret="secret", client_id="client-id", name="Dummy %s app" % provider.id, ) app.sites.add(site) class DemoConfig(AppConfig): name = "example.demo" verbose_name = _("Demo") default_auto_field = 'django.db.models.AutoField' def ready(self): post_migrate.connect(setup_dummy_social_apps, sender=self) django-allauth-0.47.0/example/example/demo/models.py000066400000000000000000000000001415442050100223250ustar00rootroot00000000000000django-allauth-0.47.0/example/example/demo/tests.py000066400000000000000000000005771415442050100222270ustar00rootroot00000000000000""" This file demonstrates writing tests using the unittest module. These will pass when you run "manage.py test". Replace this with more appropriate tests for your application. """ from django.test import TestCase class SimpleTest(TestCase): def test_basic_addition(self): """ Tests that 1 + 1 always equals 2. """ self.assertEqual(1 + 1, 2) django-allauth-0.47.0/example/example/demo/views.py000066400000000000000000000000321415442050100222040ustar00rootroot00000000000000# Create your views here. django-allauth-0.47.0/example/example/local_settings.example000066400000000000000000000067421415442050100241560ustar00rootroot00000000000000# django-allauth Configuration variables you might like to change. # # DO NOT CHANGE THIS FILE. Instead, copy it to local_settings.py # and make your changes there. # Specifies the login method to use -- whether the user logs in by entering # their username, e-mail address, or either one of both. Possible values # are 'username' | 'email' | 'username_email' # ACCOUNT_AUTHENTICATION_METHOD # The URL to redirect to after a successful e-mail confirmation, in case no # user is logged in. Default value is settings.LOGIN_URL. # ACCOUNT_EMAIL_CONFIRMATION_ANONYMOUS_REDIRECT_URL # The URL to redirect to after a successful e-mail confirmation, in case of # an authenticated user. Default is settings.LOGIN_REDIRECT_URL # ACCOUNT_EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL # Determines the expiration date of email confirmation mails (# of days). # ACCOUNT_EMAIL_CONFIRMATION_EXPIRE_DAYS = 3 # The user is required to hand over an e-mail address when signing up. # ACCOUNT_EMAIL_REQUIRED = False # Determines the e-mail verification method during signup. When set to # "mandatory" the user is blocked from logging in until the email # address is verified. Choose "optional" or "none" to allow logins # with an unverified e-mail address. In case of "optional", the e-mail # verification mail is still sent, whereas in case of "none" no e-mail # verification mails are sent. # ACCOUNT_EMAIL_VERIFICATION = "optional" # Subject-line prefix to use for email messages sent. By default, the name # of the current Site (django.contrib.sites) is used. # ACCOUNT_EMAIL_SUBJECT_PREFIX = '[Site] ' # A string pointing to a custom form class # (e.g. 'myapp.forms.SignupForm') that is used during signup to ask # the user for additional input (e.g. newsletter signup, birth # date). This class should implement a `def signup(self, request, user)` # method, where user represents the newly signed up user. # ACCOUNT_SIGNUP_FORM_CLASS = None # When signing up, let the user type in their password twice to avoid typ-o's. # ACCOUNT_SIGNUP_PASSWORD_VERIFICATION = True # Enforce uniqueness of e-mail addresses. # ACCOUNT_UNIQUE_EMAIL = True # A callable (or string of the form 'some.module.callable_name') that takes # a user as its only argument and returns the display name of the user. The # default implementation returns user.username. # ACCOUNT_USER_DISPLAY # An integer specifying the minimum allowed length of a username. # ACCOUNT_USERNAME_MIN_LENGTH = 1 # The user is required to enter a username when signing up. Note that the # user will be asked to do so even if ACCOUNT_AUTHENTICATION_METHOD is set # to email. Set to False when you do not wish to prompt the user to enter a # username. # ACCOUNT_USERNAME_REQUIRED = True # render_value parameter as passed to PasswordInput fields. # ACCOUNT_PASSWORD_INPUT_RENDER_VALUE = False # Request e-mail address from 3rd party account provider? E.g. using OpenID # AX, or the Facebook 'email' permission. # SOCIALACCOUNT_QUERY_EMAIL = ACCOUNT_EMAIL_REQUIRED # Attempt to bypass the signup form by using fields (e.g. username, email) # retrieved from the social account provider. If a conflict arises due to a # duplicate e-mail address the signup form will still kick in. # SOCIALACCOUNT_AUTO_SIGNUP = True # Enable support for django-avatar. When enabled, the profile image of the # user is copied locally into django-avatar at signup. Default is # 'avatar' in settings.INSTALLED_APPS. # SOCIALACCOUNT_AVATAR_SUPPORT # Dictionary containing provider specific settings. # SOCIALACCOUNT_PROVIDERS django-allauth-0.47.0/example/example/locale/000077500000000000000000000000001415442050100210155ustar00rootroot00000000000000django-allauth-0.47.0/example/example/locale/nl/000077500000000000000000000000001415442050100214265ustar00rootroot00000000000000django-allauth-0.47.0/example/example/locale/nl/LC_MESSAGES/000077500000000000000000000000001415442050100232135ustar00rootroot00000000000000django-allauth-0.47.0/example/example/locale/nl/LC_MESSAGES/django.mo000066400000000000000000000112051415442050100250110ustar00rootroot00000000000000/C ! 5@SIk 9;BSpd  lB~Yaj > P= H' p   @     $ C@     7   . vC    jUk\d m    <%  dB\2Rn !'%/& #),("+$- * . AccountAccount ConnectionsAdd E-mailAdd E-mail AddressAdd a 3rd Party AccountAlready have an account? Then please sign in.Bad TokenChange PasswordConfirmConfirm E-mail AddressConnected AccountsDo you really want to remove the selected e-mail address?E-mailE-mail AddressesForgot Password?Forgotten your password? Enter your e-mail address below, and we'll send you an e-mail allowing you to reset it.Make PrimaryMy AccountNone!OpenID Sign InPassword ResetPlease confirm that %(email)s is an e-mail address for user %(user_display)s.Please contact us if you have any trouble resetting your password.Please sign in with one of your existing third party accounts. Or, sign up for a %(site_name)s account and sign in below:PrimaryProviderRe-send VerificationRemoveReset My PasswordSet PasswordSign InSign UpSignupStatusThe following e-mail addresses are associated to your account:The password reset link was invalid, possibly because it has already been used. Please request a new password reset.UnverifiedVerifiedWarning:You are about to use your %(provider_name)s account to login to %(site_name)s. As a final step, please complete the following form:You can sign in to your account using any of the following third party accounts:You currently do not have any e-mail address set up. You should really add an e-mail address so you can receive notifications, reset your password, etc.You currently have no social network accounts connected to this account.Your password is now changed.change passwordorProject-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2012-09-04 20:44+0200 PO-Revision-Date: 2012-09-04 20:45+0200 Last-Translator: FULL NAME Language-Team: LANGUAGE Language: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit AccountAccount ConnectiesE-mail toevoegenVoeg e-mail adres toeVoeg een extern account toeHeb je al een account? Meld je dan aan.Ongeldige sleutelWachtwoord wijzigenBevestigenBevestig e-mail adresGekoppelde accountsWil je het geselecteerde e-mail adres echt verwijderen?E-mailE-mail adressenWachtwoord vergeten?Wachtwoord vergeten? Vul je e-mail adres in en we sturen je een e-mail waarmee je een nieuw wachtwoord kunt instellen.Maak primairMijn AccountGeen!Aanmelden via OpenIDNieuw wachtwoordBevestig dat %(email)s een e-mail adres is voor gebruiker %(user_display)s.Neem a.u.b. contact met ons op als het niet lukt je wachtwoord opnieuw in te stellen.Meld je aan met een van je bestaande externe accounts. Of, registreer voor een %(site_name)s account en meld je hiermee aan:PrimairProviderStuur verificatie e-mail opnieuwVerwijderHerstel mijn wachtwoordZet wachtwoordAanmeldenRegistrerenRegistrerenStatusDe volgende e-mail adressen zijn gekoppeld aan jouw account:De link om je wachtwoord opnieuw in te stellen is niet geldig. Mogelijk is deze al een keer gebruikt. Herstel je wachtwoord opnieuw.OngeverifieerdGeverifieerdWaarschuwing:Om bij %(site_name)s in te kunnen loggen via %(provider_name)s hebben we de volgende gegevens nodig:Je kunt jezelf aanmelden met een van de volgende externe accounts:Het is raadzaam een e-mail adres toe te voegen zodat je notificaties kunt ontvangen, je wachtwoord opnieuw kunt instellen, enz.Je hebt momenteel geen externe accounts gekoppeld.Je wachtwoord is gewijzigd.Wachtwoord wijzigenofdjango-allauth-0.47.0/example/example/locale/nl/LC_MESSAGES/django.po000066400000000000000000000524631415442050100250270ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-09-04 20:44+0200\n" "PO-Revision-Date: 2012-09-04 20:45+0200\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: templates/bootstrap/allauth/account/base.html:8 msgid "My Account" msgstr "Mijn Account" #: templates/bootstrap/allauth/account/base.html:12 #: templates/uniform/allauth/account/email.html:10 msgid "E-mail Addresses" msgstr "E-mail adressen" #: templates/bootstrap/allauth/account/base.html:15 #: templates/bootstrap/allauth/account/password_change.html:6 #: templates/bootstrap/allauth/account/password_change.html:14 #: templates/bootstrap/allauth/account/password_reset_from_key.html:7 #: templates/bootstrap/allauth/account/password_reset_from_key.html:10 #: templates/uniform/allauth/account/password_change.html:5 #: templates/uniform/allauth/account/password_change.html:8 #: templates/uniform/allauth/account/password_change.html:15 #: templates/uniform/allauth/account/password_reset_from_key.html:6 #: templates/uniform/allauth/account/password_reset_from_key.html:9 msgid "Change Password" msgstr "Wachtwoord wijzigen" #: templates/bootstrap/allauth/account/base.html:20 #: templates/bootstrap/allauth/socialaccount/connections.html:5 msgid "Connected Accounts" msgstr "Gekoppelde accounts" #: templates/bootstrap/allauth/account/email.html:7 #: templates/bootstrap/allauth/socialaccount/connections.html:34 #: templates/uniform/allauth/account/email.html:7 msgid "Account" msgstr "Account" #: templates/bootstrap/allauth/account/email.html:14 #: templates/uniform/allauth/account/email.html:13 msgid "The following e-mail addresses are associated to your account:" msgstr "De volgende e-mail adressen zijn gekoppeld aan jouw account:" #: templates/bootstrap/allauth/account/email.html:23 msgid "E-mail" msgstr "E-mail" #: templates/bootstrap/allauth/account/email.html:26 msgid "Status" msgstr "Status" #: templates/bootstrap/allauth/account/email.html:41 #: templates/uniform/allauth/account/email.html:27 msgid "Verified" msgstr "Geverifieerd" #: templates/bootstrap/allauth/account/email.html:43 #: templates/uniform/allauth/account/email.html:29 msgid "Unverified" msgstr "Ongeverifieerd" #: templates/bootstrap/allauth/account/email.html:45 #: templates/uniform/allauth/account/email.html:31 msgid "Primary" msgstr "Primair" #: templates/bootstrap/allauth/account/email.html:53 #: templates/uniform/allauth/account/email.html:37 msgid "Make Primary" msgstr "Maak primair" #: templates/bootstrap/allauth/account/email.html:54 #: templates/uniform/allauth/account/email.html:38 msgid "Re-send Verification" msgstr "Stuur verificatie e-mail opnieuw" #: templates/bootstrap/allauth/account/email.html:55 #: templates/bootstrap/allauth/socialaccount/connections.html:58 #: templates/uniform/allauth/account/email.html:39 msgid "Remove" msgstr "Verwijder" #: templates/bootstrap/allauth/account/email.html:62 #: templates/uniform/allauth/account/email.html:46 msgid "Warning:" msgstr "Waarschuwing:" #: templates/bootstrap/allauth/account/email.html:62 #: templates/uniform/allauth/account/email.html:46 msgid "" "You currently do not have any e-mail address set up. You should really add " "an e-mail address so you can receive notifications, reset your password, etc." msgstr "" "Het is raadzaam een e-mail adres toe te voegen zodat je notificaties kunt " "ontvangen, je wachtwoord opnieuw kunt instellen, enz." #: templates/bootstrap/allauth/account/email.html:67 #: templates/uniform/allauth/account/email.html:51 msgid "Add E-mail Address" msgstr "Voeg e-mail adres toe" #: templates/bootstrap/allauth/account/email.html:73 #: templates/uniform/allauth/account/email.html:58 msgid "Add E-mail" msgstr "E-mail toevoegen" #: templates/bootstrap/allauth/account/email.html:84 #: templates/uniform/allauth/account/email.html:70 msgid "Do you really want to remove the selected e-mail address?" msgstr "Wil je het geselecteerde e-mail adres echt verwijderen?" #: templates/bootstrap/allauth/account/email_confirm.html:7 #: templates/bootstrap/allauth/account/email_confirm.html:11 msgid "Confirm E-mail Address" msgstr "Bevestig e-mail adres" #: templates/bootstrap/allauth/account/email_confirm.html:15 #, python-format msgid "" "Please confirm that %(email)s is an e-mail " "address for user %(user_display)s." msgstr "" "Bevestig dat %(email)s een e-mail adres is " "voor gebruiker %(user_display)s." #: templates/bootstrap/allauth/account/email_confirm.html:19 msgid "Confirm" msgstr "Bevestigen" #: templates/bootstrap/allauth/account/login.html:8 #: templates/bootstrap/allauth/account/login.html:13 #: templates/bootstrap/allauth/account/login.html:45 #: templates/uniform/allauth/account/login.html:8 #: templates/uniform/allauth/account/login.html:13 #: templates/uniform/allauth/account/login.html:48 msgid "Sign In" msgstr "Aanmelden" #: templates/bootstrap/allauth/account/login.html:18 #: templates/uniform/allauth/account/login.html:18 #, python-format msgid "" "Please sign in with one\n" "of your existing third party accounts. Or, sign up for a %(site_name)s account and sign in\n" "below:" msgstr "" "Meld je aan met een van je bestaande externe accounts. Of, registreer voor een %(site_name)s account en " "meld je hiermee aan:" #: templates/bootstrap/allauth/account/login.html:29 #: templates/uniform/allauth/account/login.html:29 msgid "or" msgstr "of" #: templates/bootstrap/allauth/account/login.html:46 #: templates/uniform/allauth/account/login.html:46 msgid "Forgot Password?" msgstr "Wachtwoord vergeten?" #: templates/bootstrap/allauth/account/password_reset.html:7 #: templates/bootstrap/allauth/account/password_reset.html:11 #: templates/uniform/allauth/account/password_reset.html:7 #: templates/uniform/allauth/account/password_reset.html:11 msgid "Password Reset" msgstr "Nieuw wachtwoord" #: templates/bootstrap/allauth/account/password_reset.html:16 #: templates/uniform/allauth/account/password_reset.html:16 msgid "" "Forgotten your password? Enter your e-mail address below, and we'll send you " "an e-mail allowing you to reset it." msgstr "" "Wachtwoord vergeten? Vul je e-mail adres in en we sturen je een e-mail " "waarmee je een nieuw wachtwoord kunt instellen." #: templates/bootstrap/allauth/account/password_reset.html:22 #: templates/uniform/allauth/account/password_reset.html:23 msgid "Reset My Password" msgstr "Herstel mijn wachtwoord" #: templates/bootstrap/allauth/account/password_reset.html:26 #: templates/uniform/allauth/account/password_reset.html:28 msgid "Please contact us if you have any trouble resetting your password." msgstr "Neem a.u.b. contact met ons op als het niet lukt je wachtwoord opnieuw in te stellen." #: templates/bootstrap/allauth/account/password_reset_from_key.html:10 #: templates/uniform/allauth/account/password_reset_from_key.html:9 msgid "Bad Token" msgstr "Ongeldige sleutel" #: templates/bootstrap/allauth/account/password_reset_from_key.html:14 #: templates/uniform/allauth/account/password_reset_from_key.html:13 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "De link om je wachtwoord opnieuw in te stellen is niet geldig. Mogelijk is " "deze al een keer gebruikt. Herstel je " "wachtwoord opnieuw." #: templates/bootstrap/allauth/account/password_reset_from_key.html:22 #: templates/uniform/allauth/account/password_reset_from_key.html:21 msgid "change password" msgstr "Wachtwoord wijzigen" #: templates/bootstrap/allauth/account/password_reset_from_key.html:26 #: templates/uniform/allauth/account/password_reset_from_key.html:26 msgid "Your password is now changed." msgstr "Je wachtwoord is gewijzigd." #: templates/bootstrap/allauth/account/password_set.html:6 #: templates/bootstrap/allauth/account/password_set.html:14 #: templates/uniform/allauth/account/password_set.html:6 #: templates/uniform/allauth/account/password_set.html:9 #: templates/uniform/allauth/account/password_set.html:16 msgid "Set Password" msgstr "Zet wachtwoord" #: templates/bootstrap/allauth/account/signup.html:7 #: templates/bootstrap/allauth/socialaccount/signup.html:6 #: templates/uniform/allauth/account/signup.html:7 #: templates/uniform/allauth/socialaccount/signup.html:6 msgid "Signup" msgstr "Registreren" #: templates/bootstrap/allauth/account/signup.html:10 #: templates/bootstrap/allauth/account/signup.html:24 #: templates/bootstrap/allauth/socialaccount/signup.html:9 #: templates/bootstrap/allauth/socialaccount/signup.html:21 #: templates/uniform/allauth/account/signup.html:10 #: templates/uniform/allauth/account/signup.html:25 #: templates/uniform/allauth/socialaccount/signup.html:9 #: templates/uniform/allauth/socialaccount/signup.html:22 msgid "Sign Up" msgstr "Registreren" #: templates/bootstrap/allauth/account/signup.html:15 #: templates/uniform/allauth/account/signup.html:15 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "Heb je al een account? Meld je dan aan." #: templates/bootstrap/allauth/socialaccount/connections.html:11 #: templates/uniform/allauth/socialaccount/connections.html:11 msgid "" "You can sign in to your account using any of the following third party " "accounts:" msgstr "Je kunt jezelf aanmelden met een van de volgende externe accounts:" #: templates/bootstrap/allauth/socialaccount/connections.html:31 msgid "Provider" msgstr "Provider" #: templates/bootstrap/allauth/socialaccount/connections.html:67 msgid "None!" msgstr "Geen!" #: templates/bootstrap/allauth/socialaccount/connections.html:67 msgid "" "You currently have no social network accounts connected to this account." msgstr "Je hebt momenteel geen externe accounts gekoppeld." #: templates/bootstrap/allauth/socialaccount/connections.html:71 #: templates/uniform/allauth/socialaccount/connections.html:46 msgid "Add a 3rd Party Account" msgstr "Voeg een extern account toe" #: templates/bootstrap/allauth/socialaccount/signup.html:11 #: templates/uniform/allauth/socialaccount/signup.html:11 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to \n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Om bij %(site_name)s in te kunnen loggen via %(provider_name)s hebben we de " "volgende gegevens nodig:" #: templates/uniform/allauth/openid/login.html:11 msgid "OpenID Sign In" msgstr "Aanmelden via OpenID" #: templates/uniform/allauth/socialaccount/connections.html:5 #: templates/uniform/allauth/socialaccount/connections.html:8 msgid "Account Connections" msgstr "Account Connecties" #~ msgid "" #~ "If you have any trouble resetting your password, contact us at %(CONTACT_EMAIL)s." #~ msgstr "" #~ "Als je problemen hebt je wachtwoord opnieuw in te stellen, neem dan " #~ "contact op met %(CONTACT_EMAIL)s." #, fuzzy #~ msgid "Conntected Accounts" #~ msgstr "Gekoppelde accounts" #~ msgid "Language" #~ msgstr "Taal" #~ msgid "Pinax can be used in your preferred language." #~ msgstr "Deze site kan in jouw voorkeurstaal gebruikt worden." #~ msgid "Change my language" #~ msgstr "Verander mijn taal" #~ msgid "Signed Out" #~ msgstr "Afgemeld" #~ msgid "You have signed out." #~ msgstr "Je bent afgemeld." #~ msgid "Delete Password" #~ msgstr "Wis wachtwoord" #~ msgid "" #~ "You may delete your password since you are currently logged in using " #~ "OpenID." #~ msgstr "Je kunt je wachtwoord wissen omdat je via OpenID bent ingelogd." #~ msgid "delete my password" #~ msgstr "Wis mijn wachtwoord" #~ msgid "Password Deleted" #~ msgstr "Wachtwoord gewist" #~ msgid "Your password has been deleted." #~ msgstr "Je wachtwoord is gewist." #~ msgid "" #~ "We have sent you an e-mail. If you do not receive it within a few " #~ "minutes, contact us at " #~ "%(CONTACT_EMAIL)s." #~ msgstr "" #~ "We hebben je een e-mail verstuurd. Als je deze niet binnen enkele minuten " #~ "ontvangen hebt, neem dan contact op met %(CONTACT_EMAIL)s." #~ msgid "" #~ "You're receiving this e-mail because you or someone else has requested a " #~ "password for your user account at %(site_domain)s.\n" #~ "It can be safely ignored if you did not request a password reset. Click " #~ "the link below to reset your password.\n" #~ "\n" #~ "%(password_reset_url)s\n" #~ "\n" #~ "In case you forgot, your username is %(username)s.\n" #~ "\n" #~ "Thanks for using our site!\n" #~ msgstr "" #~ "Je ontvangt deze mail omdat er een verzoek is ingelegd om het wachtwoord " #~ "behorende bij je %(site_domain)s account opnieuw in te stellen. Je kunt " #~ "deze gerust mail negeren als je dit niet zelf gedaan hebt. Anders, klik " #~ "op de volgende link om je wachtwoord opnieuw in te stellen.\n" #~ "\n" #~ "%(password_reset_url)s\n" #~ "\n" #~ "Deze link hoort bij je account met gebruikersnaam %(username)s.\n" #~ "\n" #~ "Bedankt voor het gebruik van onze site!\n" #~ msgid "Already have an account?" #~ msgstr "Heb je al een account?" #~ msgid "Sign in" #~ msgstr "Aanmelden" #~ msgid "Timezone" #~ msgstr "Tijdzone" #~ msgid "Verify Your E-mail Address" #~ msgstr "Verifieer je e-mail adres" #~ msgid "" #~ "We have sent you an e-mail to %(email)s for verification. Follow " #~ "the link provided to finalize the signup process. If you do not receive " #~ "it within a few minutes, contact us at %(CONTACT_EMAIL)s." #~ msgstr "" #~ "We hebben een e-mail verstuurd aan %(email)s ter verificatie. Volg " #~ "de link in deze mail om je registratie af te sluiten. Als je de e-mail " #~ "niet binnen enkele minuten ontvangt, neem dan contact op met %(CONTACT_EMAIL)s." #~ msgid "Note" #~ msgstr "Notitie" #~ msgid "you are already logged in as %(user_display)s." #~ msgstr "je bent al ingelogd als %(user_display)s." #~ msgid "E-mail Address Confirmation" #~ msgstr "E-mail adres bevestiging" #~ msgid "Invalid confirmation key." #~ msgstr "Ongeldige bevestigingssleutel." #~ msgid "Account Inactive" #~ msgstr "Account inactief" #~ msgid "This account is inactive." #~ msgstr "Dit account is niet actief" #~ msgid "Social Network Login Failure" #~ msgstr "Aanmelden Mislukt" #~ msgid "" #~ "An error occured while attempting to login via your social network " #~ "account." #~ msgstr "" #~ "Er is een fout opgetreden toen we je wilde inloggen via je externe " #~ "account." #~ msgid "Login Cancelled" #~ msgstr "Aanmelden geannuleerd" #~ msgid "" #~ "You decided to cancel logging in to our site using one of your exisiting " #~ "accounts. If this was a mistake, please proceed to sign in." #~ msgstr "" #~ "Je hebt het aanmelden via een extern account geannuleerd. Als dit een " #~ "vergissing was, meld je dan opnieuw aan." #~ msgid "Password" #~ msgstr "Wachtwoord" #~ msgid "Remember Me" #~ msgstr "Onthouden" #~ msgid "Username" #~ msgstr "Gebruikersnaam" #~ msgid "This account is currently inactive." #~ msgstr "Dit account is niet actief" #~ msgid "The e-mail address and/or password you specified are not correct." #~ msgstr "Je e-mail adres en wachtwoord komen niet overeen." #~ msgid "The username and/or password you specified are not correct." #~ msgstr "Je gebruikersnaam en wachtwoord komen niet overeen." #~ msgid "E-mail (optional)" #~ msgstr "E-mail (optioneel)" #~ msgid "Usernames can only contain letters, numbers and underscores." #~ msgstr "" #~ "Gebruikersnamen mogen alleen letters, cijfers en liggende streepjes (_) " #~ "bevatten." #~ msgid "This username is already taken. Please choose another." #~ msgstr "Deze gebruikersnaam is al in gebruik. Kies a.u.b. een andere naam." #~ msgid "A user is registered with this e-mail address." #~ msgstr "Er is al een gebruiker geregistreerd met dit e-mail adres." #~ msgid "Password (again)" #~ msgstr "Wachtwoord (bevestigen)" #~ msgid "You must type the same password each time." #~ msgstr "Je moet hetzelfde wachtwoord twee keer intoetsen." #~ msgid "Your e-mail address has already been verified" #~ msgstr "Je e-mail adres is al geverifieerd" #~ msgid "Confirmation e-mail sent to %(email)s" #~ msgstr "Bevestigings e-mail verzonden aan %(email)s" #~ msgid "This e-mail address already associated with this account." #~ msgstr "Dit e-mail adres is al geassocieerd met dit account." #~ msgid "This e-mail address already associated with another account." #~ msgstr "Dit e-mail adres is al geassocieerd met een ander account." #~ msgid "Current Password" #~ msgstr "Huidig wachtwoord" #~ msgid "New Password" #~ msgstr "Nieuw wachtwoord" #~ msgid "New Password (again)" #~ msgstr "Nieuw wachtwoord (bevestigen)" #~ msgid "Please type your current password." #~ msgstr "Geef je huidige wachtwoord op." #~ msgid "The e-mail address is not assigned to any user account" #~ msgstr "Dit e-mail adres is niet bij ons bekend" #~ msgid "Password Reset E-mail" #~ msgstr "Nieuw wachtwoord" #~ msgid "Successfully signed in as %(user)s." #~ msgstr "Je bent nu ingelogd als %(user)s." #~ msgid "Removed e-mail address %(email)s" #~ msgstr "E-mail adres %(email)s verwijderd" #~ msgid "Primary e-mail address set" #~ msgstr "Primair e-mail adres ingesteld" #~ msgid "Password successfully changed." #~ msgstr "Wachtwoord wijziging geslaagd." #~ msgid "Password successfully set." #~ msgstr "Je wachtwoord is gewijzigd." #~ msgid "OpenID" #~ msgstr "OpenID" #~ msgid "Your local account has no password setup." #~ msgstr "Je account heeft geen wachtwoord ingesteld." #~ msgid "Your local account has no verified e-mail address." #~ msgstr "Je account heeft geen geverifieerd e-mail adres." #~ msgid "Invalid response while obtaining request token from \"%s\"." #~ msgstr "" #~ "Ongeldig antwoord ontvangen tijdens het ophalen van een verzoeksleutel " #~ "van \"%s\"." #~ msgid "Invalid response while obtaining access token from \"%s\"." #~ msgstr "" #~ "Ongeldig antwoord ontvangen tijdens het ophalen van een toegangssleutel " #~ "van \"%s\"." #~ msgid "No request token saved for \"%s\"." #~ msgstr "Geen verzoeksleutel opgeslagen voor \"%s\"." #~ msgid "No access token saved for \"%s\"." #~ msgstr "Geen toegangssleutel opgeslagen voor \"%s\"." #~ msgid "No access to private resources at \"%s\"." #~ msgstr "Geen toegang tot prive data bij \"%s\"." #~ msgid "The social account has been disconnected" #~ msgstr "Het externe account is ontkoppeld" #, fuzzy #~ msgid "" #~ "You're receiving this e-mail because you requested a password reset\n" #~ "for your user account at Pinax.\n" #~ "\n" #~ "Your new password is: %(new_password)s\n" #~ "\n" #~ "Your username, in case you've forgotten: %(username)s\n" #~ "\n" #~ "You should log in as soon as possible and change your password.\n" #~ "\n" #~ "Thanks for using our site!\n" #~ msgstr "" #~ "Je ontvangt deze mail omdat er een verzoek is ingelegd om het wachtwoord\n" #~ "behorende bij je %(site_name)s account opnieuw in te stellen.\n" #~ "\n" #~ "Je nieuwe wachtwoord is: %(new_password)s\n" #~ "\n" #~ "Je gebruikersnaam, voor het geval je die vergeten bent, is: %(username)s\n" #~ "\n" #~ "Je moet zo snel mogelijk inloggen en bovenstaand wachtwoord veranderen.\n" #~ "\n" #~ "Bedankt voor het gebruik van onze site!\n" #~ msgid "If checked you will stay logged in for 3 weeks" #~ msgstr "Bij 'Onthouden' blijf je ingelogd gedurende 3 weken" #~ msgid "Timezone successfully updated." #~ msgstr "Tijdzone gewijzigd." #~ msgid "Language successfully updated." #~ msgstr "Taal gewijzigd." #~ msgid "E-Mail Addresses" #~ msgstr "E-mail adressen" #~ msgid "add" #~ msgstr "Voeg toe" #~ msgid "Login" #~ msgstr "Inloggen" #~ msgid "Log In" #~ msgstr "Inloggen" #~ msgid "Log in" #~ msgstr "Inloggen" #~ msgid "Logout" #~ msgstr "Afmelden" #~ msgid "" #~ "When you receive the new password, you should log in and change it as soon as possible." #~ msgstr "" #~ "Zodra je het nieuwe wachtwoord ontvangen hebt moet je zo snel mogelijk inloggen en het wachtwoord wijzigen." #~ msgid "You are already logged in." #~ msgstr "Je bent al ingelogd." #~ msgid "" #~ "By clicking \"Sign Up\", you are indicating that you have read and agree " #~ "to the Terms of Use and Privacy Policy." #~ msgstr "" #~ "Door te registreren geef je aan dat je de gebruiksvoorwaarden en de privacy " #~ "policy gelezen hebt en ermee akkoord gaat." #~ msgid "" #~ "If you have any trouble creating your account, contact us at %(contact_email)s." #~ msgstr "" #~ "Als je problemen hebt om een account aan te maken, neem dan contact op " #~ "met %(contact_email)s." #~ msgid "Log in »" #~ msgstr "Inloggen" django-allauth-0.47.0/example/example/settings.py000066400000000000000000000133771415442050100220030ustar00rootroot00000000000000# Django settings for example project. import os PROJECT_ROOT = os.path.normpath(os.path.dirname(os.path.abspath(__file__))) DEBUG = True ADMINS = ( # ('Your Name', 'your_email@example.com'), ) MANAGERS = ADMINS EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend" DATABASES = { "default": { "ENGINE": "django.db.backends.sqlite3", # Add 'postgresql_psycopg2', 'postgresql', # 'mysql', 'sqlite3' or 'oracle'. "NAME": os.path.join( PROJECT_ROOT, "example.db" ), # Or path to database file if using sqlite3. "USER": "", # Not used with sqlite3. "PASSWORD": "", # Not used with sqlite3. "HOST": "", # Set to empty string for localhost. Not used with sqlite3. "PORT": "", # Set to empty string for default. Not used with sqlite3. } } # Local time zone for this installation. Choices can be found here: # http://en.wikipedia.org/wiki/List_of_tz_zones_by_name # although not all choices may be available on all operating systems. # On Unix systems, a value of None will cause Django to use the same # timezone as the operating system. # If running in a Windows environment this must be set to the same as your # system time zone. TIME_ZONE = "America/Chicago" # Language code for this installation. All choices can be found here: # http://www.i18nguy.com/unicode/language-identifiers.html LANGUAGE_CODE = "en-us" SITE_ID = 1 # If you set this to False, Django will make some optimizations so as not # to load the internationalization machinery. USE_I18N = True # If you set this to False, Django will not format dates, numbers and # calendars according to the current locale USE_L10N = True LOCALE_PATHS = (os.path.join(PROJECT_ROOT, "locale"),) # Absolute filesystem path to the directory that will hold user-uploaded files. # Example: "/home/media/media.lawrence.com/media/" MEDIA_ROOT = "" # URL that handles the media served from MEDIA_ROOT. Make sure to use a # trailing slash. # Examples: "http://media.lawrence.com/media/", "http://example.com/media/" MEDIA_URL = "" # Absolute path to the directory static files should be collected to. # Don't put anything in this directory yourself; store your static files # in apps' "static/" subdirectories and in STATICFILES_DIRS. # Example: "/home/media/media.lawrence.com/static/" STATIC_ROOT = "" # URL prefix for static files. # Example: "http://media.lawrence.com/static/" STATIC_URL = "/static/" # Additional locations of static files STATICFILES_DIRS = ( # Put strings here, like "/home/html/static" or "C:/www/django/static". # Always use forward slashes, even on Windows. # Don't forget to use absolute paths, not relative paths. ) # List of finder classes that know how to find static files in # various locations. STATICFILES_FINDERS = ( "django.contrib.staticfiles.finders.FileSystemFinder", "django.contrib.staticfiles.finders.AppDirectoriesFinder", # 'django.contrib.staticfiles.finders.DefaultStorageFinder', ) # Make this unique, and don't share it with anybody. SECRET_KEY = "t8_)kj3v!au0!_i56#gre**mkg0&z1df%3bw(#5^#^5e_64!$_" # List of callables that know how to import templates from various sources. TEMPLATES = [ { "BACKEND": "django.template.backends.django.DjangoTemplates", "DIRS": [ os.path.join(PROJECT_ROOT, "templates"), ], "APP_DIRS": True, "OPTIONS": { "context_processors": [ "django.template.context_processors.debug", "django.template.context_processors.request", "django.contrib.auth.context_processors.auth", "django.contrib.messages.context_processors.messages", ], }, }, ] MIDDLEWARE = ( "django.middleware.common.CommonMiddleware", "django.contrib.sessions.middleware.SessionMiddleware", "django.middleware.csrf.CsrfViewMiddleware", "django.contrib.auth.middleware.AuthenticationMiddleware", "django.contrib.messages.middleware.MessageMiddleware", ) AUTHENTICATION_BACKENDS = ("allauth.account.auth_backends.AuthenticationBackend",) ROOT_URLCONF = "example.urls" INSTALLED_APPS = ( "django.contrib.auth", "django.contrib.contenttypes", "django.contrib.sessions", "django.contrib.sites", "django.contrib.messages", "django.contrib.staticfiles", "django.contrib.admin", "allauth", "allauth.account", "allauth.socialaccount", "allauth.socialaccount.providers.dropbox", "allauth.socialaccount.providers.azure", "allauth.socialaccount.providers.facebook", "allauth.socialaccount.providers.edx", "allauth.socialaccount.providers.evernote", "allauth.socialaccount.providers.google", "allauth.socialaccount.providers.github", "allauth.socialaccount.providers.linkedin", "allauth.socialaccount.providers.mediawiki", "allauth.socialaccount.providers.openid", "allauth.socialaccount.providers.persona", "allauth.socialaccount.providers.reddit", "allauth.socialaccount.providers.shopify", "allauth.socialaccount.providers.slack", "allauth.socialaccount.providers.soundcloud", "allauth.socialaccount.providers.stackexchange", "allauth.socialaccount.providers.telegram", "allauth.socialaccount.providers.twitch", "allauth.socialaccount.providers.twitter", "allauth.socialaccount.providers.vimeo", "allauth.socialaccount.providers.vimeo_oauth2", "allauth.socialaccount.providers.weibo", "allauth.socialaccount.providers.xing", "example.demo", ) AUTH_PASSWORD_VALIDATORS = [ { "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator", "OPTIONS": { "min_length": 9, }, } ] ALLOWED_HOSTS = ["127.0.0.1", "localhost"] try: from .local_settings import * # noqa except ImportError: pass django-allauth-0.47.0/example/example/templates/000077500000000000000000000000001415442050100215545ustar00rootroot00000000000000django-allauth-0.47.0/example/example/templates/account/000077500000000000000000000000001415442050100232105ustar00rootroot00000000000000django-allauth-0.47.0/example/example/templates/account/base.html000066400000000000000000000000321415442050100250030ustar00rootroot00000000000000{% extends "base.html" %} django-allauth-0.47.0/example/example/templates/base.html000066400000000000000000000022651415442050100233610ustar00rootroot00000000000000 {% block head_title %}{% endblock %} {% block extra_head %} {% endblock %} {% block body %} Important: Authentication via OAuth based providers will not work until you setup proper applicaton credentials. {% if messages %}
    Messages:
      {% for message in messages %}
    • {{message}}
    • {% endfor %}
    {% endif %}
    Menu:
    {% block content %} {% endblock %} {% endblock %} {% block extra_body %} {% endblock %} django-allauth-0.47.0/example/example/templates/index.html000066400000000000000000000001471415442050100235530ustar00rootroot00000000000000{% extends "base.html" %} {% block content %}

    Example Project

    Welcome

    {% endblock %} django-allauth-0.47.0/example/example/templates/profile.html000066400000000000000000000001441415442050100241010ustar00rootroot00000000000000{% extends "base.html" %} {% block content %}

    Profile

    Your profile

    {% endblock %} django-allauth-0.47.0/example/example/urls.py000066400000000000000000000006141415442050100211160ustar00rootroot00000000000000from django.contrib import admin from django.urls import include, path from django.views.generic.base import TemplateView admin.autodiscover() urlpatterns = [ path("", TemplateView.as_view(template_name="index.html")), path("accounts/", include("allauth.urls")), path("accounts/profile/", TemplateView.as_view(template_name="profile.html")), path("admin/", admin.site.urls), ] django-allauth-0.47.0/example/manage.py000066400000000000000000000003731415442050100177300ustar00rootroot00000000000000#!/usr/bin/env python import os import sys if __name__ == "__main__": os.environ.setdefault("DJANGO_SETTINGS_MODULE", "example.settings") from django.core.management import execute_from_command_line execute_from_command_line(sys.argv) django-allauth-0.47.0/manage.py000066400000000000000000000003041415442050100162670ustar00rootroot00000000000000#!/usr/bin/env python import os os.environ["DJANGO_SETTINGS_MODULE"] = "test_settings" from django.core import management if __name__ == "__main__": management.execute_from_command_line() django-allauth-0.47.0/setup.cfg000066400000000000000000000001071415442050100163070ustar00rootroot00000000000000[flake8] max-line-length = 88 ignore = E203, W503, E501, E231 # Black django-allauth-0.47.0/setup.py000066400000000000000000000130551415442050100162060ustar00rootroot00000000000000#!/usr/bin/env python from __future__ import print_function import io import os import sys from fnmatch import fnmatchcase from setuptools import convert_path, find_packages, setup # Provided as an attribute, so you can append to these instead # of replicating them: standard_exclude = ["*.py", "*.pyc", "*~", ".*", "*.bak", "Makefile"] standard_exclude_directories = [ ".*", "CVS", "_darcs", "./build", "./dist", "EGG-INFO", "*.egg-info", "./example", ] # Copied from paste/util/finddata.py def find_package_data( where=".", package="", exclude=standard_exclude, exclude_directories=standard_exclude_directories, only_in_packages=True, show_ignored=False, ): """ Return a dictionary suitable for use in ``package_data`` in a distutils ``setup.py`` file. The dictionary looks like:: {"package": [files]} Where ``files`` is a list of all the files in that package that don't match anything in ``exclude``. If ``only_in_packages`` is true, then top-level directories that are not packages won't be included (but directories under packages will). Directories matching any pattern in ``exclude_directories`` will be ignored; by default directories with leading ``.``, ``CVS``, and ``_darcs`` will be ignored. If ``show_ignored`` is true, then all the files that aren't included in package data are shown on stderr (for debugging purposes). Note patterns use wildcards, or can be exact paths (including leading ``./``), and all searching is case-insensitive. """ out = {} stack = [(convert_path(where), "", package, only_in_packages)] while stack: where, prefix, package, only_in_packages = stack.pop(0) for name in os.listdir(where): fn = os.path.join(where, name) if os.path.isdir(fn): bad_name = False for pattern in exclude_directories: if fnmatchcase(name, pattern) or fn.lower() == pattern.lower(): bad_name = True if show_ignored: print( "Directory %s ignored by pattern %s" % (fn, pattern), file=sys.stderr, ) break if bad_name: continue if os.path.isfile(os.path.join(fn, "__init__.py")) and not prefix: if not package: new_package = name else: new_package = package + "." + name stack.append((fn, "", new_package, False)) else: stack.append((fn, prefix + name + "/", package, only_in_packages)) elif package or not only_in_packages: # is a file bad_name = False for pattern in exclude: if fnmatchcase(name, pattern) or fn.lower() == pattern.lower(): bad_name = True if show_ignored: print( "File %s ignored by pattern %s" % (fn, pattern), file=sys.stderr, ) break if bad_name: continue out.setdefault(package, []).append(prefix + name) return out excluded_directories = standard_exclude_directories package_data = find_package_data(exclude_directories=excluded_directories) long_description = io.open("README.rst", encoding="utf-8").read() # Dynamically calculate the version based on allauth.VERSION. version = __import__("allauth").__version__ METADATA = dict( name="django-allauth", version=version, author="Raymond Penners", author_email="raymond.penners@intenct.nl", description="Integrated set of Django applications addressing" " authentication, registration, account management as well as" " 3rd party (social) account authentication.", long_description=long_description, url="http://github.com/pennersr/django-allauth", keywords="django auth account social openid twitter facebook oauth registration", tests_require=[], install_requires=[ "Django >= 2.0", "python3-openid >= 3.0.8", "requests-oauthlib >= 0.3.0", "requests", "pyjwt[crypto] >= 1.7", ], include_package_data=True, classifiers=[ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "Topic :: Software Development :: Libraries :: Python Modules", "Environment :: Web Environment", "Topic :: Internet", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Framework :: Django", "Framework :: Django :: 2.0", "Framework :: Django :: 2.1", "Framework :: Django :: 2.2", "Framework :: Django :: 3.0", "Framework :: Django :: 3.1", "Framework :: Django :: 3.2", "Framework :: Django :: 4.0", ], packages=find_packages(exclude=["example"]), package_data=package_data, ) if __name__ == "__main__": setup(**METADATA) django-allauth-0.47.0/test_settings.py000066400000000000000000000162551415442050100177520ustar00rootroot00000000000000SECRET_KEY = "psst" SITE_ID = 1 DATABASES = { "default": { "ENGINE": "django.db.backends.sqlite3", "NAME": ":memory:", "USER": "", "PASSWORD": "", "HOST": "", "PORT": "", } } ROOT_URLCONF = "allauth.urls" TEMPLATES = [ { "BACKEND": "django.template.backends.django.DjangoTemplates", "DIRS": [], "APP_DIRS": True, "OPTIONS": { "context_processors": [ "django.template.context_processors.debug", "django.template.context_processors.request", "django.contrib.auth.context_processors.auth", "django.contrib.messages.context_processors.messages", ], }, }, ] MIDDLEWARE = ( "django.contrib.sessions.middleware.SessionMiddleware", "django.middleware.common.CommonMiddleware", "django.middleware.csrf.CsrfViewMiddleware", "django.contrib.auth.middleware.AuthenticationMiddleware", "django.contrib.messages.middleware.MessageMiddleware", "django.middleware.clickjacking.XFrameOptionsMiddleware", ) INSTALLED_APPS = ( "django.contrib.auth", "django.contrib.contenttypes", "django.contrib.sessions", "django.contrib.sites", "django.contrib.messages", "django.contrib.staticfiles", "django.contrib.admin", "allauth", "allauth.account", "allauth.socialaccount", "allauth.socialaccount.providers.agave", "allauth.socialaccount.providers.amazon", "allauth.socialaccount.providers.amazon_cognito", "allauth.socialaccount.providers.angellist", "allauth.socialaccount.providers.apple", "allauth.socialaccount.providers.asana", "allauth.socialaccount.providers.auth0", "allauth.socialaccount.providers.authentiq", "allauth.socialaccount.providers.azure", "allauth.socialaccount.providers.baidu", "allauth.socialaccount.providers.basecamp", "allauth.socialaccount.providers.battlenet", "allauth.socialaccount.providers.bitbucket", "allauth.socialaccount.providers.bitbucket_oauth2", "allauth.socialaccount.providers.bitly", "allauth.socialaccount.providers.box", "allauth.socialaccount.providers.cern", "allauth.socialaccount.providers.cilogon", "allauth.socialaccount.providers.coinbase", "allauth.socialaccount.providers.dataporten", "allauth.socialaccount.providers.daum", "allauth.socialaccount.providers.digitalocean", "allauth.socialaccount.providers.discord", "allauth.socialaccount.providers.disqus", "allauth.socialaccount.providers.douban", "allauth.socialaccount.providers.doximity", "allauth.socialaccount.providers.draugiem", "allauth.socialaccount.providers.dropbox", "allauth.socialaccount.providers.dwolla", "allauth.socialaccount.providers.edmodo", "allauth.socialaccount.providers.edx", "allauth.socialaccount.providers.eventbrite", "allauth.socialaccount.providers.eveonline", "allauth.socialaccount.providers.evernote", "allauth.socialaccount.providers.exist", "allauth.socialaccount.providers.facebook", "allauth.socialaccount.providers.feedly", "allauth.socialaccount.providers.figma", "allauth.socialaccount.providers.fivehundredpx", "allauth.socialaccount.providers.flickr", "allauth.socialaccount.providers.foursquare", "allauth.socialaccount.providers.frontier", "allauth.socialaccount.providers.fxa", "allauth.socialaccount.providers.gitea", "allauth.socialaccount.providers.github", "allauth.socialaccount.providers.gitlab", "allauth.socialaccount.providers.globus", "allauth.socialaccount.providers.google", "allauth.socialaccount.providers.gumroad", "allauth.socialaccount.providers.hubic", "allauth.socialaccount.providers.instagram", "allauth.socialaccount.providers.jupyterhub", "allauth.socialaccount.providers.kakao", "allauth.socialaccount.providers.keycloak", "allauth.socialaccount.providers.line", "allauth.socialaccount.providers.linkedin", "allauth.socialaccount.providers.linkedin_oauth2", "allauth.socialaccount.providers.mailchimp", "allauth.socialaccount.providers.mailru", "allauth.socialaccount.providers.mediawiki", "allauth.socialaccount.providers.meetup", "allauth.socialaccount.providers.microsoft", "allauth.socialaccount.providers.naver", "allauth.socialaccount.providers.netiq", "allauth.socialaccount.providers.nextcloud", "allauth.socialaccount.providers.odnoklassniki", "allauth.socialaccount.providers.openid", "allauth.socialaccount.providers.openstreetmap", "allauth.socialaccount.providers.orcid", "allauth.socialaccount.providers.patreon", "allauth.socialaccount.providers.paypal", "allauth.socialaccount.providers.persona", "allauth.socialaccount.providers.pinterest", "allauth.socialaccount.providers.quickbooks", "allauth.socialaccount.providers.reddit", "allauth.socialaccount.providers.robinhood", "allauth.socialaccount.providers.salesforce", "allauth.socialaccount.providers.sharefile", "allauth.socialaccount.providers.shopify", "allauth.socialaccount.providers.slack", "allauth.socialaccount.providers.soundcloud", "allauth.socialaccount.providers.spotify", "allauth.socialaccount.providers.stackexchange", "allauth.socialaccount.providers.steam", "allauth.socialaccount.providers.stocktwits", "allauth.socialaccount.providers.strava", "allauth.socialaccount.providers.stripe", "allauth.socialaccount.providers.telegram", "allauth.socialaccount.providers.trainingpeaks", "allauth.socialaccount.providers.trello", "allauth.socialaccount.providers.tumblr", "allauth.socialaccount.providers.twentythreeandme", "allauth.socialaccount.providers.twitch", "allauth.socialaccount.providers.twitter", "allauth.socialaccount.providers.untappd", "allauth.socialaccount.providers.vimeo", "allauth.socialaccount.providers.vimeo_oauth2", "allauth.socialaccount.providers.vk", "allauth.socialaccount.providers.weibo", "allauth.socialaccount.providers.weixin", "allauth.socialaccount.providers.windowslive", "allauth.socialaccount.providers.xing", "allauth.socialaccount.providers.yahoo", "allauth.socialaccount.providers.yandex", "allauth.socialaccount.providers.ynab", "allauth.socialaccount.providers.zoho", "allauth.socialaccount.providers.zoom", "allauth.socialaccount.providers.okta", "allauth.socialaccount.providers.feishu", ) AUTHENTICATION_BACKENDS = ( "django.contrib.auth.backends.ModelBackend", "allauth.account.auth_backends.AuthenticationBackend", ) STATIC_ROOT = "/tmp/" # Dummy STATIC_URL = "/static/" from django.contrib.auth.hashers import PBKDF2PasswordHasher class MyPBKDF2PasswordHasher(PBKDF2PasswordHasher): """ A subclass of PBKDF2PasswordHasher that uses 1 iteration. This is for test purposes only. Never use anywhere else. """ iterations = 1 PASSWORD_HASHERS = [ "test_settings.MyPBKDF2PasswordHasher", "django.contrib.auth.hashers.PBKDF2PasswordHasher", "django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher", "django.contrib.auth.hashers.Argon2PasswordHasher", "django.contrib.auth.hashers.BCryptSHA256PasswordHasher", ] django-allauth-0.47.0/tox.ini000066400000000000000000000036721415442050100160130ustar00rootroot00000000000000[tox] envlist = py{35,36,37}-django20 py{35,36,37}-django21 py{35,36,37,38,39}-django22 py{36,37,38,39}-django30 py{36,37,38,39}-django31 py{36,37,38,39}-django32 py{38,39}-django40 py{39}-djangomaster docs checkqa standardjs [testenv] setenv = PYTHONWARNINGS = all deps = coverage django20: Django==2.0.* django21: Django==2.1.* django22: Django==2.2.* django30: Django==3.0.* django31: Django==3.1.* django32: Django==3.2.* django40: Django==4.0.* djangomaster: https://api.github.com/repos/django/django/tarball/master commands = coverage run manage.py test {posargs:allauth} coverage report coverage html [testenv:docs] skip_install = True deps = Sphinx whitelist_externals = make commands = make -C {toxinidir}/docs html [testenv:checkqa] skip_install = True ignore_errors = True deps = flake8==3.9.2 isort==5.8.0 black==21.6b0 commands = flake8 {posargs:{toxinidir}/allauth} isort --check-only --skip-glob '*/migrations/*' --diff {posargs:{toxinidir}/allauth} black --check {posargs:{toxinidir}/allauth} {posargs:{toxinidir}/setup.py} [testenv:isort] basepython = python3.7 skip_install = True deps = isort >5 commands = isort --skip-glob '*/migrations/*' {posargs:{toxinidir}/allauth} [testenv:standardjs] skip_install = True commands = /usr/bin/env bash -c "mkdir -p {toxinidir}/node_modules" /usr/bin/env npm install standard --no-lockfile --no-progress --non-interactive --silent /usr/bin/env bash -c "find {toxinidir}/allauth -name '*.js' | xargs {toxinidir}/node_modules/.bin/standard" [coverage:run] include = allauth* [flake8] exclude = migrations [gh-actions:env] PYTHON_VER = 3.5: py35 3.6: py36 3.7: py37 3.8: py38 3.9: py39 DJANGO = master: djangomaster 2.0: django20 2.1: django21 2.2: django22 3.0: django30 3.1: django31 3.2: django32 4.0: django40