summaryrefslogtreecommitdiff
path: root/python-edc-auth.spec
diff options
context:
space:
mode:
Diffstat (limited to 'python-edc-auth.spec')
-rw-r--r--python-edc-auth.spec514
1 files changed, 514 insertions, 0 deletions
diff --git a/python-edc-auth.spec b/python-edc-auth.spec
new file mode 100644
index 0000000..af43f34
--- /dev/null
+++ b/python-edc-auth.spec
@@ -0,0 +1,514 @@
+%global _empty_manifest_terminate_build 0
+Name: python-edc-auth
+Version: 0.3.59
+Release: 1
+Summary: Authentication for clinicedc/edc projects
+License: GPL license, see LICENSE
+URL: https://github.com/clinicedc/edc-auth
+Source0: https://mirrors.nju.edu.cn/pypi/web/packages/84/31/13c5b52cfcdfacc4696b7e07a97079e6ff7f654269de2300ebe3d910c430/edc-auth-0.3.59.tar.gz
+BuildArch: noarch
+
+Requires: python3-mempass
+
+%description
+Authentication and permissions for the Edc
+Default Groups
+++++++++++++++
+The default groups are required for the normal operation of an EDC deployment. The default groups are:
+* ``ACCOUNT_MANAGER``: members may add/change and delete user accounts
+* ``ADMINISTRATION``: members may view the Administration page
+* ``AUDITOR``: members may view all forms but have no add/change permissions.
+* ``CLINIC``: members may add/edit/delete all CRFs, Requisitions, Actions and other required clinic trial data entry forms. They may also view the Requisition page of the Lab section;
+* ``EVERYONE``: members may access the EDC;
+* ``LAB``: members may perform all functions in the Lab section (Edit requisitions, receive, process, pack, manage manifests, etc);
+* ``PHARMACY``:
+* ``PII``: members may view all personally identifiable data and edit forms that manage such data (Screening, Consents, Patient registration);
+* ``PII_VIEW``: members may view personally identifiable data but have no add/edit permissions for any of the forms that store such data.
+Permissions
++++++++++++
+Permissions use Django's permission framework, therefore, all permissions are linked to some model.
+Permissions don't always naturally link to a model. In such cases, a dummy model is created.
+For example, with Navigation bars from `edc_navbar`. Permissions to follow an item on a
+navigation bar are associated with model `edc_navbar.Navbar`. A similar approach is used for
+`listboard` permissions using `edc_dashboard.Dashboard`.
+Extending permissions with `site_auths` global
+++++++++++++++++++++++++++++++++++++++++++++++
+A module can add new or update existing groups and roles and even add custom codenames.
+The ``site_auths`` global ``autodiscovers`` configurations from ``auths.py`` in the root of your module.
+The ``site_auths`` global gathers but does not validate or change any data in django's
+``group``/``permission`` models or the Edc's ``role`` model.
+The ``site_auths`` global gathers data:
+* to ADD new groups,
+* to update codenames for an existing group,
+* to add a new role
+* to update the group list for an existing role
+* to add to the list of PII models
+* to specifiy custom functions to run before and after groups and roles have been updated
+For example,
+ # auths.py
+ from edc_auth.auth_objects import CLINICIAN_ROLE, STATISTICIAN_ROLE
+ from edc_auth.site_auths import site_auths
+ from edc_protocol_violation.auth_objects import (
+ PROTOCOL_VIOLATION,
+ PROTOCOL_VIOLATION_VIEW,
+ protocol_violation_codenames,
+ protocol_violation_view_codenames,
+ )
+ # add a new group specific to models in this module
+ site_auths.add_group(*protocol_violation_codenames, name=PROTOCOL_VIOLATION)
+ # add a new group specific to models in this module
+ site_auths.add_group(*protocol_violation_view_codenames, name=PROTOCOL_VIOLATION_VIEW)
+ # update the existing role CLINICIAN_ROLE to add the group PROTOCOL_VIOLATION
+ site_auths.update_role(PROTOCOL_VIOLATION, name=CLINICIAN_ROLE)
+ # update the existing role STATISTICIAN_ROLE to add the group PROTOCOL_VIOLATION_VIEW
+ site_auths.update_role(PROTOCOL_VIOLATION_VIEW, name=STATISTICIAN_ROLE)
+As a convention, we define group names, lists of codenames and custom functions ``auth_objects.py``.
+In the above example, the ``auth_objects.py`` looks like this:
+ # auth_objects.py
+ # declare group names
+ PROTOCOL_VIOLATION = "PROTOCOL_VIOLATION"
+ PROTOCOL_VIOLATION_VIEW = "PROTOCOL_VIOLATION_VIEW"
+ # add/change/delete/view codenames
+ protocol_violation_codenames = (
+ "edc_protocol_violation.add_protocoldeviationviolation",
+ "edc_protocol_violation.change_protocoldeviationviolation",
+ "edc_protocol_violation.delete_protocoldeviationviolation",
+ "edc_protocol_violation.view_protocoldeviationviolation",
+ )
+ # view only codename
+ protocol_violation_view_codenames = (
+ "edc_protocol_violation.view_protocoldeviationviolation",
+ )
+AuthUpdater
++++++++++++
+The ``AuthUpdater`` class runs in a post_migrate signal declared in ``apps.py``.
+The ``AuthUpdater`` reads and validates the data gathered by ``site_auths``. Once all
+validation checks pass, the ``AuthUpdater`` updates Django's ``group`` and ``permission``
+models as well as the Edc's ``Role`` model.
+Validation checks include confirming models refered to in codenames exist. This means that
+the app where models are declared must be in your ``INSTALLED_APPS``.
+During tests having all codenames load may not be ideal. See below on some strategies for testing.
+Testing SiteAuths, AuthUpdater
+++++++++++++++++++++++++++++++
+An app sets up its own groups and roles using the ``site_auths`` global in ``auths.py``. To test just your apps
+configuration, you can prevent ``site_auths`` from autodiscovering other modules by setting::
+ EDC_AUTH_SKIP_SITE_AUTHS=True
+You can prevent the ``AuthUpdater`` from updating groups and permissions by setting::
+ EDC_AUTH_SKIP_AUTH_UPDATER=True
+You can then override these attributes in your tests
+ @override_settings(
+ EDC_AUTH_SKIP_SITE_AUTHS=True,
+ EDC_AUTH_SKIP_AUTH_UPDATER=False
+ )
+ class TestMyTests(TestCase):
+Above the ``site_auths`` global ``autodiscover`` is still disabled but the ``AuthUpdater`` is not.
+In your test setup you can update ``site_auths`` manually so that your tests focus on the
+add/update or groups/roles/codenames/tuples relevant to your app.
+You can emulate ``autodiscover`` behaviour by explicitly importing ``auths`` modules needed for your tests.
+For example:
+ from importlib import import_module
+ from django.test import TestCase, override_settings
+ from edc_auth.auth_updater import AuthUpdater
+ class TestAuths(TestCase):
+ @override_settings(
+ EDC_AUTH_SKIP_SITE_AUTHS=True,
+ EDC_AUTH_SKIP_AUTH_UPDATER=True,
+ )
+ def test_load(self):
+ import_module(f"edc_dashboard.auths")
+ import_module(f"edc_navbar.auths")
+ AuthUpdater(verbose=True)
+You can ``clear`` the ``site_auths`` registry and add back specific items need for your tests.
+For example:
+ # taken from edc-dashboard
+ @override_settings(EDC_AUTH_SKIP_SITE_AUTHS=True, EDC_AUTH_SKIP_AUTH_UPDATER=False)
+ class TestMyTests(TestCase):
+ def setUpTestData(cls):
+ site_auths.clear()
+ site_auths.add_group("edc_dashboard.view_my_listboard", name=CLINIC)
+ site_auths.add_custom_permissions_tuples(
+ model="edc_dashboard.edcpermissions",
+ codename_tuples=(("edc_dashboard.view_my_listboard", "View my listboard"),),
+ )
+ AuthUpdater(verbose=False, warn_only=True)
+ return super().setUpTestData()
+ def test_me(self):
+Importing users
++++++++++++++++
+You create user accounts by importing a specially formatted CSV file. Once an account is created a "Welcome" email may be sent.
+Import users from a CSV file with columns:
+ username
+ is_staff
+ is_active
+ first_name
+ last_name
+ job_title
+ email
+ mobile
+ alternate_email
+ site_names: a comma-separated list of sites
+ role_names: a comma-separated list of roles
+Then import the users from your application commandline
+ python manage.py import_users --csvfile=/Users/erikvw/meta_users.csv --notify-to-test-email=ew2789@gmail --resource-name=meta.clinicedc.org --resend-as-new
+Legacy notes
+++++++++++++
+**Important:** If you are upgrading from edc_base.auth:
+The ``userprofile`` table is now in ``edc_auth``. ``edc_auth`` has one migration for this table.
+Copy the same table from ``edc_base`` and fake the ``edc_auth`` migration.
+ CREATE TABLE edc_auth_userprofile LIKE edc_base_userprofile;
+ INSERT edc_auth_userprofile SELECT * FROM edc_base_userprofile;
+ python manage.py migrate edc_auth --fake
+You can now run the ``edc_base`` migration safely.
+
+%package -n python3-edc-auth
+Summary: Authentication for clinicedc/edc projects
+Provides: python-edc-auth
+BuildRequires: python3-devel
+BuildRequires: python3-setuptools
+BuildRequires: python3-pip
+%description -n python3-edc-auth
+Authentication and permissions for the Edc
+Default Groups
+++++++++++++++
+The default groups are required for the normal operation of an EDC deployment. The default groups are:
+* ``ACCOUNT_MANAGER``: members may add/change and delete user accounts
+* ``ADMINISTRATION``: members may view the Administration page
+* ``AUDITOR``: members may view all forms but have no add/change permissions.
+* ``CLINIC``: members may add/edit/delete all CRFs, Requisitions, Actions and other required clinic trial data entry forms. They may also view the Requisition page of the Lab section;
+* ``EVERYONE``: members may access the EDC;
+* ``LAB``: members may perform all functions in the Lab section (Edit requisitions, receive, process, pack, manage manifests, etc);
+* ``PHARMACY``:
+* ``PII``: members may view all personally identifiable data and edit forms that manage such data (Screening, Consents, Patient registration);
+* ``PII_VIEW``: members may view personally identifiable data but have no add/edit permissions for any of the forms that store such data.
+Permissions
++++++++++++
+Permissions use Django's permission framework, therefore, all permissions are linked to some model.
+Permissions don't always naturally link to a model. In such cases, a dummy model is created.
+For example, with Navigation bars from `edc_navbar`. Permissions to follow an item on a
+navigation bar are associated with model `edc_navbar.Navbar`. A similar approach is used for
+`listboard` permissions using `edc_dashboard.Dashboard`.
+Extending permissions with `site_auths` global
+++++++++++++++++++++++++++++++++++++++++++++++
+A module can add new or update existing groups and roles and even add custom codenames.
+The ``site_auths`` global ``autodiscovers`` configurations from ``auths.py`` in the root of your module.
+The ``site_auths`` global gathers but does not validate or change any data in django's
+``group``/``permission`` models or the Edc's ``role`` model.
+The ``site_auths`` global gathers data:
+* to ADD new groups,
+* to update codenames for an existing group,
+* to add a new role
+* to update the group list for an existing role
+* to add to the list of PII models
+* to specifiy custom functions to run before and after groups and roles have been updated
+For example,
+ # auths.py
+ from edc_auth.auth_objects import CLINICIAN_ROLE, STATISTICIAN_ROLE
+ from edc_auth.site_auths import site_auths
+ from edc_protocol_violation.auth_objects import (
+ PROTOCOL_VIOLATION,
+ PROTOCOL_VIOLATION_VIEW,
+ protocol_violation_codenames,
+ protocol_violation_view_codenames,
+ )
+ # add a new group specific to models in this module
+ site_auths.add_group(*protocol_violation_codenames, name=PROTOCOL_VIOLATION)
+ # add a new group specific to models in this module
+ site_auths.add_group(*protocol_violation_view_codenames, name=PROTOCOL_VIOLATION_VIEW)
+ # update the existing role CLINICIAN_ROLE to add the group PROTOCOL_VIOLATION
+ site_auths.update_role(PROTOCOL_VIOLATION, name=CLINICIAN_ROLE)
+ # update the existing role STATISTICIAN_ROLE to add the group PROTOCOL_VIOLATION_VIEW
+ site_auths.update_role(PROTOCOL_VIOLATION_VIEW, name=STATISTICIAN_ROLE)
+As a convention, we define group names, lists of codenames and custom functions ``auth_objects.py``.
+In the above example, the ``auth_objects.py`` looks like this:
+ # auth_objects.py
+ # declare group names
+ PROTOCOL_VIOLATION = "PROTOCOL_VIOLATION"
+ PROTOCOL_VIOLATION_VIEW = "PROTOCOL_VIOLATION_VIEW"
+ # add/change/delete/view codenames
+ protocol_violation_codenames = (
+ "edc_protocol_violation.add_protocoldeviationviolation",
+ "edc_protocol_violation.change_protocoldeviationviolation",
+ "edc_protocol_violation.delete_protocoldeviationviolation",
+ "edc_protocol_violation.view_protocoldeviationviolation",
+ )
+ # view only codename
+ protocol_violation_view_codenames = (
+ "edc_protocol_violation.view_protocoldeviationviolation",
+ )
+AuthUpdater
++++++++++++
+The ``AuthUpdater`` class runs in a post_migrate signal declared in ``apps.py``.
+The ``AuthUpdater`` reads and validates the data gathered by ``site_auths``. Once all
+validation checks pass, the ``AuthUpdater`` updates Django's ``group`` and ``permission``
+models as well as the Edc's ``Role`` model.
+Validation checks include confirming models refered to in codenames exist. This means that
+the app where models are declared must be in your ``INSTALLED_APPS``.
+During tests having all codenames load may not be ideal. See below on some strategies for testing.
+Testing SiteAuths, AuthUpdater
+++++++++++++++++++++++++++++++
+An app sets up its own groups and roles using the ``site_auths`` global in ``auths.py``. To test just your apps
+configuration, you can prevent ``site_auths`` from autodiscovering other modules by setting::
+ EDC_AUTH_SKIP_SITE_AUTHS=True
+You can prevent the ``AuthUpdater`` from updating groups and permissions by setting::
+ EDC_AUTH_SKIP_AUTH_UPDATER=True
+You can then override these attributes in your tests
+ @override_settings(
+ EDC_AUTH_SKIP_SITE_AUTHS=True,
+ EDC_AUTH_SKIP_AUTH_UPDATER=False
+ )
+ class TestMyTests(TestCase):
+Above the ``site_auths`` global ``autodiscover`` is still disabled but the ``AuthUpdater`` is not.
+In your test setup you can update ``site_auths`` manually so that your tests focus on the
+add/update or groups/roles/codenames/tuples relevant to your app.
+You can emulate ``autodiscover`` behaviour by explicitly importing ``auths`` modules needed for your tests.
+For example:
+ from importlib import import_module
+ from django.test import TestCase, override_settings
+ from edc_auth.auth_updater import AuthUpdater
+ class TestAuths(TestCase):
+ @override_settings(
+ EDC_AUTH_SKIP_SITE_AUTHS=True,
+ EDC_AUTH_SKIP_AUTH_UPDATER=True,
+ )
+ def test_load(self):
+ import_module(f"edc_dashboard.auths")
+ import_module(f"edc_navbar.auths")
+ AuthUpdater(verbose=True)
+You can ``clear`` the ``site_auths`` registry and add back specific items need for your tests.
+For example:
+ # taken from edc-dashboard
+ @override_settings(EDC_AUTH_SKIP_SITE_AUTHS=True, EDC_AUTH_SKIP_AUTH_UPDATER=False)
+ class TestMyTests(TestCase):
+ def setUpTestData(cls):
+ site_auths.clear()
+ site_auths.add_group("edc_dashboard.view_my_listboard", name=CLINIC)
+ site_auths.add_custom_permissions_tuples(
+ model="edc_dashboard.edcpermissions",
+ codename_tuples=(("edc_dashboard.view_my_listboard", "View my listboard"),),
+ )
+ AuthUpdater(verbose=False, warn_only=True)
+ return super().setUpTestData()
+ def test_me(self):
+Importing users
++++++++++++++++
+You create user accounts by importing a specially formatted CSV file. Once an account is created a "Welcome" email may be sent.
+Import users from a CSV file with columns:
+ username
+ is_staff
+ is_active
+ first_name
+ last_name
+ job_title
+ email
+ mobile
+ alternate_email
+ site_names: a comma-separated list of sites
+ role_names: a comma-separated list of roles
+Then import the users from your application commandline
+ python manage.py import_users --csvfile=/Users/erikvw/meta_users.csv --notify-to-test-email=ew2789@gmail --resource-name=meta.clinicedc.org --resend-as-new
+Legacy notes
+++++++++++++
+**Important:** If you are upgrading from edc_base.auth:
+The ``userprofile`` table is now in ``edc_auth``. ``edc_auth`` has one migration for this table.
+Copy the same table from ``edc_base`` and fake the ``edc_auth`` migration.
+ CREATE TABLE edc_auth_userprofile LIKE edc_base_userprofile;
+ INSERT edc_auth_userprofile SELECT * FROM edc_base_userprofile;
+ python manage.py migrate edc_auth --fake
+You can now run the ``edc_base`` migration safely.
+
+%package help
+Summary: Development documents and examples for edc-auth
+Provides: python3-edc-auth-doc
+%description help
+Authentication and permissions for the Edc
+Default Groups
+++++++++++++++
+The default groups are required for the normal operation of an EDC deployment. The default groups are:
+* ``ACCOUNT_MANAGER``: members may add/change and delete user accounts
+* ``ADMINISTRATION``: members may view the Administration page
+* ``AUDITOR``: members may view all forms but have no add/change permissions.
+* ``CLINIC``: members may add/edit/delete all CRFs, Requisitions, Actions and other required clinic trial data entry forms. They may also view the Requisition page of the Lab section;
+* ``EVERYONE``: members may access the EDC;
+* ``LAB``: members may perform all functions in the Lab section (Edit requisitions, receive, process, pack, manage manifests, etc);
+* ``PHARMACY``:
+* ``PII``: members may view all personally identifiable data and edit forms that manage such data (Screening, Consents, Patient registration);
+* ``PII_VIEW``: members may view personally identifiable data but have no add/edit permissions for any of the forms that store such data.
+Permissions
++++++++++++
+Permissions use Django's permission framework, therefore, all permissions are linked to some model.
+Permissions don't always naturally link to a model. In such cases, a dummy model is created.
+For example, with Navigation bars from `edc_navbar`. Permissions to follow an item on a
+navigation bar are associated with model `edc_navbar.Navbar`. A similar approach is used for
+`listboard` permissions using `edc_dashboard.Dashboard`.
+Extending permissions with `site_auths` global
+++++++++++++++++++++++++++++++++++++++++++++++
+A module can add new or update existing groups and roles and even add custom codenames.
+The ``site_auths`` global ``autodiscovers`` configurations from ``auths.py`` in the root of your module.
+The ``site_auths`` global gathers but does not validate or change any data in django's
+``group``/``permission`` models or the Edc's ``role`` model.
+The ``site_auths`` global gathers data:
+* to ADD new groups,
+* to update codenames for an existing group,
+* to add a new role
+* to update the group list for an existing role
+* to add to the list of PII models
+* to specifiy custom functions to run before and after groups and roles have been updated
+For example,
+ # auths.py
+ from edc_auth.auth_objects import CLINICIAN_ROLE, STATISTICIAN_ROLE
+ from edc_auth.site_auths import site_auths
+ from edc_protocol_violation.auth_objects import (
+ PROTOCOL_VIOLATION,
+ PROTOCOL_VIOLATION_VIEW,
+ protocol_violation_codenames,
+ protocol_violation_view_codenames,
+ )
+ # add a new group specific to models in this module
+ site_auths.add_group(*protocol_violation_codenames, name=PROTOCOL_VIOLATION)
+ # add a new group specific to models in this module
+ site_auths.add_group(*protocol_violation_view_codenames, name=PROTOCOL_VIOLATION_VIEW)
+ # update the existing role CLINICIAN_ROLE to add the group PROTOCOL_VIOLATION
+ site_auths.update_role(PROTOCOL_VIOLATION, name=CLINICIAN_ROLE)
+ # update the existing role STATISTICIAN_ROLE to add the group PROTOCOL_VIOLATION_VIEW
+ site_auths.update_role(PROTOCOL_VIOLATION_VIEW, name=STATISTICIAN_ROLE)
+As a convention, we define group names, lists of codenames and custom functions ``auth_objects.py``.
+In the above example, the ``auth_objects.py`` looks like this:
+ # auth_objects.py
+ # declare group names
+ PROTOCOL_VIOLATION = "PROTOCOL_VIOLATION"
+ PROTOCOL_VIOLATION_VIEW = "PROTOCOL_VIOLATION_VIEW"
+ # add/change/delete/view codenames
+ protocol_violation_codenames = (
+ "edc_protocol_violation.add_protocoldeviationviolation",
+ "edc_protocol_violation.change_protocoldeviationviolation",
+ "edc_protocol_violation.delete_protocoldeviationviolation",
+ "edc_protocol_violation.view_protocoldeviationviolation",
+ )
+ # view only codename
+ protocol_violation_view_codenames = (
+ "edc_protocol_violation.view_protocoldeviationviolation",
+ )
+AuthUpdater
++++++++++++
+The ``AuthUpdater`` class runs in a post_migrate signal declared in ``apps.py``.
+The ``AuthUpdater`` reads and validates the data gathered by ``site_auths``. Once all
+validation checks pass, the ``AuthUpdater`` updates Django's ``group`` and ``permission``
+models as well as the Edc's ``Role`` model.
+Validation checks include confirming models refered to in codenames exist. This means that
+the app where models are declared must be in your ``INSTALLED_APPS``.
+During tests having all codenames load may not be ideal. See below on some strategies for testing.
+Testing SiteAuths, AuthUpdater
+++++++++++++++++++++++++++++++
+An app sets up its own groups and roles using the ``site_auths`` global in ``auths.py``. To test just your apps
+configuration, you can prevent ``site_auths`` from autodiscovering other modules by setting::
+ EDC_AUTH_SKIP_SITE_AUTHS=True
+You can prevent the ``AuthUpdater`` from updating groups and permissions by setting::
+ EDC_AUTH_SKIP_AUTH_UPDATER=True
+You can then override these attributes in your tests
+ @override_settings(
+ EDC_AUTH_SKIP_SITE_AUTHS=True,
+ EDC_AUTH_SKIP_AUTH_UPDATER=False
+ )
+ class TestMyTests(TestCase):
+Above the ``site_auths`` global ``autodiscover`` is still disabled but the ``AuthUpdater`` is not.
+In your test setup you can update ``site_auths`` manually so that your tests focus on the
+add/update or groups/roles/codenames/tuples relevant to your app.
+You can emulate ``autodiscover`` behaviour by explicitly importing ``auths`` modules needed for your tests.
+For example:
+ from importlib import import_module
+ from django.test import TestCase, override_settings
+ from edc_auth.auth_updater import AuthUpdater
+ class TestAuths(TestCase):
+ @override_settings(
+ EDC_AUTH_SKIP_SITE_AUTHS=True,
+ EDC_AUTH_SKIP_AUTH_UPDATER=True,
+ )
+ def test_load(self):
+ import_module(f"edc_dashboard.auths")
+ import_module(f"edc_navbar.auths")
+ AuthUpdater(verbose=True)
+You can ``clear`` the ``site_auths`` registry and add back specific items need for your tests.
+For example:
+ # taken from edc-dashboard
+ @override_settings(EDC_AUTH_SKIP_SITE_AUTHS=True, EDC_AUTH_SKIP_AUTH_UPDATER=False)
+ class TestMyTests(TestCase):
+ def setUpTestData(cls):
+ site_auths.clear()
+ site_auths.add_group("edc_dashboard.view_my_listboard", name=CLINIC)
+ site_auths.add_custom_permissions_tuples(
+ model="edc_dashboard.edcpermissions",
+ codename_tuples=(("edc_dashboard.view_my_listboard", "View my listboard"),),
+ )
+ AuthUpdater(verbose=False, warn_only=True)
+ return super().setUpTestData()
+ def test_me(self):
+Importing users
++++++++++++++++
+You create user accounts by importing a specially formatted CSV file. Once an account is created a "Welcome" email may be sent.
+Import users from a CSV file with columns:
+ username
+ is_staff
+ is_active
+ first_name
+ last_name
+ job_title
+ email
+ mobile
+ alternate_email
+ site_names: a comma-separated list of sites
+ role_names: a comma-separated list of roles
+Then import the users from your application commandline
+ python manage.py import_users --csvfile=/Users/erikvw/meta_users.csv --notify-to-test-email=ew2789@gmail --resource-name=meta.clinicedc.org --resend-as-new
+Legacy notes
+++++++++++++
+**Important:** If you are upgrading from edc_base.auth:
+The ``userprofile`` table is now in ``edc_auth``. ``edc_auth`` has one migration for this table.
+Copy the same table from ``edc_base`` and fake the ``edc_auth`` migration.
+ CREATE TABLE edc_auth_userprofile LIKE edc_base_userprofile;
+ INSERT edc_auth_userprofile SELECT * FROM edc_base_userprofile;
+ python manage.py migrate edc_auth --fake
+You can now run the ``edc_base`` migration safely.
+
+%prep
+%autosetup -n edc-auth-0.3.59
+
+%build
+%py3_build
+
+%install
+%py3_install
+install -d -m755 %{buildroot}/%{_pkgdocdir}
+if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi
+if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi
+if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi
+if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi
+pushd %{buildroot}
+if [ -d usr/lib ]; then
+ find usr/lib -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/lib64 ]; then
+ find usr/lib64 -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/bin ]; then
+ find usr/bin -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/sbin ]; then
+ find usr/sbin -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+touch doclist.lst
+if [ -d usr/share/man ]; then
+ find usr/share/man -type f -printf "/%h/%f.gz\n" >> doclist.lst
+fi
+popd
+mv %{buildroot}/filelist.lst .
+mv %{buildroot}/doclist.lst .
+
+%files -n python3-edc-auth -f filelist.lst
+%dir %{python3_sitelib}/*
+
+%files help -f doclist.lst
+%{_docdir}/*
+
+%changelog
+* Mon May 15 2023 Python_Bot <Python_Bot@openeuler.org> - 0.3.59-1
+- Package Spec generated