trovesuite 1.0.4__py3-none-any.whl → 1.0.6__py3-none-any.whl
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.
- trovesuite/__init__.py +7 -5
- trovesuite/auth/__init__.py +2 -5
- trovesuite/auth/auth_controller.py +4 -4
- trovesuite/entities/health.py +4 -4
- trovesuite/notification/__init__.py +14 -0
- trovesuite/notification/notification_base.py +13 -0
- trovesuite/notification/notification_controller.py +21 -0
- trovesuite/notification/notification_read_dto.py +21 -0
- trovesuite/notification/notification_service.py +73 -0
- trovesuite/notification/notification_write_dto.py +21 -0
- {trovesuite-1.0.4.dist-info → trovesuite-1.0.6.dist-info}/METADATA +176 -5
- trovesuite-1.0.6.dist-info/RECORD +27 -0
- trovesuite-1.0.4.dist-info/RECORD +0 -21
- {trovesuite-1.0.4.dist-info → trovesuite-1.0.6.dist-info}/WHEEL +0 -0
- {trovesuite-1.0.4.dist-info → trovesuite-1.0.6.dist-info}/licenses/LICENSE +0 -0
- {trovesuite-1.0.4.dist-info → trovesuite-1.0.6.dist-info}/top_level.txt +0 -0
trovesuite/__init__.py
CHANGED
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
"""
|
|
2
|
-
TroveSuite
|
|
2
|
+
TroveSuite Package
|
|
3
3
|
|
|
4
|
-
A comprehensive authentication and
|
|
5
|
-
Provides JWT token validation, user authorization, and
|
|
4
|
+
A comprehensive authentication, authorization, and notification service for ERP systems.
|
|
5
|
+
Provides JWT token validation, user authorization, permission checking, and notification capabilities.
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
8
|
from .auth import AuthService
|
|
9
|
+
from .notification import NotificationService
|
|
9
10
|
|
|
10
|
-
__version__ = "1.0.
|
|
11
|
+
__version__ = "1.0.5"
|
|
11
12
|
__author__ = "Bright Debrah Owusu"
|
|
12
13
|
__email__ = "owusu.debrah@deladetech.com"
|
|
13
14
|
|
|
14
15
|
__all__ = [
|
|
15
|
-
"AuthService"
|
|
16
|
+
"AuthService",
|
|
17
|
+
"NotificationService"
|
|
16
18
|
]
|
trovesuite/auth/__init__.py
CHANGED
|
@@ -5,13 +5,10 @@ Authentication and authorization services for ERP systems.
|
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
7
|
from .auth_service import AuthService
|
|
8
|
-
from .
|
|
9
|
-
from .auth_read_dto import AuthServiceReadDto, AuthControllerReadDto
|
|
8
|
+
from .auth_write_dto import AuthServiceWriteDto
|
|
10
9
|
|
|
11
10
|
__all__ = [
|
|
12
11
|
"AuthService",
|
|
13
|
-
"
|
|
14
|
-
"AuthServiceReadDto",
|
|
15
|
-
"AuthControllerReadDto"
|
|
12
|
+
"AuthServiceWriteDto"
|
|
16
13
|
]
|
|
17
14
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
from fastapi import APIRouter
|
|
2
|
-
from
|
|
3
|
-
from
|
|
4
|
-
from
|
|
5
|
-
from
|
|
2
|
+
from .auth_write_dto import AuthControllerWriteDto
|
|
3
|
+
from .auth_read_dto import AuthControllerReadDto
|
|
4
|
+
from .auth_service import AuthService
|
|
5
|
+
from ..entities.sh_response import Respons
|
|
6
6
|
|
|
7
7
|
auth_router = APIRouter()
|
|
8
8
|
|
trovesuite/entities/health.py
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
from fastapi import APIRouter
|
|
2
|
-
from
|
|
3
|
-
from
|
|
4
|
-
from
|
|
5
|
-
from
|
|
2
|
+
from .sh_response import Respons
|
|
3
|
+
from ..configs.settings import db_settings
|
|
4
|
+
from ..configs.database import DatabaseManager
|
|
5
|
+
from ..configs.logging import get_logger
|
|
6
6
|
|
|
7
7
|
health_check_router = APIRouter(tags=["Health Path"])
|
|
8
8
|
logger = get_logger("health")
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"""
|
|
2
|
+
TroveSuite Notification Service
|
|
3
|
+
|
|
4
|
+
Provides email and SMS notification capabilities for TroveSuite applications.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from .notification_service import NotificationService
|
|
8
|
+
from .notification_write_dto import NotificationEmailServiceWriteDto, NotificationSMSServiceWriteDto
|
|
9
|
+
|
|
10
|
+
__all__ = [
|
|
11
|
+
"NotificationService",
|
|
12
|
+
"NotificationEmailServiceWriteDto",
|
|
13
|
+
"NotificationSMSServiceWriteDto"
|
|
14
|
+
]
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
from typing import List, Optional, Union
|
|
2
|
+
from pydantic import BaseModel
|
|
3
|
+
|
|
4
|
+
class NotificationEmailBase(BaseModel):
|
|
5
|
+
sender_email: str
|
|
6
|
+
receiver_email: Union[str, List[str]]
|
|
7
|
+
password: str
|
|
8
|
+
subject: str
|
|
9
|
+
text_message: str
|
|
10
|
+
html_message: Optional[str] = None
|
|
11
|
+
|
|
12
|
+
class NotificationSMSBase(BaseModel):
|
|
13
|
+
pass
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
from .notification_write_dto import (
|
|
2
|
+
NotificationEmailControllerWriteDto,
|
|
3
|
+
NotificationSMSControllerWriteDto
|
|
4
|
+
)
|
|
5
|
+
from .notification_read_dto import (
|
|
6
|
+
NotificationEmailControllerReadDto,
|
|
7
|
+
NotificationSMSControllerReadDto
|
|
8
|
+
)
|
|
9
|
+
from .notification_service import NotificationService
|
|
10
|
+
from ..entities.sh_response import Respons
|
|
11
|
+
from fastapi import APIRouter
|
|
12
|
+
|
|
13
|
+
notification_router = APIRouter()
|
|
14
|
+
|
|
15
|
+
@notification_router.post("/send_email", response_model=Respons[NotificationEmailControllerReadDto])
|
|
16
|
+
async def send_email(data: NotificationEmailControllerWriteDto):
|
|
17
|
+
return NotificationService.send_email(data=data)
|
|
18
|
+
|
|
19
|
+
@notification_router.post("/send_sms", response_model=Respons[NotificationSMSControllerReadDto])
|
|
20
|
+
async def send_sms(data: NotificationSMSControllerWriteDto):
|
|
21
|
+
return NotificationService.send_sms(data=data)
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
from .notification_base import (
|
|
2
|
+
NotificationEmailBase,
|
|
3
|
+
NotificationSMSBase
|
|
4
|
+
)
|
|
5
|
+
from pydantic import BaseModel
|
|
6
|
+
|
|
7
|
+
# EMAIL Notification
|
|
8
|
+
|
|
9
|
+
class NotificationEmailControllerReadDto(NotificationEmailBase):
|
|
10
|
+
pass
|
|
11
|
+
|
|
12
|
+
class NotificationEmailServiceReadDto(BaseModel):
|
|
13
|
+
pass
|
|
14
|
+
|
|
15
|
+
# SMS Notification
|
|
16
|
+
|
|
17
|
+
class NotificationSMSControllerReadDto(NotificationSMSBase):
|
|
18
|
+
pass
|
|
19
|
+
|
|
20
|
+
class NotificationSMSServiceReadDto(BaseModel):
|
|
21
|
+
pass
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import smtplib
|
|
2
|
+
from email.mime.text import MIMEText
|
|
3
|
+
from email.mime.multipart import MIMEMultipart
|
|
4
|
+
from ..entities.sh_response import Respons
|
|
5
|
+
from .notification_read_dto import (
|
|
6
|
+
NotificationEmailServiceReadDto,
|
|
7
|
+
NotificationSMSServiceReadDto
|
|
8
|
+
)
|
|
9
|
+
from .notification_write_dto import (
|
|
10
|
+
NotificationEmailServiceWriteDto,
|
|
11
|
+
NotificationSMSServiceWriteDto
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
class NotificationService:
|
|
15
|
+
|
|
16
|
+
@staticmethod
|
|
17
|
+
def send_email(data: NotificationEmailServiceWriteDto) -> Respons[NotificationEmailServiceReadDto]:
|
|
18
|
+
"""
|
|
19
|
+
Send an email (single or multiple recipients) via Gmail SMTP.
|
|
20
|
+
Supports both plain text and HTML email bodies.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
# Extract input data
|
|
24
|
+
receiver_email = data.receiver_email
|
|
25
|
+
text_message = data.text_message
|
|
26
|
+
html_message = getattr(data, "html_message", None)
|
|
27
|
+
sender_email = data.sender_email
|
|
28
|
+
password = data.password
|
|
29
|
+
subject = data.subject
|
|
30
|
+
|
|
31
|
+
# Allow single email or list
|
|
32
|
+
if isinstance(receiver_email, str):
|
|
33
|
+
receiver_email = [receiver_email]
|
|
34
|
+
|
|
35
|
+
# Create the email container
|
|
36
|
+
message = MIMEMultipart("alternative")
|
|
37
|
+
message["From"] = sender_email
|
|
38
|
+
message["To"] = ", ".join(receiver_email)
|
|
39
|
+
message["Subject"] = subject
|
|
40
|
+
|
|
41
|
+
# Attach plain text
|
|
42
|
+
message.attach(MIMEText(text_message, "plain"))
|
|
43
|
+
|
|
44
|
+
# Attach HTML if provided
|
|
45
|
+
if html_message:
|
|
46
|
+
message.attach(MIMEText(html_message, "html"))
|
|
47
|
+
|
|
48
|
+
try:
|
|
49
|
+
with smtplib.SMTP_SSL("smtp.gmail.com", 465) as server:
|
|
50
|
+
server.login(sender_email, password)
|
|
51
|
+
server.sendmail(sender_email, receiver_email, message.as_string())
|
|
52
|
+
|
|
53
|
+
return Respons[NotificationEmailServiceReadDto](
|
|
54
|
+
detail=f"Email successfully sent to {len(receiver_email)} recipient(s)",
|
|
55
|
+
error=None,
|
|
56
|
+
data=[],
|
|
57
|
+
status_code=200,
|
|
58
|
+
success=True,
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
except Exception as e:
|
|
62
|
+
print(e)
|
|
63
|
+
return Respons[NotificationEmailServiceReadDto](
|
|
64
|
+
detail="An error occurred while sending the email",
|
|
65
|
+
error=str(e),
|
|
66
|
+
data=[],
|
|
67
|
+
status_code=500,
|
|
68
|
+
success=False,
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
@staticmethod
|
|
72
|
+
def send_sms(data: NotificationSMSServiceWriteDto) -> Respons[NotificationSMSServiceReadDto]:
|
|
73
|
+
pass
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
from pydantic import BaseModel
|
|
2
|
+
from .notification_base import (
|
|
3
|
+
NotificationEmailBase,
|
|
4
|
+
NotificationSMSBase
|
|
5
|
+
)
|
|
6
|
+
|
|
7
|
+
# Email Notification
|
|
8
|
+
|
|
9
|
+
class NotificationEmailControllerWriteDto(NotificationEmailBase):
|
|
10
|
+
pass
|
|
11
|
+
|
|
12
|
+
class NotificationEmailServiceWriteDto(NotificationEmailControllerWriteDto):
|
|
13
|
+
pass
|
|
14
|
+
|
|
15
|
+
# SMS Notification
|
|
16
|
+
|
|
17
|
+
class NotificationSMSControllerWriteDto(NotificationSMSBase):
|
|
18
|
+
pass
|
|
19
|
+
|
|
20
|
+
class NotificationSMSServiceWriteDto(BaseModel):
|
|
21
|
+
pass
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: trovesuite
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.6
|
|
4
4
|
Summary: TroveSuite services package providing authentication, authorization, notifications, and other enterprise services for TroveSuite applications
|
|
5
5
|
Home-page: https://dev.azure.com/brightgclt/trovesuite/_git/packages
|
|
6
6
|
Author: Bright Debrah Owusu
|
|
@@ -119,10 +119,28 @@ poetry install --with dev
|
|
|
119
119
|
|
|
120
120
|
## Quick Start
|
|
121
121
|
|
|
122
|
+
> **✅ Package Status**: All import issues have been resolved in version 1.0.5. The package now works correctly when installed from PyPI or wheel files.
|
|
123
|
+
|
|
124
|
+
### Import Patterns
|
|
125
|
+
|
|
126
|
+
The package provides clean, simplified import patterns:
|
|
127
|
+
|
|
128
|
+
```python
|
|
129
|
+
# Import services and DTOs from main package
|
|
130
|
+
from trovesuite import AuthService, NotificationService
|
|
131
|
+
from trovesuite.auth import AuthServiceWriteDto
|
|
132
|
+
from trovesuite.notification import NotificationEmailServiceWriteDto, NotificationSMSServiceWriteDto
|
|
133
|
+
|
|
134
|
+
# Or import everything you need in one line
|
|
135
|
+
from trovesuite import AuthService, NotificationService
|
|
136
|
+
from trovesuite.auth import AuthServiceWriteDto
|
|
137
|
+
from trovesuite.notification import NotificationEmailServiceWriteDto
|
|
138
|
+
```
|
|
139
|
+
|
|
122
140
|
### Basic Usage
|
|
123
141
|
|
|
124
142
|
```python
|
|
125
|
-
from trovesuite import AuthService
|
|
143
|
+
from trovesuite import AuthService, NotificationService
|
|
126
144
|
from trovesuite.configs.settings import db_settings
|
|
127
145
|
|
|
128
146
|
# Configure your database settings
|
|
@@ -137,7 +155,7 @@ db_settings.SECRET_KEY = "your-secret-key"
|
|
|
137
155
|
auth_service = AuthService()
|
|
138
156
|
|
|
139
157
|
# Authorize a user
|
|
140
|
-
from trovesuite.auth
|
|
158
|
+
from trovesuite.auth import AuthServiceWriteDto
|
|
141
159
|
auth_data = AuthServiceWriteDto(user_id="user123", tenant="tenant456")
|
|
142
160
|
result = AuthService.authorize(auth_data)
|
|
143
161
|
|
|
@@ -149,6 +167,30 @@ else:
|
|
|
149
167
|
print(f"Authorization failed: {result.detail}")
|
|
150
168
|
```
|
|
151
169
|
|
|
170
|
+
### Notification Service Usage
|
|
171
|
+
|
|
172
|
+
```python
|
|
173
|
+
from trovesuite import NotificationService
|
|
174
|
+
from trovesuite.notification import NotificationEmailServiceWriteDto
|
|
175
|
+
|
|
176
|
+
# Send an email notification
|
|
177
|
+
email_data = NotificationEmailServiceWriteDto(
|
|
178
|
+
sender_email="your-email@gmail.com",
|
|
179
|
+
receiver_email=["recipient1@example.com", "recipient2@example.com"],
|
|
180
|
+
password="your-app-password", # Gmail app password
|
|
181
|
+
subject="Test Notification",
|
|
182
|
+
text_message="This is a plain text message",
|
|
183
|
+
html_message="<h1>This is an HTML message</h1><p>With rich formatting!</p>"
|
|
184
|
+
)
|
|
185
|
+
|
|
186
|
+
result = NotificationService.send_email(email_data)
|
|
187
|
+
|
|
188
|
+
if result.success:
|
|
189
|
+
print(f"Email sent successfully: {result.detail}")
|
|
190
|
+
else:
|
|
191
|
+
print(f"Email failed: {result.error}")
|
|
192
|
+
```
|
|
193
|
+
|
|
152
194
|
### JWT Token Decoding
|
|
153
195
|
|
|
154
196
|
```python
|
|
@@ -166,7 +208,7 @@ async def protected_route(token: str = Depends(oauth2_scheme)):
|
|
|
166
208
|
tenant_id = user_data["tenant_id"]
|
|
167
209
|
|
|
168
210
|
# Authorize user
|
|
169
|
-
from trovesuite.auth
|
|
211
|
+
from trovesuite.auth import AuthServiceWriteDto
|
|
170
212
|
auth_data = AuthServiceWriteDto(user_id=user_id, tenant=tenant_id)
|
|
171
213
|
auth_result = AuthService.authorize(auth_data)
|
|
172
214
|
return auth_result
|
|
@@ -395,8 +437,84 @@ Check if user has all of the required permissions.
|
|
|
395
437
|
**Returns:**
|
|
396
438
|
- `bool`: True if user has all of the required permissions
|
|
397
439
|
|
|
440
|
+
### NotificationService
|
|
441
|
+
|
|
442
|
+
#### `send_email(data: NotificationEmailServiceWriteDto) -> Respons[NotificationEmailServiceReadDto]`
|
|
443
|
+
|
|
444
|
+
Sends an email notification via Gmail SMTP. Supports both plain text and HTML email bodies.
|
|
445
|
+
|
|
446
|
+
**Parameters:**
|
|
447
|
+
- `data`: Email notification data including sender, recipients, subject, and message content
|
|
448
|
+
|
|
449
|
+
**Returns:**
|
|
450
|
+
- `Respons[NotificationEmailServiceReadDto]`: Email sending result with success status and details
|
|
451
|
+
|
|
452
|
+
**Example:**
|
|
453
|
+
```python
|
|
454
|
+
from trovesuite import NotificationService
|
|
455
|
+
from trovesuite.notification import NotificationEmailServiceWriteDto
|
|
456
|
+
|
|
457
|
+
email_data = NotificationEmailServiceWriteDto(
|
|
458
|
+
sender_email="sender@gmail.com",
|
|
459
|
+
receiver_email=["user1@example.com", "user2@example.com"],
|
|
460
|
+
password="your-gmail-app-password",
|
|
461
|
+
subject="Welcome to TroveSuite",
|
|
462
|
+
text_message="Welcome! This is a plain text message.",
|
|
463
|
+
html_message="<h1>Welcome!</h1><p>This is an <strong>HTML</strong> message.</p>"
|
|
464
|
+
)
|
|
465
|
+
|
|
466
|
+
result = NotificationService.send_email(email_data)
|
|
467
|
+
if result.success:
|
|
468
|
+
print("Email sent successfully!")
|
|
469
|
+
else:
|
|
470
|
+
print(f"Failed to send email: {result.error}")
|
|
471
|
+
```
|
|
472
|
+
|
|
473
|
+
#### `send_sms(data: NotificationSMSServiceWriteDto) -> Respons[NotificationSMSServiceReadDto]`
|
|
474
|
+
|
|
475
|
+
Sends an SMS notification (currently not implemented).
|
|
476
|
+
|
|
477
|
+
**Parameters:**
|
|
478
|
+
- `data`: SMS notification data
|
|
479
|
+
|
|
480
|
+
**Returns:**
|
|
481
|
+
- `Respons[NotificationSMSServiceReadDto]`: SMS sending result
|
|
482
|
+
|
|
398
483
|
### Data Models
|
|
399
484
|
|
|
485
|
+
#### `NotificationEmailServiceWriteDto`
|
|
486
|
+
|
|
487
|
+
```python
|
|
488
|
+
class NotificationEmailServiceWriteDto(BaseModel):
|
|
489
|
+
sender_email: str
|
|
490
|
+
receiver_email: Union[str, List[str]] # Single email or list of emails
|
|
491
|
+
password: str # Gmail app password
|
|
492
|
+
subject: str
|
|
493
|
+
text_message: str
|
|
494
|
+
html_message: Optional[str] = None # Optional HTML content
|
|
495
|
+
```
|
|
496
|
+
|
|
497
|
+
#### `NotificationEmailServiceReadDto`
|
|
498
|
+
|
|
499
|
+
```python
|
|
500
|
+
class NotificationEmailServiceReadDto(BaseModel):
|
|
501
|
+
pass # Empty response model for email service
|
|
502
|
+
```
|
|
503
|
+
|
|
504
|
+
#### `NotificationSMSServiceWriteDto`
|
|
505
|
+
|
|
506
|
+
```python
|
|
507
|
+
class NotificationSMSServiceWriteDto(BaseModel):
|
|
508
|
+
pass # To be implemented for SMS functionality
|
|
509
|
+
```
|
|
510
|
+
|
|
511
|
+
#### `NotificationSMSServiceReadDto`
|
|
512
|
+
|
|
513
|
+
```python
|
|
514
|
+
class NotificationSMSServiceReadDto(BaseModel):
|
|
515
|
+
pass # To be implemented for SMS functionality
|
|
516
|
+
```
|
|
517
|
+
|
|
400
518
|
#### `AuthServiceReadDto`
|
|
401
519
|
|
|
402
520
|
```python
|
|
@@ -557,15 +675,65 @@ poetry install
|
|
|
557
675
|
|
|
558
676
|
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
|
|
559
677
|
|
|
678
|
+
## Troubleshooting
|
|
679
|
+
|
|
680
|
+
### Import Issues
|
|
681
|
+
|
|
682
|
+
If you encounter import errors, make sure you're using the correct import patterns:
|
|
683
|
+
|
|
684
|
+
```python
|
|
685
|
+
# ✅ Correct imports
|
|
686
|
+
from trovesuite import AuthService, NotificationService
|
|
687
|
+
from trovesuite.auth import AuthServiceWriteDto
|
|
688
|
+
from trovesuite.notification import NotificationEmailServiceWriteDto
|
|
689
|
+
|
|
690
|
+
# ❌ Incorrect imports (will fail)
|
|
691
|
+
from trovesuite.auth.auth_write_dto import AuthServiceWriteDto # Too specific
|
|
692
|
+
from trovesuite.notification.notification_write_dto import NotificationEmailServiceWriteDto # Too specific
|
|
693
|
+
```
|
|
694
|
+
|
|
695
|
+
### Package Installation
|
|
696
|
+
|
|
697
|
+
If you're having issues with the package installation:
|
|
698
|
+
|
|
699
|
+
1. **Make sure you have the latest version**:
|
|
700
|
+
```bash
|
|
701
|
+
pip install --upgrade trovesuite
|
|
702
|
+
```
|
|
703
|
+
|
|
704
|
+
2. **Force reinstall if needed**:
|
|
705
|
+
```bash
|
|
706
|
+
pip install --force-reinstall trovesuite
|
|
707
|
+
```
|
|
708
|
+
|
|
709
|
+
3. **Check your Python environment**:
|
|
710
|
+
```bash
|
|
711
|
+
python -c "import trovesuite; print('Package installed successfully')"
|
|
712
|
+
```
|
|
713
|
+
|
|
714
|
+
### Common Issues
|
|
715
|
+
|
|
716
|
+
- **ImportError: No module named 'src'**: This was fixed in version 1.0.5. Update to the latest version.
|
|
717
|
+
- **AttributeError: module has no attribute 'AuthServiceWriteDto'**: Use `from trovesuite.auth import AuthServiceWriteDto` instead of importing from the main package.
|
|
718
|
+
|
|
560
719
|
## Support
|
|
561
720
|
|
|
562
721
|
For support, email brightgclt@gmail.com or create a work item in the [Azure DevOps repository](https://dev.azure.com/brightgclt/trovesuite/_workitems/create).
|
|
563
722
|
|
|
564
723
|
## Changelog
|
|
565
724
|
|
|
725
|
+
### 1.0.5
|
|
726
|
+
- Fixed all import issues across auth, notification, and entities modules
|
|
727
|
+
- Changed absolute imports (`from src.trovesuite.`) to relative imports (`from .` and `from ..`)
|
|
728
|
+
- Ensured package works correctly when installed from PyPI or wheel
|
|
729
|
+
- Added service write DTOs to module exports for easier usage
|
|
730
|
+
- Updated documentation with simplified import patterns
|
|
731
|
+
- All services and DTOs now import correctly in clean environments
|
|
732
|
+
- Package builds and installs without import errors
|
|
733
|
+
|
|
566
734
|
### 1.0.8
|
|
567
735
|
- Restructured package for direct service imports
|
|
568
|
-
- Added notification services
|
|
736
|
+
- Added comprehensive notification services with email support
|
|
569
737
|
- Excluded controllers from package build
|
|
570
738
|
- Updated import paths for better usability
|
|
571
739
|
- JWT token validation
|
|
@@ -574,3 +742,6 @@ For support, email brightgclt@gmail.com or create a work item in the [Azure DevO
|
|
|
574
742
|
- PostgreSQL database integration
|
|
575
743
|
- Comprehensive logging
|
|
576
744
|
- Azure integration support
|
|
745
|
+
- Email notification service with Gmail SMTP support
|
|
746
|
+
- Support for both plain text and HTML email content
|
|
747
|
+
- Multiple recipient support for email notifications
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
trovesuite/__init__.py,sha256=xDbpC3gIBHze_rI2C7xkof4xSoX6tZUOfp56-B2W8-w,457
|
|
2
|
+
trovesuite/auth/__init__.py,sha256=OjZllVvjul1glDazJ-d5TrNjgHFigFlQQi1G99DYshk,239
|
|
3
|
+
trovesuite/auth/auth_base.py,sha256=rZHQVLeJRBQ8GClgF5UwG-er4_HXVX5-nt8o6_Z29uY,75
|
|
4
|
+
trovesuite/auth/auth_controller.py,sha256=mQ5IDz2frgEFhcwnvbR2F2j9wKduPhlQTyPdoTWTaOY,407
|
|
5
|
+
trovesuite/auth/auth_read_dto.py,sha256=pQT1ouRVZMAiJn4wAG7NQOKQKTquTMWUe-dYcpLTmEo,533
|
|
6
|
+
trovesuite/auth/auth_service.py,sha256=if2RFI6F1DpbNEuCTSpPbhHVBdYQEg4hVkoxTCnvC4k,14298
|
|
7
|
+
trovesuite/auth/auth_write_dto.py,sha256=rdwI7w6-9QZGv1H0PAGrjkLBCzaMHjgPIXeLb9RmNec,234
|
|
8
|
+
trovesuite/configs/__init__.py,sha256=h1mSZOaZ3kUy1ZMO_m9O9KklsxywM0RfMVZLh9h9WvQ,328
|
|
9
|
+
trovesuite/configs/database.py,sha256=TYPlwydfWirOvCdA1N2gdqJWeesnxLBmRcxqVInZzEA,8320
|
|
10
|
+
trovesuite/configs/logging.py,sha256=mGjR2d4urVNry9l5_aXycMMtcY2RAFIpEL35hw33KZg,9308
|
|
11
|
+
trovesuite/configs/settings.py,sha256=yUbkiFi4QdO9JZG1RRFbP4tYurT47HmN-ohgYcs2SHM,2561
|
|
12
|
+
trovesuite/entities/__init__.py,sha256=Dbl_03Bueyh2vOP2hykd40MmNMrl5nNHSRGP-kqwwNo,160
|
|
13
|
+
trovesuite/entities/health.py,sha256=KaW7yxTQdymIPlnkJJkDqEebBXkD0a7A66i5GgNZLoE,2700
|
|
14
|
+
trovesuite/entities/sh_response.py,sha256=1_sw3PpVaDxWsNiBU0W9YLHZgTFxEj4JJBLBfSY63Ho,1579
|
|
15
|
+
trovesuite/notification/__init__.py,sha256=mjglzmlk29SREP6LfvBYGmCSc-K1SKKAEx_OJdJ2Vrs,394
|
|
16
|
+
trovesuite/notification/notification_base.py,sha256=6Xo0Gnnpg3RgN1_SRkAcH-K4l7DwNDZvn1gRm3oMWyk,320
|
|
17
|
+
trovesuite/notification/notification_controller.py,sha256=nG4owOk_skgnVW1HxjuoluWbfDjQCZKerQRyOE7P_ak,826
|
|
18
|
+
trovesuite/notification/notification_read_dto.py,sha256=K0DFLyAArvtqOGS7q1VzmqO28StTMbcNCgpmhzhad8E,423
|
|
19
|
+
trovesuite/notification/notification_service.py,sha256=sf_lJWcrmRIUeEabdEYLaSdRz2H1D3RBEwKMOA1h2pY,2433
|
|
20
|
+
trovesuite/notification/notification_write_dto.py,sha256=PGpww3PomrmJgXTgpwGhXasv_fC8mgUQvTloaTqaSTA,452
|
|
21
|
+
trovesuite/utils/__init__.py,sha256=3UPKTz9cluTgAM-ldNsJxsnoPTZiqacXlAmzUEHy6q8,143
|
|
22
|
+
trovesuite/utils/helper.py,sha256=lvZ1mvaqY84dkIPB5Ov0uwYDOWBziAS8twobEJZh2Ik,1002
|
|
23
|
+
trovesuite-1.0.6.dist-info/licenses/LICENSE,sha256=EJT35ct-Q794JYPdAQy3XNczQGKkU1HzToLeK1YVw2s,1070
|
|
24
|
+
trovesuite-1.0.6.dist-info/METADATA,sha256=3a3sW9xHPiXx2t7cipfcCfAHoNIWw69UT3n18HJ0FVg,21607
|
|
25
|
+
trovesuite-1.0.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
26
|
+
trovesuite-1.0.6.dist-info/top_level.txt,sha256=GzKhG_-MTaxeHrIgkGkBH_nof2vroGFBrjeHKWUIwNc,11
|
|
27
|
+
trovesuite-1.0.6.dist-info/RECORD,,
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
trovesuite/__init__.py,sha256=a9jSrjmrhOey6yE2I83TO_rVJDogIwGDyL3HJBGiGqM,347
|
|
2
|
-
trovesuite/auth/__init__.py,sha256=d8d5POjq9lGe7GVbc7Qm6hUpx1bgLqEVQFG1iYafdxI,337
|
|
3
|
-
trovesuite/auth/auth_base.py,sha256=rZHQVLeJRBQ8GClgF5UwG-er4_HXVX5-nt8o6_Z29uY,75
|
|
4
|
-
trovesuite/auth/auth_controller.py,sha256=mMAyTV_0rFeArpcIDu9Pr_IATvFZU6wfIo6ViQoUv0U,477
|
|
5
|
-
trovesuite/auth/auth_read_dto.py,sha256=pQT1ouRVZMAiJn4wAG7NQOKQKTquTMWUe-dYcpLTmEo,533
|
|
6
|
-
trovesuite/auth/auth_service.py,sha256=if2RFI6F1DpbNEuCTSpPbhHVBdYQEg4hVkoxTCnvC4k,14298
|
|
7
|
-
trovesuite/auth/auth_write_dto.py,sha256=rdwI7w6-9QZGv1H0PAGrjkLBCzaMHjgPIXeLb9RmNec,234
|
|
8
|
-
trovesuite/configs/__init__.py,sha256=h1mSZOaZ3kUy1ZMO_m9O9KklsxywM0RfMVZLh9h9WvQ,328
|
|
9
|
-
trovesuite/configs/database.py,sha256=TYPlwydfWirOvCdA1N2gdqJWeesnxLBmRcxqVInZzEA,8320
|
|
10
|
-
trovesuite/configs/logging.py,sha256=mGjR2d4urVNry9l5_aXycMMtcY2RAFIpEL35hw33KZg,9308
|
|
11
|
-
trovesuite/configs/settings.py,sha256=yUbkiFi4QdO9JZG1RRFbP4tYurT47HmN-ohgYcs2SHM,2561
|
|
12
|
-
trovesuite/entities/__init__.py,sha256=Dbl_03Bueyh2vOP2hykd40MmNMrl5nNHSRGP-kqwwNo,160
|
|
13
|
-
trovesuite/entities/health.py,sha256=H8-XUywzvMfZy2dZwDyJGAUbmuULuZYvYIUWhiaVGdY,2729
|
|
14
|
-
trovesuite/entities/sh_response.py,sha256=1_sw3PpVaDxWsNiBU0W9YLHZgTFxEj4JJBLBfSY63Ho,1579
|
|
15
|
-
trovesuite/utils/__init__.py,sha256=3UPKTz9cluTgAM-ldNsJxsnoPTZiqacXlAmzUEHy6q8,143
|
|
16
|
-
trovesuite/utils/helper.py,sha256=lvZ1mvaqY84dkIPB5Ov0uwYDOWBziAS8twobEJZh2Ik,1002
|
|
17
|
-
trovesuite-1.0.4.dist-info/licenses/LICENSE,sha256=EJT35ct-Q794JYPdAQy3XNczQGKkU1HzToLeK1YVw2s,1070
|
|
18
|
-
trovesuite-1.0.4.dist-info/METADATA,sha256=-HtCWfAoPzJCmZdj_YCKzy8DG17EKe4mCBZDleqG7aQ,16000
|
|
19
|
-
trovesuite-1.0.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
20
|
-
trovesuite-1.0.4.dist-info/top_level.txt,sha256=GzKhG_-MTaxeHrIgkGkBH_nof2vroGFBrjeHKWUIwNc,11
|
|
21
|
-
trovesuite-1.0.4.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|