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.
@@ -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
+
@@ -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,5 @@
1
+ from sqlalchemy.orm import DeclarativeBase
2
+
3
+
4
+ class Model(DeclarativeBase):
5
+ pass
@@ -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"