{ "info": { "author": "MAN Alpha Tech", "author_email": "ManAlphaTech@man.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "License :: OSI Approved :: GNU General Public License (GPL)", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7" ], "description": "# `feedback_tool` - Simple peer-to-peer feedback platform\n\n[![Build status](https://circleci.com/gh/manahl/feedback_tool.svg?style=svg)](https://circleci.com/gh/manahl/feedback_tool)\n\n`feedback_tool` is a platform for managing peer-to-peer feedback within an \norganisation.\n\n## Docker Quickstart\n\n1. Install [source-to-image](https://github.com/openshift/source-to-image#installation)\n\n2. Run the application on local Docker\n```\ncd frontend\ns2i build . centos/nodejs-8-centos7 feedback-tool-dev-frontend\ncd ..\ns2i build . centos/python-36-centos7 feedback-tool-app \ncd docker/dev\ndocker-compose up -d\n```\n\n3. Setup a dummy template, 3 question and period data to carry out a feedback cycle.\n```\ncd ../..\npython setup.py develop\npip install faker freezegun webtest mock \npython tests/scripts/configure_db.py --config host_example.ini add-test-periods\n```\n\n4. Once fully started, open http://localhost:4200. Refer to `docker/shared/ldif/01-data.ldif` \nfor credentials for dummy users. Use the following commands to change phases.\n\n```\npython tests/scripts/configure_db.py --config host_example.ini --subperiod enrollment adjust\npython tests/scripts/configure_db.py --config host_example.ini --subperiod entry adjust\npython tests/scripts/configure_db.py --config host_example.ini --subperiod approval adjust\npython tests/scripts/configure_db.py --config host_example.ini --subperiod review adjust\n```\n\n![Login screen](/docs/login.png?raw=true \"Login screen\")\n![Initial screen for user eforshaw](/docs/welcome.png?raw=true \"Initial screen for user eforshaw\")\n\n## Configuration values\n\n#### `feedback_tool.db_url`\nFollow http://docs.sqlalchemy.org/en/latest/core/engines.html#database-urls\n\n#### `feedback_tool.business_unit`\nDisplayed in the frontend beside the logo. Useful for multi-tenant setups \nwithin larger companies.\n\n#### `feedback_tool.displayed_hostname`\nIf set, this will override the use of `/etc/hostname` as the hostname \ndisplayed in emails to the set string.\n\n#### `feedback_tool.enable_send_email`\nIf set to `true`, it will cause emails to be sent. This happens:\n\n* When a talent manager uses the management panel to manually send them\n* Automatically according to the email schedule if \n `feedback_tool.run_email_interval_job` config value is set to `true`\n\n#### `feedback_tool.production_hostname` and `feedback_tool.production_user`\nIf these values match the what the application sees on the host, then\nthis will enable:\n\n* Loading of all user emails for the given business unit unless\n `feedback_tool.load_user_email_list` is set, which then will only\n load the subset of the user emails in the list.\n\n\n\n#### `feedback_tool.homebase_location`\nThe datetimes set in the Period table are technically not UTC. Those times \nare coupled with this configured value, the location. The phase shift will \noccur when a particular datetime is passed at this configured location.\n\nHere are the available choices:\n* London\n* New York\n* Oxford\n* Shanghai\n* Hong Kong\n* GBR\n* Boston\n* Pf\u00e4ffikon\n\n\n#### `feedback_tool.talent_manager_usernames`\nSet this to an array of strings containing the LDAP usernames\nof who you would like to be able to login with the talent manager role.\ne.g. [\"lcarty\", \"chasmith\"]\n\n#### `feedback_tool.reload_users_on_app_start`\nThis is normally set to `False` as we now rely on talent managers uploading \nthe user hierarchy configuration CSV into the application.\n\n#### `feedback_tool.load_user_email_list`\nIn non-prod environments, we don't save emails within the User database.\nIf this is set, we will save the emails of the following list of users\nidentified by their LDAP username, allowing them to be emailed\n(if emailing is turned on).\ne.g. [\"chasmith\"]\n\n#### `feedback_tool.allow_passwordless_access`\nA useful development flag for impersonation. This should be set to\n`false` in production.\n\n#### `feedback_tool.run_email_interval_job`\nIf `true`, run a job in the background that checks the email flags for\nthe current period and if not set, send out the relevant emails and set.\n\n\n#### `feedback_tool.display_name`\nNormally the company name, that will be displayed in the frontend.\n\n#### `feedback_tool.support_email`\nEmail that will be displayed to users when they are denied access to the tool \nor there is an unexpected error.\n\n#### `feedback_tool.reply_email`\nEmail that will be displayed to users that they receive from the automated \nnotification system (notifications sent by email).\n\n#### `feedback_tool.login_username_msg`\nHelp message for the login input to remind users what username to use.\n\n#### `feedback_tool.login_password_msg`\nHelp message for the login input to remind users what password to use.\n\n#### `feedback_tool.tm_upload_new_population_msg`\nHelp message for talent manager on how to populate the CSV that is to be \nuploaded.\n\n#### `feedback_tool.tm_generate_population_msg`\nHelp message for talent manager on how to generate the population CSV.\n\n#### `feedback_tool.ldap_uri`\nURI to LDAP instnace\n\n#### `feedback_tool.ldap_username_key`\nLDAP field name for what to bind to the `username` User model variable. \n\n#### `feedback_tool.ldap_user_bind_template`\nTemplate used to generate the bind DN for a user. Refer to the example config.\n\n#### `feedback_tool.ldap_manager_key`\nLDAP field name for what to bind to the `manager` User variable. \n\n#### `feedback_tool.ldap_location_key`\nLDAP field name for what to bind to the `location` User variable. \n\n#### `feedback_tool.ldap_uid_key`\nLDAP field name for what to bind to the `uid` User variable. \n\n#### `feedback_tool.ldap_department_key`\nLDAP field name for what to bind to the `department` User variable. \n\n#### `feedback_tool.ldap_business_unit_key`\nLDAP field name for what to bind to the `business_unit` User variable. \n\n#### `feedback_tool.ldap_search_bind_dn`\nBind DN which should have permissions to search for users.\n\n#### `feedback_tool.ldap_search_password`\nPassword for the search bind DN.\n\n#### `feedback_tool.ldap_base_dn`\nBase DN to perform the user search upon.\n\n#### `feedback_tool.ldap_dn_username_attribute`\nAttribute that the username is assigned to in a DN\n\n#### `feedback_tool.ldap_dn_username_regex`\nRegex for extraction of a username from a DN\n\n#### `feedback_tool.logo_filename`\nIf the file exists in the assets folder on the backend, serve this up to the frontend.\n\n## Design\nThis section will explain how the application is designed in terms of strucutures and processes, and some reasons why it is done this way.\n\n### Architecture\n![Architecture diagram](architecture.png)\n\nWe use:\n* Backend - Pyramid\n* Frontend - Angular\n* Database - Agnostic due to use of SQLAlchemy library\n\nThe choices of these were simply because this was a hard requirement to match the internal technology stack at inception of the project.\n\nThe backend is a just an API service that also serves the productionised HTML/CSS/JS Angular frontend plus other static assets such as images.\n\nRefer to below for why LDAP is only used for authentication and NOT authorization.\n\n#### Staff list generation process\n\nThe available users in the feedback tool are **statically generated and fixed until manually updated.** This is desired despite having active access to the LDAP server. The reason for this is that during a feedback cycle, we do not want to have users entering or leaving the feedback cycle unintentionally, which would happen if we used LDAP as a source of truth.\n\nOn top of this, the reporting structure in LDAP doesn't necessarily match the real world, and may change temporarily due to transient staff issues. Putting the power into the talent manager's hands makes dealing with such situations easier, without required developer intervention.\n\nTherefore, the process as is follows:\n\n![Staff list generation process](population.png)\n\nThe CSV lists the relationships between staff member, therefore marking who is a staff member and who is a \nmanager. This information is used for authorization.\n\n## Documentation\n\nGraph source are in the `*.dot*` files. To regenerate graph PNGs.\n\n1. Install graphviz\n2. Run\n ```plain\n dot -Tpng architecture.dot -o architecture.png\n dot -Tpng population.dot -o population.png\n ```", "description_content_type": "text/markdown", "docs_url": null, "download_url": "https://github.com/manahl/feedback_tool/archive/v1.0.0.tar.gz", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/manahl/feedback_tool", "keywords": "feedback", "license": "GPL 2.0", "maintainer": "", "maintainer_email": "", "name": "feedback-tool", "package_url": "https://pypi.org/project/feedback-tool/", "platform": "", "project_url": "https://pypi.org/project/feedback-tool/", "project_urls": { "Download": "https://github.com/manahl/feedback_tool/archive/v1.0.0.tar.gz", "Homepage": "https://github.com/manahl/feedback_tool" }, "release_url": "https://pypi.org/project/feedback-tool/1.0.0/", "requires_dist": null, "requires_python": "", "summary": "A platform for managing peer-to-peer feedback within an organisation.", "version": "1.0.0" }, "last_serial": 5911813, "releases": { "1.0.0": [ { "comment_text": "", "digests": { "md5": "71c8c200ad4979302e986e83d101fd99", "sha256": "827e4d2e960627c932240eed043f8c94653956d556f68e458cee7374b7c7f906" }, "downloads": -1, "filename": "feedback_tool-1.0.0.tar.gz", "has_sig": false, "md5_digest": "71c8c200ad4979302e986e83d101fd99", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 658200, "upload_time": "2019-10-01T11:48:22", "url": "https://files.pythonhosted.org/packages/5a/47/81c7e0ef071151907f50a6b6359b7592c58b2e2fd8a3847f8e49d0f55ba1/feedback_tool-1.0.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "71c8c200ad4979302e986e83d101fd99", "sha256": "827e4d2e960627c932240eed043f8c94653956d556f68e458cee7374b7c7f906" }, "downloads": -1, "filename": "feedback_tool-1.0.0.tar.gz", "has_sig": false, "md5_digest": "71c8c200ad4979302e986e83d101fd99", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 658200, "upload_time": "2019-10-01T11:48:22", "url": "https://files.pythonhosted.org/packages/5a/47/81c7e0ef071151907f50a6b6359b7592c58b2e2fd8a3847f8e49d0f55ba1/feedback_tool-1.0.0.tar.gz" } ] }