meetings 0.0.1__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.
- meetings-0.0.1/PKG-INFO +51 -0
- meetings-0.0.1/README.md +32 -0
- meetings-0.0.1/meetings/__init__.py +1 -0
- meetings-0.0.1/meetings/issue_tracker.py +47 -0
- meetings-0.0.1/meetings/models/__init__.py +16 -0
- meetings-0.0.1/meetings/models/base.py +5 -0
- meetings-0.0.1/meetings/models/issues.py +30 -0
- meetings-0.0.1/meetings/models/projects.py +26 -0
- meetings-0.0.1/meetings/models/standup_notes.py +28 -0
- meetings-0.0.1/meetings/models/statuses.py +14 -0
- meetings-0.0.1/meetings/models/users.py +28 -0
- meetings-0.0.1/meetings/schemas/__init__.py +0 -0
- meetings-0.0.1/pyproject.toml +22 -0
meetings-0.0.1/PKG-INFO
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: meetings
|
|
3
|
+
Version: 0.0.1
|
|
4
|
+
Summary:
|
|
5
|
+
License-Expression: MIT
|
|
6
|
+
Author: joegasewicz
|
|
7
|
+
Author-email: joegasewicz@gmail.com
|
|
8
|
+
Requires-Python: >=3.13
|
|
9
|
+
Classifier: Programming Language :: Python :: 3
|
|
10
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
11
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
12
|
+
Requires-Dist: alembic (>=1.19.2,<2.0.0)
|
|
13
|
+
Requires-Dist: marshmallow (>=4.3.1,<5.0.0)
|
|
14
|
+
Requires-Dist: sqlalchemy (>=2.0.52,<3.0.0)
|
|
15
|
+
Requires-Dist: tornado (>=6.5.8,<7.0.0)
|
|
16
|
+
Requires-Dist: wxpython (>=4.3.1,<5.0.0)
|
|
17
|
+
Description-Content-Type: text/markdown
|
|
18
|
+
|
|
19
|
+
# Issue Tracker
|
|
20
|
+
Track & audit issues (including JIRA) that you are working/worked on.
|
|
21
|
+
|
|
22
|
+
### Install
|
|
23
|
+
```
|
|
24
|
+
TODO...
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### Launching
|
|
28
|
+
Issue Tracker provides a desktop GUI or a web server to run locally.
|
|
29
|
+
|
|
30
|
+
#### Launch the GUI
|
|
31
|
+
```
|
|
32
|
+
export ISSUE_TRACKER_GUI=1 && python cmd.py
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
#### Launch Web Server
|
|
36
|
+
```
|
|
37
|
+
export ISSUE_TRACKER_WEB=1 && python cmd.py
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### Contributing
|
|
41
|
+
For new features, please open up an issue to pitch your idea, do not push any PRs up until the author
|
|
42
|
+
has agreed that your feature is valid.
|
|
43
|
+
If you wish to work on any existing issues, please leave a comment on the issue, stating how you will
|
|
44
|
+
approach the issue before pushing up any code – this is to make sure that agents are not directly
|
|
45
|
+
contributing to this repo.
|
|
46
|
+
|
|
47
|
+
### AGENTS
|
|
48
|
+
No agents were or are used to create the source code of this project.
|
|
49
|
+
Agents must not generate any source code for this project, rather, give hints to the
|
|
50
|
+
developer on how to solve an issue or create a feature.
|
|
51
|
+
|
meetings-0.0.1/README.md
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Issue Tracker
|
|
2
|
+
Track & audit issues (including JIRA) that you are working/worked on.
|
|
3
|
+
|
|
4
|
+
### Install
|
|
5
|
+
```
|
|
6
|
+
TODO...
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
### Launching
|
|
10
|
+
Issue Tracker provides a desktop GUI or a web server to run locally.
|
|
11
|
+
|
|
12
|
+
#### Launch the GUI
|
|
13
|
+
```
|
|
14
|
+
export ISSUE_TRACKER_GUI=1 && python cmd.py
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
#### Launch Web Server
|
|
18
|
+
```
|
|
19
|
+
export ISSUE_TRACKER_WEB=1 && python cmd.py
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### Contributing
|
|
23
|
+
For new features, please open up an issue to pitch your idea, do not push any PRs up until the author
|
|
24
|
+
has agreed that your feature is valid.
|
|
25
|
+
If you wish to work on any existing issues, please leave a comment on the issue, stating how you will
|
|
26
|
+
approach the issue before pushing up any code – this is to make sure that agents are not directly
|
|
27
|
+
contributing to this repo.
|
|
28
|
+
|
|
29
|
+
### AGENTS
|
|
30
|
+
No agents were or are used to create the source code of this project.
|
|
31
|
+
Agents must not generate any source code for this project, rather, give hints to the
|
|
32
|
+
developer on how to solve an issue or create a feature.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from issue_tracker.issue_tracker import IssueTracker
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
from sqlalchemy.orm import sessionmaker
|
|
2
|
+
from sqlalchemy.orm import Session
|
|
3
|
+
|
|
4
|
+
from config import Config
|
|
5
|
+
from utils.database import Database
|
|
6
|
+
|
|
7
|
+
from utils.logger import log
|
|
8
|
+
from issue_tracker.models import (
|
|
9
|
+
Model,
|
|
10
|
+
tables,
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class IssueTracker:
|
|
15
|
+
|
|
16
|
+
# If a user has a paid subscription, then use remote Postgres
|
|
17
|
+
has_subscription: bool
|
|
18
|
+
db_type: str = "sqlite"
|
|
19
|
+
database: Database
|
|
20
|
+
db_session_factory: sessionmaker[Session]
|
|
21
|
+
|
|
22
|
+
def __init__(self, *, config: Config):
|
|
23
|
+
self.config = config
|
|
24
|
+
self.has_subscription = self._user_has_subscription()
|
|
25
|
+
if self.has_subscription:
|
|
26
|
+
"""TODO use remote Postgres here..."""
|
|
27
|
+
else:
|
|
28
|
+
self.database = Database(config=config)
|
|
29
|
+
conn_str = self.database.get_db_conn()
|
|
30
|
+
engine = self.database.get_engine(conn_str=conn_str)
|
|
31
|
+
self.db_session_factory = sessionmaker(
|
|
32
|
+
bind=engine,
|
|
33
|
+
autoflush=False,
|
|
34
|
+
autocommit=False,
|
|
35
|
+
)
|
|
36
|
+
Model.metadata.create_all(engine, tables=tables)
|
|
37
|
+
log.info("Creating local tables")
|
|
38
|
+
for table in Model.metadata.sorted_tables:
|
|
39
|
+
log.info(f"\t- {table}")
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def _user_has_subscription(self) -> bool:
|
|
43
|
+
"""
|
|
44
|
+
The MVP only uses a local sqlite db.
|
|
45
|
+
:return:
|
|
46
|
+
"""
|
|
47
|
+
return False
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
from issue_tracker.models.base import Model
|
|
2
|
+
from issue_tracker.models.users import UserModel
|
|
3
|
+
from issue_tracker.models.projects import ProjectModel
|
|
4
|
+
from issue_tracker.models.statuses import StatusModel
|
|
5
|
+
from issue_tracker.models.issues import IssueModel
|
|
6
|
+
from issue_tracker.models.standup_notes import StandupNoteModel
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
tables = [
|
|
11
|
+
UserModel.__table__,
|
|
12
|
+
ProjectModel.__table__,
|
|
13
|
+
StatusModel.__table__,
|
|
14
|
+
IssueModel.__table__,
|
|
15
|
+
StandupNoteModel.__table__
|
|
16
|
+
]
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
from datetime import datetime
|
|
2
|
+
|
|
3
|
+
from sqlalchemy import String, DateTime, ForeignKey, func, TEXT
|
|
4
|
+
from sqlalchemy.orm import Mapped, mapped_column
|
|
5
|
+
|
|
6
|
+
from issue_tracker.models import Model
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class IssueModel(Model):
|
|
10
|
+
|
|
11
|
+
__tablename__ = "issues"
|
|
12
|
+
|
|
13
|
+
id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
|
|
14
|
+
name: Mapped[str] = mapped_column(String(120), unique=True, nullable=False)
|
|
15
|
+
notes: Mapped[str] = mapped_column(TEXT, nullable=True)
|
|
16
|
+
deadline: Mapped[datetime] = mapped_column(DateTime(timezone=True))
|
|
17
|
+
|
|
18
|
+
created_date: Mapped[datetime] = mapped_column(
|
|
19
|
+
DateTime(timezone=True),
|
|
20
|
+
server_default=func.now(),
|
|
21
|
+
)
|
|
22
|
+
updated_date: Mapped[datetime] = mapped_column(
|
|
23
|
+
DateTime(timezone=True),
|
|
24
|
+
server_default=func.now(),
|
|
25
|
+
onupdate=func.now(),
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
user_id: Mapped[int] = mapped_column(ForeignKey("users.id"), nullable=False)
|
|
29
|
+
project_id: Mapped[int] = mapped_column(ForeignKey("projects.id"), nullable=False)
|
|
30
|
+
standup_note_id: Mapped[int] = mapped_column(ForeignKey("standup_notes.id"))
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
from datetime import datetime
|
|
2
|
+
|
|
3
|
+
from sqlalchemy import String, DateTime, ForeignKey, func, TEXT
|
|
4
|
+
from sqlalchemy.orm import Mapped, mapped_column
|
|
5
|
+
|
|
6
|
+
from issue_tracker.models import Model
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class ProjectModel(Model):
|
|
10
|
+
|
|
11
|
+
__tablename__ = "projects"
|
|
12
|
+
|
|
13
|
+
id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
|
|
14
|
+
name: Mapped[str] = mapped_column(String(120), nullable=False)
|
|
15
|
+
|
|
16
|
+
created_date: Mapped[datetime] = mapped_column(
|
|
17
|
+
DateTime(timezone=True),
|
|
18
|
+
server_default=func.now(),
|
|
19
|
+
)
|
|
20
|
+
updated_date: Mapped[datetime] = mapped_column(
|
|
21
|
+
DateTime(timezone=True),
|
|
22
|
+
server_default=func.now(),
|
|
23
|
+
onupdate=func.now(),
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
user_id: Mapped[int] = mapped_column(ForeignKey("users.id"), nullable=False)
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
from datetime import datetime
|
|
2
|
+
|
|
3
|
+
from sqlalchemy import String, DateTime, ForeignKey, func, TEXT
|
|
4
|
+
from sqlalchemy.orm import Mapped, mapped_column
|
|
5
|
+
|
|
6
|
+
from issue_tracker.models import Model
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class StandupNoteModel(Model):
|
|
10
|
+
|
|
11
|
+
__tablename__ = "standup_notes"
|
|
12
|
+
|
|
13
|
+
id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
|
|
14
|
+
note: Mapped[str] = mapped_column(TEXT, nullable=False)
|
|
15
|
+
standup_date: Mapped[datetime] = mapped_column(DateTime(timezone=True))
|
|
16
|
+
|
|
17
|
+
created_date: Mapped[datetime] = mapped_column(
|
|
18
|
+
DateTime(timezone=True),
|
|
19
|
+
server_default=func.now(),
|
|
20
|
+
)
|
|
21
|
+
updated_date: Mapped[datetime] = mapped_column(
|
|
22
|
+
DateTime(timezone=True),
|
|
23
|
+
server_default=func.now(),
|
|
24
|
+
onupdate=func.now(),
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
user_id: Mapped[int] = mapped_column(ForeignKey("users.id"), nullable=False)
|
|
28
|
+
project_id: Mapped[int] = mapped_column(ForeignKey("projects.id"), nullable=False)
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
from datetime import datetime
|
|
2
|
+
|
|
3
|
+
from sqlalchemy import String, DateTime, ForeignKey, func, TEXT
|
|
4
|
+
from sqlalchemy.orm import Mapped, mapped_column
|
|
5
|
+
|
|
6
|
+
from issue_tracker.models import Model
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class StatusModel(Model):
|
|
10
|
+
|
|
11
|
+
__tablename__ = "statuses"
|
|
12
|
+
|
|
13
|
+
id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
|
|
14
|
+
name: Mapped[str] = mapped_column(String(30), nullable=False)
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
from datetime import datetime
|
|
2
|
+
|
|
3
|
+
from sqlalchemy import String, DateTime, ForeignKey, func, TEXT
|
|
4
|
+
from sqlalchemy.orm import Mapped, mapped_column
|
|
5
|
+
|
|
6
|
+
from issue_tracker.models import Model
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class UserModel(Model):
|
|
10
|
+
|
|
11
|
+
__tablename__ = "users"
|
|
12
|
+
|
|
13
|
+
id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
|
|
14
|
+
email: Mapped[str] = mapped_column(String(120), unique=True, nullable=True)
|
|
15
|
+
password: Mapped[str] = mapped_column(String(120), nullable=True)
|
|
16
|
+
full_name: Mapped[str] = mapped_column(String(30), unique=True, nullable=False)
|
|
17
|
+
|
|
18
|
+
created_date: Mapped[datetime] = mapped_column(
|
|
19
|
+
DateTime(timezone=True),
|
|
20
|
+
server_default=func.now(),
|
|
21
|
+
)
|
|
22
|
+
updated_date: Mapped[datetime] = mapped_column(
|
|
23
|
+
DateTime(timezone=True),
|
|
24
|
+
server_default=func.now(),
|
|
25
|
+
onupdate=func.now(),
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
status_id: Mapped[int] = mapped_column(ForeignKey("statuses.id"), index=True)
|
|
File without changes
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "meetings"
|
|
3
|
+
version = "0.0.1"
|
|
4
|
+
description = ""
|
|
5
|
+
authors = [
|
|
6
|
+
{name = "joegasewicz",email = "joegasewicz@gmail.com"}
|
|
7
|
+
]
|
|
8
|
+
license = "MIT"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.13"
|
|
11
|
+
dependencies = [
|
|
12
|
+
"wxpython (>=4.3.1,<5.0.0)",
|
|
13
|
+
"tornado (>=6.5.8,<7.0.0)",
|
|
14
|
+
"marshmallow (>=4.3.1,<5.0.0)",
|
|
15
|
+
"sqlalchemy (>=2.0.52,<3.0.0)",
|
|
16
|
+
"alembic (>=1.19.2,<2.0.0)"
|
|
17
|
+
]
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
[build-system]
|
|
21
|
+
requires = ["poetry-core>=2.0.0,<3.0.0"]
|
|
22
|
+
build-backend = "poetry.core.masonry.api"
|