{"id":26688165,"url":"https://github.com/juliusmarkwei/access-portal","last_synced_at":"2026-05-09T17:38:02.582Z","repository":{"id":281701051,"uuid":"784906935","full_name":"juliusmarkwei/access-portal","owner":"juliusmarkwei","description":"access key management tool for system administrators","archived":false,"fork":false,"pushed_at":"2025-03-10T17:13:17.000Z","size":1579,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-10T18:28:52.267Z","etag":null,"topics":["access-control","api","authentication","celery","python3","redis","security-tools"],"latest_commit_sha":null,"homepage":"https://wooden-brooke-julius-backup-1d188a12.koyeb.app/api/v1/","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/juliusmarkwei.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-04-10T19:52:19.000Z","updated_at":"2025-03-10T18:01:19.000Z","dependencies_parsed_at":"2025-03-10T18:29:23.958Z","dependency_job_id":"cdbc3b4b-25a7-4327-b13b-fcd89b7f7120","html_url":"https://github.com/juliusmarkwei/access-portal","commit_stats":null,"previous_names":["juliusmarkwei/access-portal"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/juliusmarkwei%2Faccess-portal","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/juliusmarkwei%2Faccess-portal/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/juliusmarkwei%2Faccess-portal/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/juliusmarkwei%2Faccess-portal/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/juliusmarkwei","download_url":"https://codeload.github.com/juliusmarkwei/access-portal/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245659047,"owners_count":20651526,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["access-control","api","authentication","celery","python3","redis","security-tools"],"created_at":"2025-03-26T13:17:56.513Z","updated_at":"2026-05-09T17:37:57.556Z","avatar_url":"https://github.com/juliusmarkwei.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Access Portal Backend build with \u003ca href=\"https://www.django-rest-framework.org/\" target=\"_blank\"\u003eDjango Rest Framework\u003c/a\u003e and \u003ca href=\"https://docs.celeryq.dev/en/stable/index.html\" target=\"_blank\"\u003e Celery\n\n\u003ca href=\"https://access-portal-api-44e9247ddee5.herokuapp.com/api/v1\" target=\"_blank\"\u003e\n    \u003cimg src=\"./assets/logo.jpg\" height=300px width=100% \u003e\n\u003c/a\u003e\n\n## Overview\n\nAccess Portal is an Access Key Manager web application developed for Micro-Focus Inc. to manage access keys for their multi-tenant school management platform. Schools can use this application to purchase access keys to activate their accounts. This project involves building a key manager that includes user authentication, key management, and integration capabilities.\n\n## Project Objective\n\nMicro-Focus Inc., a software company, has built a school management platform that is multi-tenant. Various schools can set up on the platform as if it was built specifically for them. They have chosen to use an access key-based approach for monetization rather than integrating payment features directly into the software. This project aims to develop a web application that schools can use to purchase and manage access keys to activate their accounts.\n\n## Major Features 🔑\n\n### School IT Personnel\n\n1. **`Signup \u0026 Login`**: School IT personnel is able to sign up and log in with an email and password. Account verification and a reset password feature to recover lost passwords is included.\n2. **`Access Key Management`**: Users is able to see a list of all access keys granted: active, expired, or revoked.\n3. **`Key Details`**: For each access key, users is able to see the status, date of procurement, and expiry date.\n4. **`Key Constraints`**: Users should not be able to obtain a new key if an active key is already assigned. Only one key can be active at a time.\n\n### Micro-Focus Admin\n\n1. **`Admin Login`**: Admins is able to log in with an email and password.\n2. **`Manual Key Revocation`**: Admins is able to manually revoke an access key.\n3. **`Key Overview`**: Admins is able to see all keys generated on the platform, including their status, date of procurement, and expiry date.\n4. **`Active Key LookUp Endpoint`**: Admins is able to access an endpoint that, given a school email, returns the status and details of the active key if any, or a 404 status if no active key is found. This allows integration with the school management software.\n\n## Additions (top-ups)\n\n1. School IT Personnel's key created must be activated by admin. Admins are `notified` via `email` if a key is created.\n2. When status of a key changes, School IT Personnels are `alerted` via `email` by a custome mail template.\n3. When creating a key, in addition to a `key-tag`, a user must input the `number of days` the key should be active which `starts at the time of activation` (procurement date).\n4. A School IT Personnel can `delete` a key while the status is still `inactive` and also can `not create` a key while the status is `inactive`.\n\n## System Credentials - Testing ⚙️\n\n**Admin**\n\n-   Email - `accessportalinfo@gmail.com`\n-   Password - `admin`\n\n**School IT Personnel(s)**\n\n-   Email - `julius.markwei@stu.ucc.edu.gh`\n-   Password - `guest@123`\n\n---\n\n-   Email - `tiktechgh@gmail.com`\n-   Password - `guest@123`\n\n---\n\n-   Email - `juliussingh23k@gmail.com`\n-   Password - `guest@123`\n\nThe project was inspired by the need for a robust and efficient way to manage access keys for a multi-tenant school management platform. Every aspect of this project required extensive research and careful planning to ensure seamless integration and functionality. The activities involved in this project are as follows:\n\n1. Database model (table) development and configurations\n2. Writing the various API views for all the neccessary methods of each view\n3. Admin panel management configurations.\n4. Adding all the neccesary URL endpoints to for all the various views and thier methods. Not forgetting the admin panel too.\n5. Writing tests for all the views and thier methods. I also used Postman for testing as well.\n6. Including a \u003ca href=\"https://access-portal-api-44e9247ddee5.herokuapp.com/api/v1\" target=\"_blank\"\u003edocumentation\u003c/a\u003e for the project API through a library called \u003ca href=\"https://drf-spectacular.readthedocs.io/en/latest/index.html\" target=\"_blank\"\u003edrf-spectacular\u003c/a\u003e by \u003ca href=\"https://www.openapis.org/\" target=\"_blank\"\u003eOpenAPI Initiative\u003c/a\u003e.\n7. Deployment of the REST API to \u003ca href=\"https://www.heroku.com/\" target=\"_blank\"\u003eheroku\u003c/a\u003e\n\n## Image of the Browsable API\n\n\u003ca href=\"https://access-portal-api-44e9247ddee5.herokuapp.com/api/v1\" target=\"_blank\" title=\"Visit live\"\u003e\n    \u003cimg src=\"./assets/image of api.png\" height=\"480px\" width=\"100%\" \u003e\n\u003c/a\u003e\n\n## Technologies utilized in developing the system\n\n1. \u003ca href=\"https://www.django-rest-framework.org/\" target=\"_blank\"\u003e**Django rest Framework**\u003c/a\u003e for handling API views, and routes.\n2. \u003ca href=\"https://docs.celeryq.dev/en/stable/index.html#\" target=\"_blank\"\u003e**Celery**\u003c/a\u003e was utilized for managing and executing asynchronous background tasks, ensuring that long-running processes do not block the main application.\n3. \u003ca href=\"https://docs.celeryq.dev/en/stable/userguide/periodic-tasks.html\" target=\"_blank\"\u003e**Celery Beat**\u003c/a\u003e was employed as a scheduler to automate the execution of periodic tasks, enabling tasks to run at defined intervals without manual intervention.\n4. \u003ca href=\"https://redis.io/\" target=\"_blank\"\u003e**Redis**\u003c/a\u003e as a message broker for Celery to manage and schedule background tasks.\n5. \u003ca href=\"https://www.postgresql.org/\" target=\"_blank\"\u003e**Postgres Database**\u003c/a\u003e as the primary database for storing application data securely and efficiently.\n6. \u003ca href=\"https://drf-spectacular.readthedocs.io/en/latest/index.html\" target=\"_blank\"\u003e**DRF Spectacular**\u003c/a\u003e for generating and maintaining OpenAPI documentation for the Django REST Framework API.\n\n## Frontend technoloies used\n\n1. \u003ca href=\"https://nextjs.org/\" target=\"_blank\"\u003e**Next.js**\u003c/a\u003e for building the frontend, providing server-side rendering and static site generation for a seamless user experience.\n2. \u003ca href=\"https://vercel.com/\" target=\"_blank\"\u003e**Vercel**\u003c/a\u003e was used host the frontend application, ensuring fast and reliable hosting with seamless integration for continuous deployment.\n\n## Images of the Frontend\n\n\u003ch3\u003e1. Admin View\u003c/h3\u003e\n\u003chr/\u003e\n\u003ca href=\"https://access-portal-client.vercel.app/admin/dashboard\" target=\"_blank\" title=\"Admin panel\"\u003e \n\u003cimg src=\".//assets/admin panel.png\" width=\"100%\" height=\"400px\"\u003e\u003c/img\u003e\n\u003c/a\u003e\n\u003cbr/\u003e\n\u003ch3\u003e2. School IT Personnel View\u003c/h3\u003e\n\u003chr/\u003e\n\u003ca href=\"https://access-portal-client.vercel.app/dashboard\" target=\"_blank\" title=\"School IT Personnel View\"\u003e \n\u003cimg src=\".//assets/school IT personnel page.png\" width=\"100%\" height=\"400px\"\u003e\u003c/img\u003e\n\u003c/a\u003e\n\u003cbr/\u003e\u003cbr/\u003e\n\n-   Frontend repository can be found \u003ca href=\"https://github.com/juliusmarkwei/access-portal-fe\" target=\"_blank\" title=\"frontend github repo\"\u003e \u003cstrong\u003e`here`\u003c/strong\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" height=\"12px\" width=\"30px\" fill=\"red\" viewBox=\"0 0 576 512\"\u003e\u003cpath d=\"M64 0C28.7 0 0 28.7 0 64V352c0 35.3 28.7 64 64 64H240l-10.7 32H160c-17.7 0-32 14.3-32 32s14.3 32 32 32H416c17.7 0 32-14.3 32-32s-14.3-32-32-32H346.7L336 416H512c35.3 0 64-28.7 64-64V64c0-35.3-28.7-64-64-64H64zM512 64V288H64V64H512z\"/\u003e\u003c/svg\u003e\u003c/a\u003e\n\n## Prerequisites\n\n```\n    python -\u003e 3.10\n    django -\u003e 5.0.4\n    djanforestframework -\u003e 3.15.1\n    celery -\u003e 5.4.0\n    redis -\u003e 5.0.4\n```\n\n## Installation\n\n1. #### Clone this repository\n\n```\n    git clone https://github.com/juliusmarkwei/access-portal.git\n    cd access-portal/\n```\n\n2. #### Install all the neccessary packages/dependencies\n\n```\n    pip install -r requirements.txt\n```\n\n3. #### Environment Variables\n\n-   Create a \u003cstrong\u003e`.env`\u003c/strong\u003e preferrably inside the root directory \u003cstrong\u003eaccess-portal/\u003c/strong\u003e. Inside the \u003cstrong\u003e.env\u003c/strong\u003e add a SECRET_KEY and your database configurations of the database of your choice. You can generate a \u003cstrong\u003e`SECRET_KEY`\u003c/strong\u003e using the following code snippet:\n\n```\n    from django.core.management.utils import get_random_secret_key\n    print(get_random_secret_key())\n```\n\n-   Check the complete list of the \u003cstrong\u003e`.env`\u003c/strong\u003e file content \u003ca href=\"https://textdoc.co/QYoKIEHRc0wF84MG\" target=\"_blank\"\u003ehere\u003c/a\u003e. It should look like the variables below:\n\n```\n    SECRET_KEY=your_secret_key_here\n    DB_HOST=your_db_host\n    DB_USER=your_db_user\n    DB_PASSWORD=your_db_password\n    DB_NAME=your_db_name\n    DB_PORT=your_db_port\n    DB_ENGINE=your_db_engine\n```\n\n4. In the root directory of the project, create a superuser to manage all the users of the application. be sure python is installed before you proceed with this stage.\n\n```\n    python3 manage createsuperuser\n```\n\n5. #### Run the program with the following command\n\n```\n    python3 manage runserver\n```\n\n6. #### Start the celery worker and celery beat\n\n```\n    celery -A core worker --loglevel=info\n    celery -A core beat --loglevel=info\n```\n\n-   Make sure your redis server is up and running before you run the comand above.\n\n## Get Involved\n\nI welcome contributions and participation from the community to help make this backend API even better! Whether you're looking to fix bugs, add new features, or improve documentation, your help is greatly appreciated. Here's how you can get involved:\n\n### Reporting Issues 🚩\n\nIf you encounter any bugs or issues, please report them using the \u003ca href=\"https://github.com/juliusmarkwei/access-portal/issues\"\u003e Issues\u003c/a\u003e section of my GitHub repository. When reporting issues, please include:\n\n-   A clear and descriptive title.\n-   A detailed description of the problem, including steps to reproduce it.\n-   Any relevant logs or error messages.\n    Your environment details (e.g., Django version, DRF version, database, etc.).\n\n### Contributing Code 💁🏼\n\nI love receiving pull requests from the community! If you have an improvement or a new feature you'd like to add, please feel free to do so 👍\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjuliusmarkwei%2Faccess-portal","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjuliusmarkwei%2Faccess-portal","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjuliusmarkwei%2Faccess-portal/lists"}