django-users-iag-usp 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,11 @@
1
+ # Python-generated files
2
+ __pycache__/
3
+ *.py[oc]
4
+ build/
5
+ dist/
6
+ wheels/
7
+ *.egg-info
8
+ .pytest_cache
9
+ # Virtual environments
10
+ .venv
11
+ db.sqlite3
@@ -0,0 +1 @@
1
+ 3.13
@@ -0,0 +1,13 @@
1
+ Metadata-Version: 2.4
2
+ Name: django-users-iag-usp
3
+ Version: 0.1.0
4
+ Summary: Add your description here
5
+ Author-email: Marcelo Schneider <schenider.fei@gmail.com>
6
+ License: MIT
7
+ Keywords: custom-user,django
8
+ Classifier: Framework :: Django
9
+ Classifier: Framework :: Django :: 4.2
10
+ Classifier: Framework :: Django :: 5.0
11
+ Classifier: Programming Language :: Python :: 3
12
+ Requires-Python: >=3.13
13
+ Requires-Dist: django>=6.0.1
File without changes
@@ -0,0 +1,31 @@
1
+ import sys
2
+ from pathlib import Path
3
+ import django
4
+ from django.conf import settings
5
+ from django.core.management import execute_from_command_line
6
+
7
+ BASE_DIR = Path(__file__).resolve().parent
8
+ sys.path.insert(0, str(BASE_DIR / "src"))
9
+
10
+ if __name__ == "__main__":
11
+ if not settings.configured:
12
+ settings.configure(
13
+ DEBUG=True,
14
+ SECRET_KEY='dev-key',
15
+ DATABASES={
16
+ 'default': {
17
+ 'ENGINE': 'django.db.backends.sqlite3',
18
+ 'NAME': BASE_DIR / 'db.sqlite3',
19
+ }
20
+ },
21
+ INSTALLED_APPS=[
22
+ 'django.contrib.auth',
23
+ 'django.contrib.contenttypes',
24
+ 'ldap',
25
+ ],
26
+ AUTH_USER_MODEL='ldap.LdapUser',
27
+ )
28
+ django.setup()
29
+
30
+ # Passa os argumentos do terminal para o Django
31
+ execute_from_command_line(sys.argv)
@@ -0,0 +1,37 @@
1
+ [project]
2
+ name = "django-users-iag-usp"
3
+ version = "0.1.0"
4
+ description = "Add your description here"
5
+ readme = "README.md"
6
+ requires-python = ">=3.13"
7
+ license = { text = "MIT" }
8
+ authors = [
9
+ { name = "Marcelo Schneider", email = "schenider.fei@gmail.com" }
10
+ ]
11
+
12
+ keywords = ["django", "custom-user"]
13
+
14
+ classifiers = [
15
+ "Framework :: Django",
16
+ "Framework :: Django :: 4.2",
17
+ "Framework :: Django :: 5.0",
18
+ "Programming Language :: Python :: 3",
19
+ ]
20
+
21
+ dependencies = [
22
+ "django>=6.0.1",
23
+ ]
24
+
25
+ [dependency-groups]
26
+ dev = [
27
+ "pytest>=9.0.2",
28
+ ]
29
+ [build-system]
30
+ requires = ["hatchling"]
31
+ build-backend = "hatchling.build"
32
+
33
+ [tool.pytest.ini_options]
34
+ pythonpath = ["src"]
35
+
36
+ [tool.hatch.build.targets.wheel]
37
+ packages = ["src/ldap"]
File without changes
File without changes
@@ -0,0 +1,3 @@
1
+ from django.contrib import admin
2
+
3
+ # Register your models here.
@@ -0,0 +1,7 @@
1
+ from django.apps import AppConfig
2
+
3
+
4
+ class LdapConfig(AppConfig):
5
+ default_auto_field = 'django.db.models.BigAutoField'
6
+ name = 'ldap'
7
+ verbose_name = 'Gerenciamento de Usuários'
@@ -0,0 +1,46 @@
1
+ # Generated by Django 6.0.1 on 2026-01-20 13:05
2
+
3
+ import django.contrib.auth.models
4
+ import django.contrib.auth.validators
5
+ import django.utils.timezone
6
+ from django.db import migrations, models
7
+
8
+
9
+ class Migration(migrations.Migration):
10
+
11
+ initial = True
12
+
13
+ dependencies = [
14
+ ('auth', '0012_alter_user_first_name_max_length'),
15
+ ]
16
+
17
+ operations = [
18
+ migrations.CreateModel(
19
+ name='LdapUser',
20
+ fields=[
21
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
22
+ ('password', models.CharField(max_length=128, verbose_name='password')),
23
+ ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
24
+ ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
25
+ ('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')),
26
+ ('first_name', models.CharField(blank=True, max_length=150, verbose_name='first name')),
27
+ ('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')),
28
+ ('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')),
29
+ ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')),
30
+ ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')),
31
+ ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),
32
+ ('groups', models.TextField()),
33
+ ('created_at', models.DateField()),
34
+ ('updated_at', models.DateField()),
35
+ ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.permission', verbose_name='user permissions')),
36
+ ],
37
+ options={
38
+ 'verbose_name': 'user',
39
+ 'verbose_name_plural': 'users',
40
+ 'abstract': False,
41
+ },
42
+ managers=[
43
+ ('objects', django.contrib.auth.models.UserManager()),
44
+ ],
45
+ ),
46
+ ]
@@ -0,0 +1,23 @@
1
+ # Generated by Django 6.0.1 on 2026-01-20 13:35
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('ldap', '0001_initial'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterField(
14
+ model_name='ldapuser',
15
+ name='created_at',
16
+ field=models.DateField(auto_now_add=True),
17
+ ),
18
+ migrations.AlterField(
19
+ model_name='ldapuser',
20
+ name='updated_at',
21
+ field=models.DateField(auto_now=True),
22
+ ),
23
+ ]
@@ -0,0 +1,14 @@
1
+ from django.contrib.auth.models import AbstractUser
2
+ from django.db import models
3
+
4
+
5
+ class LdapUser(AbstractUser):
6
+ groups = models.TextField()
7
+ created_at = models.DateField(auto_now_add=True)
8
+ updated_at = models.DateField(auto_now=True)
9
+
10
+ def get_setor(self):
11
+ groups_striped = self.groups.replace(" ", "")
12
+ groups = groups_striped.split(",")
13
+ return groups
14
+
File without changes
@@ -0,0 +1,55 @@
1
+ import sys
2
+ import os
3
+ from pathlib import Path
4
+ from django.conf import settings
5
+ from django.core.management import call_command
6
+ import django
7
+ import pytest
8
+
9
+ def pytest_configure():
10
+ """
11
+ Configura o Django antes da coleta de testes.
12
+ Isso evita o erro de 'AppRegistryNotReady' durante imports globais.
13
+ """
14
+ base_dir = Path(__file__).resolve().parent
15
+ src_dir = base_dir / "src"
16
+ sys.path.insert(0, str(src_dir))
17
+
18
+ if not settings.configured:
19
+ settings.configure(
20
+ DEBUG=True,
21
+ SECRET_KEY='test-secret-key',
22
+ DATABASES={
23
+ 'default': {
24
+ 'ENGINE': 'django.db.backends.sqlite3',
25
+ 'NAME': ':memory:',
26
+ }
27
+ },
28
+ INSTALLED_APPS=[
29
+ 'django.contrib.auth',
30
+ 'django.contrib.contenttypes',
31
+ 'django.contrib.admin',
32
+ 'django.contrib.messages',
33
+ 'ldap',
34
+ ],
35
+ # Ponto CRUCIAL para testar Custom Users:
36
+ AUTH_USER_MODEL='ldap.LdapUser',
37
+
38
+ # Necessário para admin e auth
39
+ MIDDLEWARE=[
40
+ 'django.contrib.sessions.middleware.SessionMiddleware',
41
+ 'django.contrib.auth.middleware.AuthenticationMiddleware',
42
+ 'django.contrib.messages.middleware.MessageMiddleware',
43
+ ],
44
+ TEMPLATES=[{
45
+ 'BACKEND': 'django.template.backends.django.DjangoTemplates',
46
+ 'APP_DIRS': True,
47
+ }],
48
+ )
49
+ django.setup()
50
+ call_command("migrate", verbosity=0)
51
+
52
+ @pytest.fixture
53
+ def user_model():
54
+ from django.contrib.auth import get_user_model
55
+ return get_user_model()
@@ -0,0 +1,36 @@
1
+ from ldap.models import LdapUser
2
+ from django.db.models import Model
3
+
4
+
5
+ def test_is_instance_of_models():
6
+ assert issubclass(LdapUser, Model)
7
+
8
+
9
+ def test_model_has_attributes():
10
+ attributes = [
11
+ "username",
12
+ "first_name",
13
+ "last_name",
14
+ "email",
15
+ "groups",
16
+ "password",
17
+ "created_at",
18
+ "updated_at"
19
+ ]
20
+
21
+ for attr in attributes:
22
+ assert hasattr(LdapUser, attr)
23
+
24
+ def test_get_setor():
25
+ user_data = {
26
+ "username": "3222233",
27
+ "first_name": "First",
28
+ "last_name": "Last",
29
+ "email": "first@test.com",
30
+ "groups": "GTI, PCA",
31
+ "password": "0982349"
32
+ }
33
+ user = LdapUser.objects.create(**user_data)
34
+ setor = user.get_setor()
35
+ assert setor == ["GTI", "PCA"]
36
+
@@ -0,0 +1,124 @@
1
+ version = 1
2
+ revision = 3
3
+ requires-python = ">=3.13"
4
+
5
+ [[package]]
6
+ name = "asgiref"
7
+ version = "3.11.0"
8
+ source = { registry = "https://pypi.org/simple" }
9
+ sdist = { url = "https://files.pythonhosted.org/packages/76/b9/4db2509eabd14b4a8c71d1b24c8d5734c52b8560a7b1e1a8b56c8d25568b/asgiref-3.11.0.tar.gz", hash = "sha256:13acff32519542a1736223fb79a715acdebe24286d98e8b164a73085f40da2c4", size = 37969, upload-time = "2025-11-19T15:32:20.106Z" }
10
+ wheels = [
11
+ { url = "https://files.pythonhosted.org/packages/91/be/317c2c55b8bbec407257d45f5c8d1b6867abc76d12043f2d3d58c538a4ea/asgiref-3.11.0-py3-none-any.whl", hash = "sha256:1db9021efadb0d9512ce8ffaf72fcef601c7b73a8807a1bb2ef143dc6b14846d", size = 24096, upload-time = "2025-11-19T15:32:19.004Z" },
12
+ ]
13
+
14
+ [[package]]
15
+ name = "colorama"
16
+ version = "0.4.6"
17
+ source = { registry = "https://pypi.org/simple" }
18
+ sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" }
19
+ wheels = [
20
+ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" },
21
+ ]
22
+
23
+ [[package]]
24
+ name = "django"
25
+ version = "6.0.1"
26
+ source = { registry = "https://pypi.org/simple" }
27
+ dependencies = [
28
+ { name = "asgiref" },
29
+ { name = "sqlparse" },
30
+ { name = "tzdata", marker = "sys_platform == 'win32'" },
31
+ ]
32
+ sdist = { url = "https://files.pythonhosted.org/packages/b5/9b/016f7e55e855ee738a352b05139d4f8b278d0b451bd01ebef07456ef3b0e/django-6.0.1.tar.gz", hash = "sha256:ed76a7af4da21551573b3d9dfc1f53e20dd2e6c7d70a3adc93eedb6338130a5f", size = 11069565, upload-time = "2026-01-06T18:55:53.069Z" }
33
+ wheels = [
34
+ { url = "https://files.pythonhosted.org/packages/95/b5/814ed98bd21235c116fd3436a7ed44d47560329a6d694ec8aac2982dbb93/django-6.0.1-py3-none-any.whl", hash = "sha256:a92a4ff14f664a896f9849009cb8afaca7abe0d6fc53325f3d1895a15253433d", size = 8338791, upload-time = "2026-01-06T18:55:46.175Z" },
35
+ ]
36
+
37
+ [[package]]
38
+ name = "django-users"
39
+ version = "0.1.0"
40
+ source = { virtual = "." }
41
+ dependencies = [
42
+ { name = "django" },
43
+ ]
44
+
45
+ [package.dev-dependencies]
46
+ dev = [
47
+ { name = "pytest" },
48
+ ]
49
+
50
+ [package.metadata]
51
+ requires-dist = [{ name = "django", specifier = ">=6.0.1" }]
52
+
53
+ [package.metadata.requires-dev]
54
+ dev = [{ name = "pytest", specifier = ">=9.0.2" }]
55
+
56
+ [[package]]
57
+ name = "iniconfig"
58
+ version = "2.3.0"
59
+ source = { registry = "https://pypi.org/simple" }
60
+ sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" }
61
+ wheels = [
62
+ { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" },
63
+ ]
64
+
65
+ [[package]]
66
+ name = "packaging"
67
+ version = "25.0"
68
+ source = { registry = "https://pypi.org/simple" }
69
+ sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" }
70
+ wheels = [
71
+ { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" },
72
+ ]
73
+
74
+ [[package]]
75
+ name = "pluggy"
76
+ version = "1.6.0"
77
+ source = { registry = "https://pypi.org/simple" }
78
+ sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" }
79
+ wheels = [
80
+ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" },
81
+ ]
82
+
83
+ [[package]]
84
+ name = "pygments"
85
+ version = "2.19.2"
86
+ source = { registry = "https://pypi.org/simple" }
87
+ sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" }
88
+ wheels = [
89
+ { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" },
90
+ ]
91
+
92
+ [[package]]
93
+ name = "pytest"
94
+ version = "9.0.2"
95
+ source = { registry = "https://pypi.org/simple" }
96
+ dependencies = [
97
+ { name = "colorama", marker = "sys_platform == 'win32'" },
98
+ { name = "iniconfig" },
99
+ { name = "packaging" },
100
+ { name = "pluggy" },
101
+ { name = "pygments" },
102
+ ]
103
+ sdist = { url = "https://files.pythonhosted.org/packages/d1/db/7ef3487e0fb0049ddb5ce41d3a49c235bf9ad299b6a25d5780a89f19230f/pytest-9.0.2.tar.gz", hash = "sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11", size = 1568901, upload-time = "2025-12-06T21:30:51.014Z" }
104
+ wheels = [
105
+ { url = "https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl", hash = "sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b", size = 374801, upload-time = "2025-12-06T21:30:49.154Z" },
106
+ ]
107
+
108
+ [[package]]
109
+ name = "sqlparse"
110
+ version = "0.5.5"
111
+ source = { registry = "https://pypi.org/simple" }
112
+ sdist = { url = "https://files.pythonhosted.org/packages/90/76/437d71068094df0726366574cf3432a4ed754217b436eb7429415cf2d480/sqlparse-0.5.5.tar.gz", hash = "sha256:e20d4a9b0b8585fdf63b10d30066c7c94c5d7a7ec47c889a2d83a3caa93ff28e", size = 120815, upload-time = "2025-12-19T07:17:45.073Z" }
113
+ wheels = [
114
+ { url = "https://files.pythonhosted.org/packages/49/4b/359f28a903c13438ef59ebeee215fb25da53066db67b305c125f1c6d2a25/sqlparse-0.5.5-py3-none-any.whl", hash = "sha256:12a08b3bf3eec877c519589833aed092e2444e68240a3577e8e26148acc7b1ba", size = 46138, upload-time = "2025-12-19T07:17:46.573Z" },
115
+ ]
116
+
117
+ [[package]]
118
+ name = "tzdata"
119
+ version = "2025.3"
120
+ source = { registry = "https://pypi.org/simple" }
121
+ sdist = { url = "https://files.pythonhosted.org/packages/5e/a7/c202b344c5ca7daf398f3b8a477eeb205cf3b6f32e7ec3a6bac0629ca975/tzdata-2025.3.tar.gz", hash = "sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7", size = 196772, upload-time = "2025-12-13T17:45:35.667Z" }
122
+ wheels = [
123
+ { url = "https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1", size = 348521, upload-time = "2025-12-13T17:45:33.889Z" },
124
+ ]