{"id":19098542,"url":"https://github.com/ucfopen/due-date-changer","last_synced_at":"2025-04-30T15:26:19.320Z","repository":{"id":81722674,"uuid":"152259182","full_name":"ucfopen/due-date-changer","owner":"ucfopen","description":"An LTI that allows a user to easily change due dates for multiple assignments simultaneously.","archived":false,"fork":false,"pushed_at":"2023-05-01T21:14:12.000Z","size":148,"stargazers_count":9,"open_issues_count":9,"forks_count":3,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-04-19T04:42:18.235Z","etag":null,"topics":["a11y","accessibility","canvas","canvas-lms","edtech","education","instructure","lti"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ucfopen.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":".github/CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":"AUTHORS.md","dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2018-10-09T13:49:13.000Z","updated_at":"2023-03-02T16:38:18.000Z","dependencies_parsed_at":null,"dependency_job_id":"d519fa75-13c2-459d-9599-0d23fd52c1d5","html_url":"https://github.com/ucfopen/due-date-changer","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ucfopen%2Fdue-date-changer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ucfopen%2Fdue-date-changer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ucfopen%2Fdue-date-changer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ucfopen%2Fdue-date-changer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ucfopen","download_url":"https://codeload.github.com/ucfopen/due-date-changer/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251730636,"owners_count":21634423,"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":["a11y","accessibility","canvas","canvas-lms","edtech","education","instructure","lti"],"created_at":"2024-11-09T03:46:13.616Z","updated_at":"2025-04-30T15:26:19.308Z","avatar_url":"https://github.com/ucfopen.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Build Status](https://travis-ci.org/ucfopen/due-date-changer.svg?branch=master)](https://travis-ci.org/ucfopen/due-date-changer)\n[![Coverage Status](https://coveralls.io/repos/github/ucfopen/due-date-changer/badge.svg?branch=master)](https://coveralls.io/github/ucfopen/due-date-changer?branch=master)\n[![Join UCF Open Slack Discussions](https://badgen.net/badge/icon/ucfopen?icon=slack\u0026label=slack\u0026color=pink)](https://dl.ucf.edu/join-ucfopen)\n[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)\n\n# Due Date Changer\n\n[![Deploy](https://www.herokucdn.com/deploy/button.png)](https://heroku.com/deploy?template=https://github.com/ucfopen/due-date-changer/tree/heroku)\n\nAn LTI that allows a user to easily change due dates for multiple assignments simultaneously.\n\n## Table of Contents\n\n* [Installation](#installation)\n* [Development Server](#development-server)\n* [Production Server](#production-server)\n* [Contributing](#contributing)\n* [Contact Us](#contact-us)\n\n## Installation\n\nClone the repository\n\n```sh\n# clone via SSH\ngit clone git@github.com:ucfopen/due-date-changer.git\n```\n\n```sh\n# clone via HTTPS\ngit clone https://github.com/ucfopen/due-date-changer.git\n```\n\nSwitch into the new directory\n\n```sh\ncd due-date-changer\n```\n\nCreate the config file from the template\n\n```sh\ncp config.py.template config.py\n```\n\nFill in the config file\n\n```python\n# -*- coding: utf-8 -*-\n\nfrom __future__ import unicode_literals\n\nDEBUG = False\nSECRET_KEY = 'JbwLnLgsfxDInozQudc6IFPe0eYecW8f'\n\nALLOWED_CANVAS_DOMAINS = ['example.com', 'example.edu']\n\nCANVAS_URL = 'https://example.instructure.com'\nAPI_KEY = 'p@$$w0rd'\n\nPYLTI_CONFIG = {\n    'consumers': {\n        'consumer_key': {\n            'secret': b'shared_secret'\n        }\n    },\n    'roles': {\n        'staff': [\n            'urn:lti:instrole:ims/lis/Administrator',\n            'Instructor',\n            'ContentDeveloper',\n            'urn:lti:role:ims/lis/TeachingAssistant'\n        ]\n    }\n}\n\nTIME_ZONE = 'US/Eastern'\nLOCAL_TIME_FORMAT = '%m/%d/%Y %I:%M %p'\n\nLOG_FILE = 'due_date_changer.log'\nLOG_FORMAT = '%(asctime)s [%(levelname)s] {%(filename)s:%(lineno)d} %(message)s'\nLOG_LEVEL = 'DEBUG'\nLOG_MAX_BYTES = 1024 * 1024 * 5  # 5 MB\nLOG_BACKUP_COUNT = 1\n```\n\nCreate a virtual environment\n\n```sh\nvirtualenv -p python2.7 env\n```\n\nSource the environment\n\n```sh\nsource env/bin/activate\n```\n\nAlternatively, use the setup script\n\n```sh\nsource setup.sh\n```\n\nInstall required packages\n\n* If you want to be able to run tests:\n\n  ```sh\n  pip install -r test_requirements.txt\n  ```\n\n* Otherwise,\n\n  ```sh\n  pip install -r requirements.txt\n  ```\n\n## Development Server\n\nIf you haven't already, activate the virtual environment and set up Flask\nenvironment variables.\n\n```sh\nsource env/bin/activate\nexport FLASK_APP=lti.py\nexport FLASK_DEBUG=1\n```\n\nAlternatively, use the setup script\n\n```sh\nsource setup.sh\n```\n\nRun the Flask development server.\n\n```sh\nflask run --with-threads\n```\n\nCheck the status page at `/status` ([http://127.0.0.1:5000/status](http://127.0.0.1:5000/status) by default) to see if everything is\nworking properly.\n\n*Note: for the status page to work, the app must be run with threading enabled.*\n\n## Production Server\n\nDue Date Changer is tested to run NGINX and uWSGI, but can also work on Apache and mod_wsgi.\n\n### NGINX\n\n`nginx.conf`\n\nIn your nginx.conf file, place these lines under the server{} section with the appropriate changes\n\n```nginx\nlocation /due_date_changer/static {\n    alias /path/to/due_date_changer/static/;\n}\n\n\nlocation /due_date_changer {\n    root html;\n    include uwsgi_params;\n\n    uwsgi_param                  UWSGI_SCHEME https; # Set to https is behind load balancer, else http\n    uwsgi_param                  SCRIPT_NAME /due_date_changer;\n    uwsgi_modifier1              30;\n    uwsgi_pass                   127.0.0.1:9000;  #set to any number above 9000 that isn't in use.\n    uwsgi_read_timeout           300;\n    uwsgi_connect_timeout        300;\n    uwsgi_send_timeout           300;\n    proxy_redirect               off;\n    proxy_set_header             Host $host;\n    proxy_set_header             X-Real-IP $remote_addr;\n    proxy_set_header             X-Forwarded-For $proxy_add_x_forwarded_for;\n    proxy_set_header             X-Forwarded-Host example.com; #Add your domain here.\n}\n```\n\n### UWSGI\n\n`/etc/uwsgi/sites-enabled/due_date_changer.ini`\n\n```ini\n[uwsgi]\n# uwsgi process runs as user:group\nuid = nginx\ngid = nginx\n\n# Number of worker processes\nprocesses = 6\n\nchdir = /path/to/due_date_changer/\nvenv = /path/to/due_date_changer/env\n\n\nsocket = 127.0.0.1:9000 #Same Socket number as above\n\n# Respawn slow processes\nharakiri=60\nharakiri-verbose=True\n\nmaster=True\n\n# name of wsgi file in the chdir dir above without the .py extension\nwsgi-file = wsgi.py\n\n# Background the process (and allow it to log!)\ndaemonize = /var/log/uwsgi/app.log\n\n# Reload the uwsgi process if the wsgi file is touched\ntouch-reload = /path/to/due_date_changer/wsgi.py\n\n#testing saveSnapshot fix\nbuffer-size=16384\n#post-buffering=1\n\n#stats\nstats = /tmp/wsgi.py.socket\n```\n\n## Contact Us\n\nNeed help? Have an idea? Just want to say hi? Come join us on the [UCF Open Slack Channel](https://dl.ucf.edu/join-ucfopen) and join the `#due-date-changer` channel!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fucfopen%2Fdue-date-changer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fucfopen%2Fdue-date-changer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fucfopen%2Fdue-date-changer/lists"}