diff --git a/Pipfile b/Pipfile new file mode 100644 index 000000000..a149c08a5 --- /dev/null +++ b/Pipfile @@ -0,0 +1,47 @@ +[[source]] +name = "pypi" +url = "https://pypi.org/simple" +verify_ssl = true + +[dev-packages] +pylint = "*" +black = "*" +isort = "*" + +[packages] +celery = "==4.3.0" +django-simple-pagination = "==1.3" +django-compressor = "==2.3" +sorl-thumbnail = "==12.5.0" +django-phonenumber-field = "==2.2.0" +phonenumbers = "==8.10.4" +django-storages = "==1.7" +psycopg2-binary = "==2.8.3" +arrow = "==0.14.5" +requests = "==2.22.0" +boto3 = "==1.9.212" +lxml = "==4.4.1" +cssselect = "==1.1.0" +xlrd = "==1.2.0" +xlwt = "==1.3.0" +openpyxl = "==2.6.3" +pdfkit = "==0.6.1" +redis = "==3.3.8" +coverage = "==4.5.4" +raven = "==6.10.0" +pytest = "==5.1.1" +pytest-django = "==3.5.1" +codacy-coverage = "==1.3.11" +django-haystack = "==2.8.0" +elasticsearch = "==2.3" +python-memcached = "==1.59" +boto = "==2.49.0" +Django = "==2.2.10" +django-settings-export = "==1.2.1" +tblib = "*" + +[requires] +python_version = "3.6" + +[pipenv] +allow_prereleases = true diff --git a/Pipfile.lock b/Pipfile.lock new file mode 100644 index 000000000..0dcf095e3 --- /dev/null +++ b/Pipfile.lock @@ -0,0 +1,741 @@ +{ + "_meta": { + "hash": { + "sha256": "3e52c0805e70467c8f163cdb354b94d095951ef69904b0b189396629079be11c" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.6" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "amqp": { + "hashes": [ + "sha256:6e649ca13a7df3faacdc8bbb280aa9a6602d22fd9d545336077e573a1f4ff3b8", + "sha256:77f1aef9410698d20eaeac5b73a87817365f457a507d82edf292e12cbb83b08d" + ], + "version": "==2.5.2" + }, + "arrow": { + "hashes": [ + "sha256:0186026cfd94ca4fb773f30cc5398289a3027480d335e0e5c0d2772643763137", + "sha256:a12de0124d812d15061ed36c7eb4a421fa1b95026a502a0b2062e9ea00fc4446" + ], + "index": "pypi", + "version": "==0.14.5" + }, + "atomicwrites": { + "hashes": [ + "sha256:03472c30eb2c5d1ba9227e4c2ca66ab8287fbfbbda3888aa93dc2e28fc6811b4", + "sha256:75a9445bac02d8d058d5e1fe689654ba5a6556a1dfd8ce6ec55a0ed79866cfa6" + ], + "version": "==1.3.0" + }, + "attrs": { + "hashes": [ + "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c", + "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72" + ], + "version": "==19.3.0" + }, + "babel": { + "hashes": [ + "sha256:1aac2ae2d0d8ea368fa90906567f5c08463d98ade155c0c4bfedd6a0f7160e38", + "sha256:d670ea0b10f8b723672d3a6abeb87b565b244da220d76b4dba1b66269ec152d4" + ], + "version": "==2.8.0" + }, + "billiard": { + "hashes": [ + "sha256:bff575450859a6e0fbc2f9877d9b715b0bbc07c3565bb7ed2280526a0cdf5ede", + "sha256:d91725ce6425f33a97dfa72fb6bfef0e47d4652acd98a032bd1a7fbf06d5fa6a" + ], + "version": "==3.6.3.0" + }, + "boto": { + "hashes": [ + "sha256:147758d41ae7240dc989f0039f27da8ca0d53734be0eb869ef16e3adcfa462e8", + "sha256:ea0d3b40a2d852767be77ca343b58a9e3a4b00d9db440efb8da74b4e58025e5a" + ], + "index": "pypi", + "version": "==2.49.0" + }, + "boto3": { + "hashes": [ + "sha256:1a228661611cb99c3c54f5bdbdc29d9d7ef5341676a644d2508eeeff7b8b2fe3", + "sha256:c25d1089676213bda140c5b6faacd008b93203d27f1707cf0efc827d46cd719d" + ], + "index": "pypi", + "version": "==1.9.212" + }, + "botocore": { + "hashes": [ + "sha256:3baf129118575602ada9926f5166d82d02273c250d0feb313fc270944b27c48b", + "sha256:dc080aed4f9b220a9e916ca29ca97a9d37e8e1d296fe89cbaeef929bf0c8066b" + ], + "version": "==1.12.253" + }, + "celery": { + "hashes": [ + "sha256:4c4532aa683f170f40bd76f928b70bc06ff171a959e06e71bf35f2f9d6031ef9", + "sha256:528e56767ae7e43a16cfef24ee1062491f5754368d38fcfffa861cdb9ef219be" + ], + "index": "pypi", + "version": "==4.3.0" + }, + "certifi": { + "hashes": [ + "sha256:1d987a998c75633c40847cc966fcf5904906c920a7f17ef374f5aa4282abd304", + "sha256:51fcb31174be6e6664c5f69e3e1691a2d72a1a12e90f872cbdb1567eb47b6519" + ], + "version": "==2020.4.5.1" + }, + "chardet": { + "hashes": [ + "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", + "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" + ], + "version": "==3.0.4" + }, + "codacy-coverage": { + "hashes": [ + "sha256:b94651934745c638a980ad8d67494077e60f71e19e29aad1c275b66e0a070cbc", + "sha256:d8a1ce56b0dd156d6b1de14fa6217d32ec86097902f08a17ff2f95ba27264474" + ], + "index": "pypi", + "version": "==1.3.11" + }, + "coverage": { + "hashes": [ + "sha256:08907593569fe59baca0bf152c43f3863201efb6113ecb38ce7e97ce339805a6", + "sha256:0be0f1ed45fc0c185cfd4ecc19a1d6532d72f86a2bac9de7e24541febad72650", + "sha256:141f08ed3c4b1847015e2cd62ec06d35e67a3ac185c26f7635f4406b90afa9c5", + "sha256:19e4df788a0581238e9390c85a7a09af39c7b539b29f25c89209e6c3e371270d", + "sha256:23cc09ed395b03424d1ae30dcc292615c1372bfba7141eb85e11e50efaa6b351", + "sha256:245388cda02af78276b479f299bbf3783ef0a6a6273037d7c60dc73b8d8d7755", + "sha256:331cb5115673a20fb131dadd22f5bcaf7677ef758741312bee4937d71a14b2ef", + "sha256:386e2e4090f0bc5df274e720105c342263423e77ee8826002dcffe0c9533dbca", + "sha256:3a794ce50daee01c74a494919d5ebdc23d58873747fa0e288318728533a3e1ca", + "sha256:60851187677b24c6085248f0a0b9b98d49cba7ecc7ec60ba6b9d2e5574ac1ee9", + "sha256:63a9a5fc43b58735f65ed63d2cf43508f462dc49857da70b8980ad78d41d52fc", + "sha256:6b62544bb68106e3f00b21c8930e83e584fdca005d4fffd29bb39fb3ffa03cb5", + "sha256:6ba744056423ef8d450cf627289166da65903885272055fb4b5e113137cfa14f", + "sha256:7494b0b0274c5072bddbfd5b4a6c6f18fbbe1ab1d22a41e99cd2d00c8f96ecfe", + "sha256:826f32b9547c8091679ff292a82aca9c7b9650f9fda3e2ca6bf2ac905b7ce888", + "sha256:93715dffbcd0678057f947f496484e906bf9509f5c1c38fc9ba3922893cda5f5", + "sha256:9a334d6c83dfeadae576b4d633a71620d40d1c379129d587faa42ee3e2a85cce", + "sha256:af7ed8a8aa6957aac47b4268631fa1df984643f07ef00acd374e456364b373f5", + "sha256:bf0a7aed7f5521c7ca67febd57db473af4762b9622254291fbcbb8cd0ba5e33e", + "sha256:bf1ef9eb901113a9805287e090452c05547578eaab1b62e4ad456fcc049a9b7e", + "sha256:c0afd27bc0e307a1ffc04ca5ec010a290e49e3afbe841c5cafc5c5a80ecd81c9", + "sha256:dd579709a87092c6dbee09d1b7cfa81831040705ffa12a1b248935274aee0437", + "sha256:df6712284b2e44a065097846488f66840445eb987eb81b3cc6e4149e7b6982e1", + "sha256:e07d9f1a23e9e93ab5c62902833bf3e4b1f65502927379148b6622686223125c", + "sha256:e2ede7c1d45e65e209d6093b762e98e8318ddeff95317d07a27a2140b80cfd24", + "sha256:e4ef9c164eb55123c62411f5936b5c2e521b12356037b6e1c2617cef45523d47", + "sha256:eca2b7343524e7ba246cab8ff00cab47a2d6d54ada3b02772e908a45675722e2", + "sha256:eee64c616adeff7db37cc37da4180a3a5b6177f5c46b187894e633f088fb5b28", + "sha256:ef824cad1f980d27f26166f86856efe11eff9912c4fed97d3804820d43fa550c", + "sha256:efc89291bd5a08855829a3c522df16d856455297cf35ae827a37edac45f466a7", + "sha256:fa964bae817babece5aa2e8c1af841bebb6d0b9add8e637548809d040443fee0", + "sha256:ff37757e068ae606659c28c3bd0d923f9d29a85de79bf25b2b34b148473b5025" + ], + "index": "pypi", + "version": "==4.5.4" + }, + "cssselect": { + "hashes": [ + "sha256:f612ee47b749c877ebae5bb77035d8f4202c6ad0f0fc1271b3c18ad6c4468ecf", + "sha256:f95f8dedd925fd8f54edb3d2dfb44c190d9d18512377d3c1e2388d16126879bc" + ], + "index": "pypi", + "version": "==1.1.0" + }, + "django": { + "hashes": [ + "sha256:1226168be1b1c7efd0e66ee79b0e0b58b2caa7ed87717909cd8a57bb13a7079a", + "sha256:9a4635813e2d498a3c01b10c701fe4a515d76dd290aaa792ccb65ca4ccb6b038" + ], + "index": "pypi", + "version": "==2.2.10" + }, + "django-appconf": { + "hashes": [ + "sha256:1b1d0e1069c843ebe8ae5aa48ec52403b1440402b320c3e3a206a0907e97bb06", + "sha256:be58deb54a43d77d2e1621fe59f787681376d3cd0b8bd8e4758ef6c3a6453380" + ], + "version": "==1.0.4" + }, + "django-compressor": { + "hashes": [ + "sha256:47c86347f75c64954a06afbbfc820a750619e10c23a49272b865020a407b7edd", + "sha256:da9ee5ce4fc8b9211dcecd2229520514a4ba9ac3bcdc59b48092ec4d7f6b96b0" + ], + "index": "pypi", + "version": "==2.3" + }, + "django-haystack": { + "hashes": [ + "sha256:579cd2080f7ad508e909a46c027078e278aeebd133973c1c4efcf0dc57d85c10", + "sha256:5951a2f4059ee6d3f142186ea63cab65b28d7a758c969506a564553e479ceab4" + ], + "index": "pypi", + "version": "==2.8.0" + }, + "django-phonenumber-field": { + "hashes": [ + "sha256:2ae79857113b500f733885b2ebacf8d6fbf21970f2416bd4a3160ec9b91ce831" + ], + "index": "pypi", + "version": "==2.2.0" + }, + "django-settings-export": { + "hashes": [ + "sha256:fceeae49fc597f654c1217415d8e049fc81c930b7154f5d8f28c432db738ff79" + ], + "index": "pypi", + "version": "==1.2.1" + }, + "django-simple-pagination": { + "hashes": [ + "sha256:a12ff1f159c9481030b29dbb996eda44c2a7338c317043feea5b28df122e7c6f" + ], + "index": "pypi", + "version": "==1.3" + }, + "django-storages": { + "hashes": [ + "sha256:9e0f3423cdf8fabe74c174380de6cd65b9343b5c83c08f35ace57213f17fb083", + "sha256:e021ae94c0ca39c683260fa0065cae0df041d795dd79fee8f7bf4ba31798640d" + ], + "index": "pypi", + "version": "==1.7" + }, + "docutils": { + "hashes": [ + "sha256:6c4f696463b79f1fb8ba0c594b63840ebd41f059e92b31957c46b74a4599b6d0", + "sha256:9e4d7ecfc600058e07ba661411a2b7de2fd0fafa17d1a7f7361cd47b1175c827", + "sha256:a2aeea129088da402665e92e0b25b04b073c04b2dce4ab65caaa38b7ce2e1a99" + ], + "version": "==0.15.2" + }, + "elasticsearch": { + "hashes": [ + "sha256:6f184507c151bf8b093b86c0b7cd576a1d730acee03e8213cae367f196ad4c5c", + "sha256:be3080a2bf32dff0a9f9fcc1c087515a25a357645673a976d25ef77166134d81" + ], + "index": "pypi", + "version": "==2.3" + }, + "et-xmlfile": { + "hashes": [ + "sha256:614d9722d572f6246302c4491846d2c393c199cfa4edc9af593437691683335b" + ], + "version": "==1.0.1" + }, + "idna": { + "hashes": [ + "sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407", + "sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c" + ], + "version": "==2.8" + }, + "importlib-metadata": { + "hashes": [ + "sha256:2a688cbaa90e0cc587f1df48bdc97a6eadccdcd9c35fb3f976a09e3b5016d90f", + "sha256:34513a8a0c4962bc66d35b359558fd8a5e10cd472d37aec5f66858addef32c1e" + ], + "markers": "python_version < '3.8'", + "version": "==1.6.0" + }, + "jdcal": { + "hashes": [ + "sha256:1abf1305fce18b4e8aa248cf8fe0c56ce2032392bc64bbd61b5dff2a19ec8bba", + "sha256:472872e096eb8df219c23f2689fc336668bdb43d194094b5cc1707e1640acfc8" + ], + "version": "==1.4.1" + }, + "jmespath": { + "hashes": [ + "sha256:695cb76fa78a10663425d5b73ddc5714eb711157e52704d69be03b1a02ba4fec", + "sha256:cca55c8d153173e21baa59983015ad0daf603f9cb799904ff057bfb8ff8dc2d9" + ], + "version": "==0.9.5" + }, + "kombu": { + "hashes": [ + "sha256:2d1cda774126a044d91a7ff5fa6d09edf99f46924ab332a810760fe6740e9b76", + "sha256:598e7e749d6ab54f646b74b2d2df67755dee13894f73ab02a2a9feb8870c7cb2" + ], + "version": "==4.6.8" + }, + "lxml": { + "hashes": [ + "sha256:02ca7bf899da57084041bb0f6095333e4d239948ad3169443f454add9f4e9cb4", + "sha256:096b82c5e0ea27ce9138bcbb205313343ee66a6e132f25c5ed67e2c8d960a1bc", + "sha256:0a920ff98cf1aac310470c644bc23b326402d3ef667ddafecb024e1713d485f1", + "sha256:1409b14bf83a7d729f92e2a7fbfe7ec929d4883ca071b06e95c539ceedb6497c", + "sha256:17cae1730a782858a6e2758fd20dd0ef7567916c47757b694a06ffafdec20046", + "sha256:17e3950add54c882e032527795c625929613adbd2ce5162b94667334458b5a36", + "sha256:1f4f214337f6ee5825bf90a65d04d70aab05526c08191ab888cb5149501923c5", + "sha256:2e8f77db25b0a96af679e64ff9bf9dddb27d379c9900c3272f3041c4d1327c9d", + "sha256:4dffd405390a45ecb95ab5ab1c1b847553c18b0ef8ed01e10c1c8b1a76452916", + "sha256:6b899931a5648862c7b88c795eddff7588fb585e81cecce20f8d9da16eff96e0", + "sha256:726c17f3e0d7a7200718c9a890ccfeab391c9133e363a577a44717c85c71db27", + "sha256:760c12276fee05c36f95f8040180abc7fbebb9e5011447a97cdc289b5d6ab6fc", + "sha256:796685d3969815a633827c818863ee199440696b0961e200b011d79b9394bbe7", + "sha256:891fe897b49abb7db470c55664b198b1095e4943b9f82b7dcab317a19116cd38", + "sha256:9277562f175d2334744ad297568677056861070399cec56ff06abbe2564d1232", + "sha256:a471628e20f03dcdfde00770eeaf9c77811f0c331c8805219ca7b87ac17576c5", + "sha256:a63b4fd3e2cabdcc9d918ed280bdde3e8e9641e04f3c59a2a3109644a07b9832", + "sha256:ae88588d687bd476be588010cbbe551e9c2872b816f2da8f01f6f1fda74e1ef0", + "sha256:b0b84408d4eabc6de9dd1e1e0bc63e7731e890c0b378a62443e5741cfd0ae90a", + "sha256:be78485e5d5f3684e875dab60f40cddace2f5b2a8f7fede412358ab3214c3a6f", + "sha256:c27eaed872185f047bb7f7da2d21a7d8913457678c9a100a50db6da890bc28b9", + "sha256:c7fccd08b14aa437fe096c71c645c0f9be0655a9b1a4b7cffc77bcb23b3d61d2", + "sha256:c81cb40bff373ab7a7446d6bbca0190bccc5be3448b47b51d729e37799bb5692", + "sha256:d11874b3c33ee441059464711cd365b89fa1a9cf19ae75b0c189b01fbf735b84", + "sha256:e9c028b5897901361d81a4718d1db217b716424a0283afe9d6735fe0caf70f79", + "sha256:fe489d486cd00b739be826e8c1be188ddb74c7a1ca784d93d06fda882a6a1681" + ], + "index": "pypi", + "version": "==4.4.1" + }, + "more-itertools": { + "hashes": [ + "sha256:5dd8bcf33e5f9513ffa06d5ad33d78f31e1931ac9a18f33d37e77a180d393a7c", + "sha256:b1ddb932186d8a6ac451e1d95844b382f55e12686d51ca0c68b6f61f2ab7a507" + ], + "version": "==8.2.0" + }, + "openpyxl": { + "hashes": [ + "sha256:72d1ed243972cad0b3c236230083cac00d9c72804e64a2ae93d7901aec1a8f1c" + ], + "index": "pypi", + "version": "==2.6.3" + }, + "packaging": { + "hashes": [ + "sha256:3c292b474fda1671ec57d46d739d072bfd495a4f51ad01a055121d81e952b7a3", + "sha256:82f77b9bee21c1bafbf35a84905d604d5d1223801d639cf3ed140bd651c08752" + ], + "version": "==20.3" + }, + "pdfkit": { + "hashes": [ + "sha256:05f1c631e8d9ab877886955da825e48b459e097886a21448ab17b34c60cfd66c", + "sha256:6a866c9659e62a81abd72cdb32b400762d76085b964beb0b15106d573a539677", + "sha256:ef1da35b78d534197e7ce4a604a4a190e9aa769e56634957535f3479a50d8cd1" + ], + "index": "pypi", + "version": "==0.6.1" + }, + "phonenumbers": { + "hashes": [ + "sha256:127706b1743d2c0cf575be025262c9e45e687dfebd4b114ca231c9df1e713874", + "sha256:60a93df03db5170ae589a734f68a95c0646aa98fdf4c1591cb7c15c9da758e05" + ], + "index": "pypi", + "version": "==8.10.4" + }, + "pluggy": { + "hashes": [ + "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0", + "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d" + ], + "version": "==0.13.1" + }, + "psycopg2-binary": { + "hashes": [ + "sha256:080c72714784989474f97be9ab0ddf7b2ad2984527e77f2909fcd04d4df53809", + "sha256:110457be80b63ff4915febb06faa7be002b93a76e5ba19bf3f27636a2ef58598", + "sha256:171352a03b22fc099f15103959b52ee77d9a27e028895d7e5fde127aa8e3bac5", + "sha256:19d013e7b0817087517a4b3cab39c084d78898369e5c46258aab7be4f233d6a1", + "sha256:249b6b21ae4eb0f7b8423b330aa80fab5f821b9ffc3f7561a5e2fd6bb142cf5d", + "sha256:2ac0731d2d84b05c7bb39e85b7e123c3a0acd4cda631d8d542802c88deb9e87e", + "sha256:2b6d561193f0dc3f50acfb22dd52ea8c8dfbc64bcafe3938b5f209cc17cb6f00", + "sha256:2bd23e242e954214944481124755cbefe7c2cf563b1a54cd8d196d502f2578bf", + "sha256:3e1239242ca60b3725e65ab2f13765fc199b03af9eaf1b5572f0e97bdcee5b43", + "sha256:3eb70bb697abbe86b1d2b1316370c02ba320bfd1e9e35cf3b9566a855ea8e4e5", + "sha256:51a2fc7e94b98bd1bb5d4570936f24fc2b0541b63eccadf8fdea266db8ad2f70", + "sha256:52f1bdafdc764b7447e393ed39bb263eccb12bfda25a4ac06d82e3a9056251f6", + "sha256:5b3581319a3951f1e866f4f6c5e42023db0fae0284273b82e97dfd32c51985cd", + "sha256:63c1b66e3b2a3a336288e4bcec499e0dc310cd1dceaed1c46fa7419764c68877", + "sha256:8123a99f24ecee469e5c1339427bcdb2a33920a18bb5c0d58b7c13f3b0298ba3", + "sha256:85e699fcabe7f817c0f0a412d4e7c6627e00c412b418da7666ff353f38e30f67", + "sha256:8dbff4557bbef963697583366400822387cccf794ccb001f1f2307ed21854c68", + "sha256:908d21d08d6b81f1b7e056bbf40b2f77f8c499ab29e64ec5113052819ef1c89b", + "sha256:af39d0237b17d0a5a5f638e9dffb34013ce2b1d41441fd30283e42b22d16858a", + "sha256:af51bb9f055a3f4af0187149a8f60c9d516cf7d5565b3dac53358796a8fb2a5b", + "sha256:b2ecac57eb49e461e86c092761e6b8e1fd9654dbaaddf71a076dcc869f7014e2", + "sha256:cd37cc170678a4609becb26b53a2bc1edea65177be70c48dd7b39a1149cabd6e", + "sha256:d17e3054b17e1a6cb8c1140f76310f6ede811e75b7a9d461922d2c72973f583e", + "sha256:d305313c5a9695f40c46294d4315ed3a07c7d2b55e48a9010dad7db7a66c8b7f", + "sha256:dd0ef0eb1f7dd18a3f4187226e226a7284bda6af5671937a221766e6ef1ee88f", + "sha256:e1adff53b56db9905db48a972fb89370ad5736e0450b96f91bcf99cadd96cfd7", + "sha256:f0d43828003c82dbc9269de87aa449e9896077a71954fbbb10a614c017e65737", + "sha256:f78e8b487de4d92640105c1389e5b90be3496b1d75c90a666edd8737cc2dbab7" + ], + "index": "pypi", + "version": "==2.8.3" + }, + "py": { + "hashes": [ + "sha256:5e27081401262157467ad6e7f851b7aa402c5852dbcb3dae06768434de5752aa", + "sha256:c20fdd83a5dbc0af9efd622bee9a5564e278f6380fffcacc43ba6f43db2813b0" + ], + "version": "==1.8.1" + }, + "pyparsing": { + "hashes": [ + "sha256:67199f0c41a9c702154efb0e7a8cc08accf830eb003b4d9fa42c4059002e2492", + "sha256:700d17888d441604b0bd51535908dcb297561b040819cccde647a92439db5a2a" + ], + "version": "==3.0.0a1" + }, + "pytest": { + "hashes": [ + "sha256:95b1f6db806e5b1b5b443efeb58984c24945508f93a866c1719e1a507a957d7c", + "sha256:c3d5020755f70c82eceda3feaf556af9a341334414a8eca521a18f463bcead88" + ], + "index": "pypi", + "version": "==5.1.1" + }, + "pytest-django": { + "hashes": [ + "sha256:264fb4c506db5d48a6364c311a0b00b7b48a52715bad8839b2d8bee9b99ed6bb", + "sha256:4adfe5fb3ed47f0ba55506dd3daf688b1f74d5e69148c10ad2dd2f79f40c0d62" + ], + "index": "pypi", + "version": "==3.5.1" + }, + "python-dateutil": { + "hashes": [ + "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c", + "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a" + ], + "markers": "python_version >= '2.7'", + "version": "==2.8.1" + }, + "python-memcached": { + "hashes": [ + "sha256:4dac64916871bd3550263323fc2ce18e1e439080a2d5670c594cf3118d99b594", + "sha256:a2e28637be13ee0bf1a8b6843e7490f9456fd3f2a4cb60471733c7b5d5557e4f" + ], + "index": "pypi", + "version": "==1.59" + }, + "pytz": { + "hashes": [ + "sha256:1c557d7d0e871de1f5ccd5833f60fb2550652da6be2693c1e02300743d21500d", + "sha256:b02c06db6cf09c12dd25137e563b31700d3b80fcc4ad23abb7a315f2789819be" + ], + "version": "==2019.3" + }, + "raven": { + "hashes": [ + "sha256:3fa6de6efa2493a7c827472e984ce9b020797d0da16f1db67197bcc23c8fae54", + "sha256:44a13f87670836e153951af9a3c80405d36b43097db869a36e92809673692ce4" + ], + "index": "pypi", + "version": "==6.10.0" + }, + "rcssmin": { + "hashes": [ + "sha256:ca87b695d3d7864157773a61263e5abb96006e9ff0e021eff90cbe0e1ba18270" + ], + "version": "==1.0.6" + }, + "redis": { + "hashes": [ + "sha256:98a22fb750c9b9bb46e75e945dc3f61d0ab30d06117cbb21ff9cd1d315fedd3b", + "sha256:c504251769031b0dd7dd5cf786050a6050197c6de0d37778c80c08cb04ae8275" + ], + "index": "pypi", + "version": "==3.3.8" + }, + "requests": { + "hashes": [ + "sha256:11e007a8a2aa0323f5a921e9e6a2d7e4e67d9877e85773fba9ba6419025cbeb4", + "sha256:9cf5292fcd0f598c671cfc1e0d7d1a7f13bb8085e9a590f48c010551dc6c4b31" + ], + "index": "pypi", + "version": "==2.22.0" + }, + "rjsmin": { + "hashes": [ + "sha256:0ab825839125eaca57cc59581d72e596e58a7a56fbc0839996b7528f0343a0a8", + "sha256:211c2fe8298951663bbc02acdffbf714f6793df54bfc50e1c6c9e71b3f2559a3", + "sha256:466fe70cc5647c7c51b3260c7e2e323a98b2b173564247f9c89e977720a0645f", + "sha256:585e75a84d9199b68056fd4a083d9a61e2a92dfd10ff6d4ce5bdb04bc3bdbfaf", + "sha256:6044ca86e917cd5bb2f95e6679a4192cef812122f28ee08c677513de019629b3", + "sha256:714329db774a90947e0e2086cdddb80d5e8c4ac1c70c9f92436378dedb8ae345", + "sha256:799890bd07a048892d8d3deb9042dbc20b7f5d0eb7da91e9483c561033b23ce2", + "sha256:975b69754d6a76be47c0bead12367a1ca9220d08e5393f80bab0230d4625d1f4", + "sha256:b15dc75c71f65d9493a8c7fa233fdcec823e3f1b88ad84a843ffef49b338ac32", + "sha256:dd0f4819df4243ffe4c964995794c79ca43943b5b756de84be92b445a652fb86", + "sha256:e3908b21ebb584ce74a6ac233bdb5f29485752c9d3be5e50c5484ed74169232c", + "sha256:e487a7783ac4339e79ec610b98228eb9ac72178973e3dee16eba0e3feef25924", + "sha256:ecd29f1b3e66a4c0753105baec262b331bcbceefc22fbe6f7e8bcd2067bcb4d7" + ], + "version": "==1.1.0" + }, + "s3transfer": { + "hashes": [ + "sha256:6efc926738a3cd576c2a79725fed9afde92378aa5c6a957e3af010cb019fac9d", + "sha256:b780f2411b824cb541dbcd2c713d0cb61c7d1bcadae204cdddda2b35cef493ba" + ], + "version": "==0.2.1" + }, + "six": { + "hashes": [ + "sha256:236bdbdce46e6e6a3d61a337c0f8b763ca1e8717c03b369e87a7ec7ce1319c0a", + "sha256:8f3cd2e254d8f793e7f3d6d9df77b92252b52637291d0f0da013c76ea2724b6c" + ], + "version": "==1.14.0" + }, + "sorl-thumbnail": { + "hashes": [ + "sha256:8dfe5fda91a5047d1d35a0b9effe7b000764a01d648e15ca076f44e9c34b6dbd", + "sha256:d9e3f018d19293824803e4ffead96b19dfcd44fa7987cea392f50436817bef34" + ], + "index": "pypi", + "version": "==12.5.0" + }, + "sqlparse": { + "hashes": [ + "sha256:022fb9c87b524d1f7862b3037e541f68597a730a8843245c349fc93e1643dc4e", + "sha256:e162203737712307dfe78860cc56c8da8a852ab2ee33750e33aeadf38d12c548" + ], + "version": "==0.3.1" + }, + "tblib": { + "hashes": [ + "sha256:229bee3754cb5d98b4837dd5c4405e80cfab57cb9f93220410ad367f8b352344", + "sha256:e222f44485d45ed13fada73b57775e2ff9bd8af62160120bbb6679f5ad80315b" + ], + "index": "pypi", + "version": "==1.6.0" + }, + "urllib3": { + "hashes": [ + "sha256:2f3db8b19923a873b3e5256dc9c2dedfa883e33d87c690d9c7913e1f40673cdc", + "sha256:87716c2d2a7121198ebcb7ce7cccf6ce5e9ba539041cfbaeecfb641dc0bf6acc" + ], + "markers": "python_version >= '3.4'", + "version": "==1.25.8" + }, + "vine": { + "hashes": [ + "sha256:133ee6d7a9016f177ddeaf191c1f58421a1dcc6ee9a42c58b34bed40e1d2cd87", + "sha256:ea4947cc56d1fd6f2095c8d543ee25dad966f78692528e68b4fada11ba3f98af" + ], + "version": "==1.3.0" + }, + "wcwidth": { + "hashes": [ + "sha256:cafe2186b3c009a04067022ce1dcd79cb38d8d65ee4f4791b8888d6599d1bbe1", + "sha256:ee73862862a156bf77ff92b09034fc4825dd3af9cf81bc5b360668d425f3c5f1" + ], + "version": "==0.1.9" + }, + "xlrd": { + "hashes": [ + "sha256:546eb36cee8db40c3eaa46c351e67ffee6eeb5fa2650b71bc4c758a29a1b29b2", + "sha256:e551fb498759fa3a5384a94ccd4c3c02eb7c00ea424426e212ac0c57be9dfbde" + ], + "index": "pypi", + "version": "==1.2.0" + }, + "xlwt": { + "hashes": [ + "sha256:a082260524678ba48a297d922cc385f58278b8aa68741596a87de01a9c628b2e", + "sha256:c59912717a9b28f1a3c2a98fd60741014b06b043936dcecbc113eaaada156c88" + ], + "index": "pypi", + "version": "==1.3.0" + }, + "zipp": { + "hashes": [ + "sha256:aa36550ff0c0b7ef7fa639055d797116ee891440eac1a56f378e2d3179e0320b", + "sha256:c599e4d75c98f6798c509911d08a22e6c021d074469042177c8c86fb92eefd96" + ], + "version": "==3.1.0" + } + }, + "develop": { + "appdirs": { + "hashes": [ + "sha256:9e5896d1372858f8dd3344faf4e5014d21849c756c8d5701f78f8a103b372d92", + "sha256:d8b24664561d0d34ddfaec54636d502d7cea6e29c3eaf68f3df6180863e2166e" + ], + "version": "==1.4.3" + }, + "astroid": { + "hashes": [ + "sha256:71ea07f44df9568a75d0f354c49143a4575d90645e9fead6dfb52c26a85ed13a", + "sha256:840947ebfa8b58f318d42301cf8c0a20fd794a33b61cc4638e28e9e61ba32f42" + ], + "version": "==2.3.3" + }, + "attrs": { + "hashes": [ + "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c", + "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72" + ], + "version": "==19.3.0" + }, + "black": { + "hashes": [ + "sha256:1b30e59be925fafc1ee4565e5e08abef6b03fe455102883820fe5ee2e4734e0b", + "sha256:c2edb73a08e9e0e6f65a0e6af18b059b8b1cdd5bef997d7a0b181df93dc81539" + ], + "index": "pypi", + "version": "==19.10b0" + }, + "click": { + "hashes": [ + "sha256:8a18b4ea89d8820c5d0c7da8a64b2c324b4dabb695804dbfea19b9be9d88c0cc", + "sha256:e345d143d80bf5ee7534056164e5e112ea5e22716bbb1ce727941f4c8b471b9a" + ], + "version": "==7.1.1" + }, + "isort": { + "hashes": [ + "sha256:54da7e92468955c4fceacd0c86bd0ec997b0e1ee80d97f67c35a78b719dccab1", + "sha256:6e811fcb295968434526407adb8796944f1988c5b65e8139058f2014cbe100fd" + ], + "index": "pypi", + "version": "==4.3.21" + }, + "lazy-object-proxy": { + "hashes": [ + "sha256:0c4b206227a8097f05c4dbdd323c50edf81f15db3b8dc064d08c62d37e1a504d", + "sha256:194d092e6f246b906e8f70884e620e459fc54db3259e60cf69a4d66c3fda3449", + "sha256:1be7e4c9f96948003609aa6c974ae59830a6baecc5376c25c92d7d697e684c08", + "sha256:4677f594e474c91da97f489fea5b7daa17b5517190899cf213697e48d3902f5a", + "sha256:48dab84ebd4831077b150572aec802f303117c8cc5c871e182447281ebf3ac50", + "sha256:5541cada25cd173702dbd99f8e22434105456314462326f06dba3e180f203dfd", + "sha256:59f79fef100b09564bc2df42ea2d8d21a64fdcda64979c0fa3db7bdaabaf6239", + "sha256:8d859b89baf8ef7f8bc6b00aa20316483d67f0b1cbf422f5b4dc56701c8f2ffb", + "sha256:9254f4358b9b541e3441b007a0ea0764b9d056afdeafc1a5569eee1cc6c1b9ea", + "sha256:9651375199045a358eb6741df3e02a651e0330be090b3bc79f6d0de31a80ec3e", + "sha256:97bb5884f6f1cdce0099f86b907aa41c970c3c672ac8b9c8352789e103cf3156", + "sha256:9b15f3f4c0f35727d3a0fba4b770b3c4ebbb1fa907dbcc046a1d2799f3edd142", + "sha256:a2238e9d1bb71a56cd710611a1614d1194dc10a175c1e08d75e1a7bcc250d442", + "sha256:a6ae12d08c0bf9909ce12385803a543bfe99b95fe01e752536a60af2b7797c62", + "sha256:ca0a928a3ddbc5725be2dd1cf895ec0a254798915fb3a36af0964a0a4149e3db", + "sha256:cb2c7c57005a6804ab66f106ceb8482da55f5314b7fcb06551db1edae4ad1531", + "sha256:d74bb8693bf9cf75ac3b47a54d716bbb1a92648d5f781fc799347cfc95952383", + "sha256:d945239a5639b3ff35b70a88c5f2f491913eb94871780ebfabb2568bd58afc5a", + "sha256:eba7011090323c1dadf18b3b689845fd96a61ba0a1dfbd7f24b921398affc357", + "sha256:efa1909120ce98bbb3777e8b6f92237f5d5c8ea6758efea36a473e1d38f7d3e4", + "sha256:f3900e8a5de27447acbf900b4750b0ddfd7ec1ea7fbaf11dfa911141bc522af0" + ], + "version": "==1.4.3" + }, + "mccabe": { + "hashes": [ + "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42", + "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f" + ], + "version": "==0.6.1" + }, + "pathspec": { + "hashes": [ + "sha256:7d91249d21749788d07a2d0f94147accd8f845507400749ea19c1ec9054a12b0", + "sha256:da45173eb3a6f2a5a487efba21f050af2b41948be6ab52b6a1e3ff22bb8b7061" + ], + "version": "==0.8.0" + }, + "pylint": { + "hashes": [ + "sha256:3db5468ad013380e987410a8d6956226963aed94ecb5f9d3a28acca6d9ac36cd", + "sha256:886e6afc935ea2590b462664b161ca9a5e40168ea99e5300935f6591ad467df4" + ], + "index": "pypi", + "version": "==2.4.4" + }, + "regex": { + "hashes": [ + "sha256:08119f707f0ebf2da60d2f24c2f39ca616277bb67ef6c92b72cbf90cbe3a556b", + "sha256:0ce9537396d8f556bcfc317c65b6a0705320701e5ce511f05fc04421ba05b8a8", + "sha256:1cbe0fa0b7f673400eb29e9ef41d4f53638f65f9a2143854de6b1ce2899185c3", + "sha256:2294f8b70e058a2553cd009df003a20802ef75b3c629506be20687df0908177e", + "sha256:23069d9c07e115537f37270d1d5faea3e0bdded8279081c4d4d607a2ad393683", + "sha256:24f4f4062eb16c5bbfff6a22312e8eab92c2c99c51a02e39b4eae54ce8255cd1", + "sha256:295badf61a51add2d428a46b8580309c520d8b26e769868b922750cf3ce67142", + "sha256:2a3bf8b48f8e37c3a40bb3f854bf0121c194e69a650b209628d951190b862de3", + "sha256:4385f12aa289d79419fede43f979e372f527892ac44a541b5446617e4406c468", + "sha256:5635cd1ed0a12b4c42cce18a8d2fb53ff13ff537f09de5fd791e97de27b6400e", + "sha256:5bfed051dbff32fd8945eccca70f5e22b55e4148d2a8a45141a3b053d6455ae3", + "sha256:7e1037073b1b7053ee74c3c6c0ada80f3501ec29d5f46e42669378eae6d4405a", + "sha256:90742c6ff121a9c5b261b9b215cb476eea97df98ea82037ec8ac95d1be7a034f", + "sha256:a58dd45cb865be0ce1d5ecc4cfc85cd8c6867bea66733623e54bd95131f473b6", + "sha256:c087bff162158536387c53647411db09b6ee3f9603c334c90943e97b1052a156", + "sha256:c162a21e0da33eb3d31a3ac17a51db5e634fc347f650d271f0305d96601dc15b", + "sha256:c9423a150d3a4fc0f3f2aae897a59919acd293f4cb397429b120a5fcd96ea3db", + "sha256:ccccdd84912875e34c5ad2d06e1989d890d43af6c2242c6fcfa51556997af6cd", + "sha256:e91ba11da11cf770f389e47c3f5c30473e6d85e06d7fd9dcba0017d2867aab4a", + "sha256:ea4adf02d23b437684cd388d557bf76e3afa72f7fed5bbc013482cc00c816948", + "sha256:fb95debbd1a824b2c4376932f2216cc186912e389bdb0e27147778cf6acb3f89" + ], + "version": "==2020.4.4" + }, + "six": { + "hashes": [ + "sha256:236bdbdce46e6e6a3d61a337c0f8b763ca1e8717c03b369e87a7ec7ce1319c0a", + "sha256:8f3cd2e254d8f793e7f3d6d9df77b92252b52637291d0f0da013c76ea2724b6c" + ], + "version": "==1.14.0" + }, + "toml": { + "hashes": [ + "sha256:229f81c57791a41d65e399fc06bf0848bab550a9dfd5ed66df18ce5f05e73d5c", + "sha256:235682dd292d5899d361a811df37e04a8828a5b1da3115886b73cf81ebc9100e" + ], + "version": "==0.10.0" + }, + "typed-ast": { + "hashes": [ + "sha256:0666aa36131496aed8f7be0410ff974562ab7eeac11ef351def9ea6fa28f6355", + "sha256:0c2c07682d61a629b68433afb159376e24e5b2fd4641d35424e462169c0a7919", + "sha256:249862707802d40f7f29f6e1aad8d84b5aa9e44552d2cc17384b209f091276aa", + "sha256:24995c843eb0ad11a4527b026b4dde3da70e1f2d8806c99b7b4a7cf491612652", + "sha256:269151951236b0f9a6f04015a9004084a5ab0d5f19b57de779f908621e7d8b75", + "sha256:4083861b0aa07990b619bd7ddc365eb7fa4b817e99cf5f8d9cf21a42780f6e01", + "sha256:498b0f36cc7054c1fead3d7fc59d2150f4d5c6c56ba7fb150c013fbc683a8d2d", + "sha256:4e3e5da80ccbebfff202a67bf900d081906c358ccc3d5e3c8aea42fdfdfd51c1", + "sha256:6daac9731f172c2a22ade6ed0c00197ee7cc1221aa84cfdf9c31defeb059a907", + "sha256:715ff2f2df46121071622063fc7543d9b1fd19ebfc4f5c8895af64a77a8c852c", + "sha256:73d785a950fc82dd2a25897d525d003f6378d1cb23ab305578394694202a58c3", + "sha256:8c8aaad94455178e3187ab22c8b01a3837f8ee50e09cf31f1ba129eb293ec30b", + "sha256:8ce678dbaf790dbdb3eba24056d5364fb45944f33553dd5869b7580cdbb83614", + "sha256:aaee9905aee35ba5905cfb3c62f3e83b3bec7b39413f0a7f19be4e547ea01ebb", + "sha256:bcd3b13b56ea479b3650b82cabd6b5343a625b0ced5429e4ccad28a8973f301b", + "sha256:c9e348e02e4d2b4a8b2eedb48210430658df6951fa484e59de33ff773fbd4b41", + "sha256:d205b1b46085271b4e15f670058ce182bd1199e56b317bf2ec004b6a44f911f6", + "sha256:d43943ef777f9a1c42bf4e552ba23ac77a6351de620aa9acf64ad54933ad4d34", + "sha256:d5d33e9e7af3b34a40dc05f498939f0ebf187f07c385fd58d591c533ad8562fe", + "sha256:fc0fea399acb12edbf8a628ba8d2312f583bdbdb3335635db062fa98cf71fca4", + "sha256:fe460b922ec15dd205595c9b5b99e2f056fd98ae8f9f56b888e7a17dc2b757e7" + ], + "markers": "implementation_name == 'cpython' and python_version < '3.8'", + "version": "==1.4.1" + }, + "wrapt": { + "hashes": [ + "sha256:565a021fd19419476b9362b05eeaa094178de64f8361e44468f9e9d7843901e1" + ], + "version": "==1.11.2" + } + } +} diff --git a/accounts/forms.py b/accounts/forms.py index dc1c026f1..57b3709e1 100644 --- a/accounts/forms.py +++ b/accounts/forms.py @@ -12,69 +12,99 @@ class AccountForm(forms.ModelForm): teams = forms.MultipleChoiceField(choices=teams_queryset) def __init__(self, *args, **kwargs): - account_view = kwargs.pop('account', False) - request_user = kwargs.pop('request_user', None) + account_view = kwargs.pop("account", False) + request_user = kwargs.pop("request_user", None) + request_obj = kwargs.pop("request_obj", None) super(AccountForm, self).__init__(*args, **kwargs) for field in self.fields.values(): field.widget.attrs = {"class": "form-control"} - self.fields['description'].widget.attrs.update({'rows': '8'}) - self.fields['status'].choices = [ - (each[0], each[1]) for each in Account.ACCOUNT_STATUS_CHOICE] - self.fields['status'].required = False + self.fields["description"].widget.attrs.update({"rows": "8"}) + self.fields["status"].choices = [ + (each[0], each[1]) for each in Account.ACCOUNT_STATUS_CHOICE + ] + self.fields["status"].required = False for key, value in self.fields.items(): - if key == 'phone': - value.widget.attrs['placeholder'] = "+911234567890" + if key == "phone": + value.widget.attrs["placeholder"] = "+911234567890" else: - value.widget.attrs['placeholder'] = value.label - - self.fields['billing_address_line'].widget.attrs.update({ - 'placeholder': 'Address Line'}) - self.fields['billing_street'].widget.attrs.update({ - 'placeholder': 'Street'}) - self.fields['billing_city'].widget.attrs.update({ - 'placeholder': 'City'}) - self.fields['billing_state'].widget.attrs.update({ - 'placeholder': 'State'}) - self.fields['billing_postcode'].widget.attrs.update({ - 'placeholder': 'Postcode'}) - self.fields["billing_country"].choices = [ - ("", "--Country--"), ] + list(self.fields["billing_country"].choices)[1:] + value.widget.attrs["placeholder"] = value.label + + self.fields["billing_address_line"].widget.attrs.update( + {"placeholder": "Address Line"} + ) + self.fields["billing_street"].widget.attrs.update({"placeholder": "Street"}) + self.fields["billing_city"].widget.attrs.update({"placeholder": "City"}) + self.fields["billing_state"].widget.attrs.update({"placeholder": "State"}) + self.fields["billing_postcode"].widget.attrs.update({"placeholder": "Postcode"}) + self.fields["billing_country"].choices = [("", "--Country--"),] + list( + self.fields["billing_country"].choices + )[1:] # self.fields["lead"].queryset = Lead.objects.all( # ).exclude(status='closed') - if request_user.role == 'ADMIN': - self.fields["lead"].queryset = Lead.objects.filter().exclude( - status='closed').order_by('title') - self.fields["contacts"].queryset = Contact.objects.filter() - self.fields["teams"].choices = [(team.get('id'), team.get('name')) for team in Teams.objects.all().values('id', 'name')] + if request_user.role == "ADMIN": + self.fields["lead"].queryset = ( + Lead.objects.filter(company=request_obj.company) + .exclude(status="closed") + .order_by("title") + ) + self.fields["contacts"].queryset = Contact.objects.filter( + company=request_obj.company + ) + self.fields["teams"].choices = [ + (team.get("id"), team.get("name")) + for team in Teams.objects.filter(company=request_obj.company).values( + "id", "name" + ) + ] self.fields["teams"].required = False else: - self.fields["lead"].queryset = Lead.objects.filter( - Q(assigned_to__in=[request_user]) | Q(created_by=request_user)).exclude(status='closed').order_by('title') + self.fields["lead"].queryset = ( + Lead.objects.filter( + Q(assigned_to__in=[request_user]) | Q(created_by=request_user) + ) + .filter(company=request_obj.company) + .exclude(status="closed") + .order_by("title") + ) self.fields["contacts"].queryset = Contact.objects.filter( - Q(assigned_to__in=[request_user]) | Q(created_by=request_user)) + Q(assigned_to__in=[request_user]) | Q(created_by=request_user) + ).filter(company=request_obj.company) self.fields["teams"].required = False - self.fields['assigned_to'].required = False + self.fields["assigned_to"].required = False if account_view: - self.fields['billing_address_line'].required = True - self.fields['billing_street'].required = True - self.fields['billing_city'].required = True - self.fields['billing_state'].required = True - self.fields['billing_postcode'].required = True - self.fields['billing_country'].required = True + self.fields["billing_address_line"].required = True + self.fields["billing_street"].required = True + self.fields["billing_city"].required = True + self.fields["billing_state"].required = True + self.fields["billing_postcode"].required = True + self.fields["billing_country"].required = True # lead is not mandatory while editing if self.instance.id: - self.fields['lead'].required = False - self.fields['lead'].required = False + self.fields["lead"].required = False + self.fields["lead"].required = False class Meta: model = Account - fields = ('name', 'phone', 'email', 'website', 'industry', - 'description', 'status', 'assigned_to', - 'billing_address_line', 'billing_street', - 'billing_city', 'billing_state', - 'billing_postcode', 'billing_country', 'lead', 'contacts') + fields = ( + "name", + "phone", + "email", + "website", + "industry", + "description", + "status", + "assigned_to", + "billing_address_line", + "billing_street", + "billing_city", + "billing_state", + "billing_postcode", + "billing_country", + "lead", + "contacts", + ) class AccountCommentForm(forms.ModelForm): @@ -82,7 +112,7 @@ class AccountCommentForm(forms.ModelForm): class Meta: model = Comment - fields = ('comment', 'account', 'commented_by') + fields = ("comment", "account", "commented_by") class AccountAttachmentForm(forms.ModelForm): @@ -90,7 +120,7 @@ class AccountAttachmentForm(forms.ModelForm): class Meta: model = Attachments - fields = ('attachment', 'account') + fields = ("attachment", "account") class EmailForm(forms.ModelForm): @@ -102,28 +132,35 @@ class EmailForm(forms.ModelForm): # scheduled_later = forms.CharField(max_length=20) def __init__(self, *args, **kwargs): - self.account_obj = kwargs.pop('account', False) + self.account_obj = kwargs.pop("account", False) super(EmailForm, self).__init__(*args, **kwargs) # self.fields['message_subject'].widget.attrs['class'] = 'form-control' # self.fields['message_subject'].widget.attrs['required'] = True # self.fields['message_subject'].widget.attrs['placeholder'] = 'Email Subject' # self.fields['recipient'].required = False - self.fields['from_email'].required = True - self.fields['message_subject'].required = True - self.fields['message_body'].required = True - - self.fields['scheduled_date_time'].required = False - self.fields['scheduled_later'].required = False - self.fields['recipients'].required = True - self.fields['recipients'].query = self.account_obj.contacts.all() + self.fields["from_email"].required = True + self.fields["message_subject"].required = True + self.fields["message_body"].required = True + + self.fields["scheduled_date_time"].required = False + self.fields["scheduled_later"].required = False + self.fields["recipients"].required = True + self.fields["recipients"].query = self.account_obj.contacts.all() # self.fields['recipients'].choices = list((contact.get('id'), contact.get('email')) # for contact in self.account_obj.contacts.values('id', 'email')) class Meta: model = Email - fields = ['recipients', 'message_subject', 'from_email', - 'message_body', 'timezone', 'scheduled_date_time', 'scheduled_later'] + fields = [ + "recipients", + "message_subject", + "from_email", + "message_body", + "timezone", + "scheduled_date_time", + "scheduled_later", + ] # def clean_recipients(self): # recipients = self.cleaned_data.get('recipients') @@ -137,20 +174,19 @@ class Meta: # return recipients def clean_scheduled_date_time(self): - scheduled_date_time = self.cleaned_data.get('scheduled_date_time') - if self.data.get('scheduled_later') not in ['', None, False, 'false']: - if scheduled_date_time in ['', None]: - raise forms.ValidationError('This Field is required.') + scheduled_date_time = self.cleaned_data.get("scheduled_date_time") + if self.data.get("scheduled_later") not in ["", None, False, "false"]: + if scheduled_date_time in ["", None]: + raise forms.ValidationError("This Field is required.") - if self.data.get('scheduled_later') == 'true': - if scheduled_date_time in ['', None]: - raise forms.ValidationError('This Field is required.') + if self.data.get("scheduled_later") == "true": + if scheduled_date_time in ["", None]: + raise forms.ValidationError("This Field is required.") return scheduled_date_time - def clean_message_body(self): - message_body = self.cleaned_data.get('message_body') + message_body = self.cleaned_data.get("message_body") count = 0 for i in message_body: if i == "{": @@ -158,7 +194,7 @@ def clean_message_body(self): elif i == "}": count -= 1 if count < 0: - raise forms.ValidationError('Brackets do not match, Enter valid tags.') + raise forms.ValidationError("Brackets do not match, Enter valid tags.") if count != 0: - raise forms.ValidationError('Brackets do not match, Enter valid tags.') + raise forms.ValidationError("Brackets do not match, Enter valid tags.") return message_body diff --git a/accounts/migrations/0011_account_company.py b/accounts/migrations/0011_account_company.py new file mode 100644 index 000000000..66659086e --- /dev/null +++ b/accounts/migrations/0011_account_company.py @@ -0,0 +1,20 @@ +# Generated by Django 2.2.10 on 2020-04-23 10:20 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('common', '0020_auto_20200409_1653'), + ('accounts', '0010_account_teams'), + ] + + operations = [ + migrations.AddField( + model_name='account', + name='company', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='common.Company'), + ), + ] diff --git a/accounts/models.py b/accounts/models.py index 725d30d56..852ba1bf9 100644 --- a/accounts/models.py +++ b/accounts/models.py @@ -3,7 +3,7 @@ from django.utils.translation import pgettext_lazy from django.utils.translation import ugettext_lazy as _ -from common.models import User +from common.models import User, Company from common.utils import INDCHOICES, COUNTRIES from phonenumber_field.modelfields import PhoneNumberField from django.utils.text import slugify @@ -22,61 +22,62 @@ def save(self, *args, **kwargs): class Account(models.Model): - ACCOUNT_STATUS_CHOICE = ( - ("open", "Open"), - ('close', 'Close') - ) + ACCOUNT_STATUS_CHOICE = (("open", "Open"), ("close", "Close")) - name = models.CharField(pgettext_lazy( - "Name of Account", "Name"), max_length=64) + name = models.CharField(pgettext_lazy("Name of Account", "Name"), max_length=64) email = models.EmailField() phone = PhoneNumberField(null=True) industry = models.CharField( - _("Industry Type"), - max_length=255, choices=INDCHOICES, - blank=True, null=True) + _("Industry Type"), max_length=255, choices=INDCHOICES, blank=True, null=True + ) # billing_address = models.ForeignKey( # Address, related_name='account_billing_address', on_delete=models.CASCADE, blank=True, null=True) # shipping_address = models.ForeignKey( # Address, related_name='account_shipping_address', on_delete=models.CASCADE, blank=True, null=True) billing_address_line = models.CharField( - _("Address"), max_length=255, blank=True, null=True) - billing_street = models.CharField( - _("Street"), max_length=55, blank=True, null=True) - billing_city = models.CharField( - _("City"), max_length=255, blank=True, null=True) - billing_state = models.CharField( - _("State"), max_length=255, blank=True, null=True) + _("Address"), max_length=255, blank=True, null=True + ) + billing_street = models.CharField(_("Street"), max_length=55, blank=True, null=True) + billing_city = models.CharField(_("City"), max_length=255, blank=True, null=True) + billing_state = models.CharField(_("State"), max_length=255, blank=True, null=True) billing_postcode = models.CharField( - _("Post/Zip-code"), max_length=64, blank=True, null=True) + _("Post/Zip-code"), max_length=64, blank=True, null=True + ) billing_country = models.CharField( - max_length=3, choices=COUNTRIES, blank=True, null=True) + max_length=3, choices=COUNTRIES, blank=True, null=True + ) website = models.URLField(_("Website"), blank=True, null=True) description = models.TextField(blank=True, null=True) created_by = models.ForeignKey( - User, related_name='account_created_by', - on_delete=models.SET_NULL, null=True) + User, related_name="account_created_by", on_delete=models.SET_NULL, null=True + ) created_on = models.DateTimeField(_("Created on"), auto_now_add=True) is_active = models.BooleanField(default=False) tags = models.ManyToManyField(Tags, blank=True) status = models.CharField( - choices=ACCOUNT_STATUS_CHOICE, max_length=64, default='open') + choices=ACCOUNT_STATUS_CHOICE, max_length=64, default="open" + ) lead = models.ForeignKey( - 'leads.Lead', related_name="account_leads", - on_delete=models.SET_NULL, null=True) - contact_name = models.CharField(pgettext_lazy( - "Name of Contact", "Contact Name"), max_length=120) + "leads.Lead", related_name="account_leads", on_delete=models.SET_NULL, null=True + ) + contact_name = models.CharField( + pgettext_lazy("Name of Contact", "Contact Name"), max_length=120 + ) contacts = models.ManyToManyField( - 'contacts.Contact', related_name="account_contacts") - assigned_to = models.ManyToManyField( - User, related_name='account_assigned_users') - teams = models.ManyToManyField(Teams, related_name='account_teams') + "contacts.Contact", related_name="account_contacts" + ) + assigned_to = models.ManyToManyField(User, related_name="account_assigned_users") + teams = models.ManyToManyField(Teams, related_name="account_teams") + + company = models.ForeignKey( + Company, on_delete=models.SET_NULL, null=True, blank=True + ) def __str__(self): return self.name class Meta: - ordering = ['-created_on'] + ordering = ["-created_on"] def get_complete_address(self): address = "" @@ -115,51 +116,54 @@ def created_on_arrow(self): @property def contact_values(self): - contacts = list(self.contacts.values_list('id', flat=True)) - return ','.join(str(contact) for contact in contacts) + contacts = list(self.contacts.values_list("id", flat=True)) + return ",".join(str(contact) for contact in contacts) @property def get_team_users(self): - team_user_ids = list(self.teams.values_list('users__id', flat=True)) + team_user_ids = list(self.teams.values_list("users__id", flat=True)) return User.objects.filter(id__in=team_user_ids) @property def get_team_and_assigned_users(self): - team_user_ids = list(self.teams.values_list('users__id', flat=True)) - assigned_user_ids = list(self.assigned_to.values_list('id', flat=True)) + team_user_ids = list(self.teams.values_list("users__id", flat=True)) + assigned_user_ids = list(self.assigned_to.values_list("id", flat=True)) user_ids = team_user_ids + assigned_user_ids return User.objects.filter(id__in=user_ids) @property def get_assigned_users_not_in_teams(self): - team_user_ids = list(self.teams.values_list('users__id', flat=True)) - assigned_user_ids = list(self.assigned_to.values_list('id', flat=True)) + team_user_ids = list(self.teams.values_list("users__id", flat=True)) + assigned_user_ids = list(self.assigned_to.values_list("id", flat=True)) user_ids = set(assigned_user_ids) - set(team_user_ids) return User.objects.filter(id__in=list(user_ids)) class Email(models.Model): from_account = models.ForeignKey( - Account, related_name='sent_email', on_delete=models.SET_NULL, null=True) - recipients = models.ManyToManyField(Contact, related_name='recieved_email') + Account, related_name="sent_email", on_delete=models.SET_NULL, null=True + ) + recipients = models.ManyToManyField(Contact, related_name="recieved_email") message_subject = models.TextField(null=True) message_body = models.TextField(null=True) - timezone = models.CharField(max_length=100, default='UTC') + timezone = models.CharField(max_length=100, default="UTC") scheduled_date_time = models.DateTimeField(null=True) scheduled_later = models.BooleanField(default=False) created_on = models.DateTimeField(auto_now_add=True) from_email = models.EmailField() rendered_message_body = models.TextField(null=True) - def __str__(self): return self.message_subject - class EmailLog(models.Model): """ this model is used to track if the email is sent or not """ - email = models.ForeignKey(Email, related_name='email_log', on_delete=models.SET_NULL, null=True) - contact = models.ForeignKey(Contact, related_name='contact_email_log', on_delete=models.SET_NULL, null=True) + email = models.ForeignKey( + Email, related_name="email_log", on_delete=models.SET_NULL, null=True + ) + contact = models.ForeignKey( + Contact, related_name="contact_email_log", on_delete=models.SET_NULL, null=True + ) is_sent = models.BooleanField(default=False) diff --git a/accounts/templates/view_account.html b/accounts/templates/view_account.html index e11ef1e57..48187538e 100644 --- a/accounts/templates/view_account.html +++ b/accounts/templates/view_account.html @@ -4,6 +4,7 @@ {% block breadcrumb %} {% block extralinks %} +