diff --git a/Dial-404/LICENSE b/Dial-404/LICENSE new file mode 100644 index 00000000..261eeb9e --- /dev/null +++ b/Dial-404/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/Dial-404/Models/fingermatchFinal.py b/Dial-404/Models/fingermatchFinal.py new file mode 100644 index 00000000..b7c435b7 --- /dev/null +++ b/Dial-404/Models/fingermatchFinal.py @@ -0,0 +1,87 @@ +import os +import cv2 +import tkinter as tk +from tkinter import filedialog + +def matcher(img1,img2): + #img1 = cv2.imread('ArrestpersonsRename/scan0040#_1f2e6adc-f0f1-4780-a950-d2efb44622e3259.jpg') + #cv2.imshow('Face1', img1) + #cv2.waitKey(0) + #cv2.destroyAllWindows() + #img2 = cv2.imread('ArrestpersonsRename/scan0040#_1f2e6adc-f0f1-4780-a950-d2efb44622e3259.jpg') + #cv2.imshow('Face2', img2) + #cv2.waitKey(0) + #cv2.destroyAllWindows() + +# Convert the images to grayscale + gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) + gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) + +# Create a SIFT object + sift = cv2.SIFT_create() + +# Detect the keypoints and descriptors in both images + keypoints1, descriptors1 = sift.detectAndCompute(gray1, None) + keypoints2, descriptors2 = sift.detectAndCompute(gray2, None) + +# Create a brute-force matcher + bf = cv2.BFMatcher() + +# Match the descriptors using knn matching + matches = bf.knnMatch(descriptors1, descriptors2, k=2) + +# Filter the matches using the Lowe's ratio test + good_matches = [] + for m, n in matches: + if m.distance < 0.75 * n.distance: + good_matches.append([m]) + + # Draw the matches on the images + result = cv2.drawMatchesKnn(img1, keypoints1, img2, keypoints2, good_matches, None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS) + + # Display the result + #cv2.imshow('Matched Faces', result) + #cv2.waitKey(0) + #cv2.destroyAllWindows() + + score = len(good_matches)/len(keypoints1) + + + #print("SCORE: ",score) + + return result,score + +def select_image(): + root = tk.Tk() + root.withdraw() + file_path = filedialog.askopenfilename() + return file_path + + + +def main(): + imgpath = select_image() + image1 = cv2.imread(imgpath) + cv2.imshow('Selected Image', image1) + cv2.waitKey(0) + cv2.destroyAllWindows() + photoPath = "/home/krishnatejaswis/VSCode/socofing/SOCOFing/Real" + for filename in os.listdir(photoPath): + if filename.endswith('.jpg') or filename.endswith('.jpeg') or filename.endswith('.png') or filename.endswith('.BMP'): + #print(filename) + image2 = cv2.imread(os.path.join(photoPath,filename)) + imgmatch,score = matcher(image1,image2) + if score>0.9: + # Display the result + cv2.imshow('Matched fingerprint', imgmatch) + cv2.waitKey(0) + cv2.destroyAllWindows() + score = round(score,4) + print("Match percentage is: ",score*100) + break + + + #print(imgpath,filename) + + +main() \ No newline at end of file diff --git a/Dial-404/Models/fuzzysearchTest.py b/Dial-404/Models/fuzzysearchTest.py new file mode 100644 index 00000000..8b6637b6 --- /dev/null +++ b/Dial-404/Models/fuzzysearchTest.py @@ -0,0 +1,39 @@ +import asyncio +import fuzzywuzzy +from fuzzywuzzy import fuzz +import psycopg2 + +async def fuzzy_name_search(names, query): + async def check_name(name): + return fuzz.token_sort_ratio(name, query) + + checks = [asyncio.ensure_future(check_name(name)) for name in names] + results = await asyncio.gather(*checks) + + return [names[i] for i, score in enumerate(results) if score >=70] + +async def main(): + names = [] + query = 'mohammad' + + + + conn = psycopg2.connect( + host="kspone.postgres.database.azure.com", + database="police", + user="mykspadmin", + password="PoliceHackathon123", + port='5432') + curr = conn.cursor() + curr.execute("SELECT person_name from icjs union select person_name from ksp where person_name is not null;") + names=curr.fetchall() + + names=[i[0] for i in names] + print(names) + result = await fuzzy_name_search(names, query) + print(result) + + + + +asyncio.run(main()) \ No newline at end of file diff --git a/Dial-404/Models/main.py b/Dial-404/Models/main.py new file mode 100644 index 00000000..01943b61 --- /dev/null +++ b/Dial-404/Models/main.py @@ -0,0 +1,24 @@ +from fastapi import FastAPI, HTTPException +import psycopg2 +import photomatchFinal, fuzzysearchTest, fingermatchFinal +app = FastAPI() + +def DNS(): + conn = psycopg2.connect( + host="kspone.postgres.database.azure.com", + database="police", + user="mykspadmin", + password="PoliceHackathon123", + port="5432") + return conn + +def query(stat:str): + conn = DNS() + cur = conn.cursor() + cur.execute(f"select person_name from icjs where state='{stat}';") + result = cur.fetchall() + cur.close() + conn.close() + return {'result': result} + +print(query('Karnataka')) \ No newline at end of file diff --git a/Dial-404/Models/photomatchFinal.py b/Dial-404/Models/photomatchFinal.py new file mode 100644 index 00000000..bf451742 --- /dev/null +++ b/Dial-404/Models/photomatchFinal.py @@ -0,0 +1,86 @@ +import os +import cv2 +import tkinter as tk +from tkinter import filedialog + +def matcher(img1,img2): + #img1 = cv2.imread('ArrestpersonsRename/scan0040#_1f2e6adc-f0f1-4780-a950-d2efb44622e3259.jpg') + #cv2.imshow('Face1', img1) + #cv2.waitKey(0) + #cv2.destroyAllWindows() + #img2 = cv2.imread('ArrestpersonsRename/scan0040#_1f2e6adc-f0f1-4780-a950-d2efb44622e3259.jpg') + #cv2.imshow('Face2', img2) + #cv2.waitKey(0) + #cv2.destroyAllWindows() + +# Convert the images to grayscale + gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) + gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) + +# Create a SIFT object + sift = cv2.SIFT_create() + +# Detect the keypoints and descriptors in both images + keypoints1, descriptors1 = sift.detectAndCompute(gray1, None) + keypoints2, descriptors2 = sift.detectAndCompute(gray2, None) + +# Create a brute-force matcher + bf = cv2.BFMatcher() + +# Match the descriptors using knn matching + matches = bf.knnMatch(descriptors1, descriptors2, k=2) + +# Filter the matches using the Lowe's ratio test + good_matches = [] + for m, n in matches: + if m.distance < 0.75 * n.distance: + good_matches.append([m]) + + # Draw the matches on the images + result = cv2.drawMatchesKnn(img1, keypoints1, img2, keypoints2, good_matches, None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS) + + # Display the result + #cv2.imshow('Matched Faces', result) + #cv2.waitKey(0) + #cv2.destroyAllWindows() + + score = len(good_matches)/len(keypoints1) + + + #print("SCORE: ",score) + + return result,score + +def select_image(): + root = tk.Tk() + root.withdraw() + file_path = filedialog.askopenfilename() + return file_path + + + +def main(): + imgpath = select_image() + image1 = cv2.imread(imgpath) + cv2.imshow('Selected Image', image1) + cv2.waitKey(0) + cv2.destroyAllWindows() + photoPath = "/home/krishnatejaswis/VSCode/ArrestpersonsRename" + for filename in os.listdir(photoPath): + if filename.endswith('.jpg') or filename.endswith('.jpeg') or filename.endswith('.png'): + #print(filename) + image2 = cv2.imread(os.path.join(photoPath,filename)) + imgmatch,score = matcher(image1,image2) + if score>0.9: + # Display the result + cv2.imshow('Matched Faces', imgmatch) + cv2.waitKey(0) + cv2.destroyAllWindows() + score = round(score,4) + print("Match percentage is: ",score*100) + break + + + #print(imgpath,filename) +main() + diff --git a/Dial-404/kspone/Basic_front/README.md b/Dial-404/kspone/Basic_front/README.md new file mode 100755 index 00000000..3bd2151c --- /dev/null +++ b/Dial-404/kspone/Basic_front/README.md @@ -0,0 +1,10 @@ + + # login + + Note: Please ensure you have installed node js + + To preview and run the project on your device: + 1) Open project folder in Visual Studio Code + 2) In the terminal, run `npm install` + 3) Run `npm start` to view project in browser + \ No newline at end of file diff --git a/Dial-404/kspone/Basic_front/global.css b/Dial-404/kspone/Basic_front/global.css new file mode 100755 index 00000000..21ed7445 --- /dev/null +++ b/Dial-404/kspone/Basic_front/global.css @@ -0,0 +1,12 @@ +:root { + /* fonts */ + --font-inter: Inter; + + /* font sizes */ + --font-size-base: 16px; + + /* Colors */ + --color-white: #fff; + --color-black: #000; + --color-gainsboro: #e9e7e7; +} diff --git a/Dial-404/kspone/Basic_front/index.css b/Dial-404/kspone/Basic_front/index.css new file mode 100755 index 00000000..6143cb97 --- /dev/null +++ b/Dial-404/kspone/Basic_front/index.css @@ -0,0 +1,127 @@ +body { + margin: 0; + line-height: normal; + align-items: center; + +} +.desktop-1-child { + position: absolute; + top: 200px; + left: 400px; + background-color: #f7f3f3; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.25); + width: 650px; + height: 600px; + display: block; +} +.desktop-1-inner, +.desktop-1-item { + border: 0; + background-color: var(--color-gainsboro); + position: absolute; + top: 401px; + left: 484px; + border-radius: 7px; + width: 498px; + height: 51px; + opacity: 0.8; + text-indent: 20px; +} +.desktop-1-inner { + top: 541px; + left: 480px; + border-radius: 6px; + width: 502px; + height: 53px; +} +.password, +.user { + cursor: pointer; + position: absolute; + top: 361px; + left: 480px; + font-weight: 600; + display: inline-block; + width: 51px; + height: 26px; +} +.password { + top: 500px; + width: 103px; +} +.rectangle-button { + cursor: auto; + border: 0; + padding: 0; + background-color: #938dbb; + position: absolute; + top: 637px; + left: 480px; + border-radius: 4px; + width: 502px; + height: 61px; + font-size: larger; + font-weight: bolder; + color: white; +} +.rectangle-button:hover { + background-color: rgba(134, 118, 184, 0.69); +} +.rectangle-button:active { + background-color: var(--color-white); +} +.group-child, +.kspone { + position: absolute; + display: inline-block; +} +.group-child { + top: 0; + left: 0; + width: 90px; + height: 85px; + object-fit: cover; +} +.kspone { + margin: 0; + top: 25px; + left: calc(50% - 9px); + font-size: inherit; + font-weight: 700; + font-family: inherit; + width: 138px; + height: 40px; +} +.help, +.rectangle-parent { + position: absolute; + top: 245px; + left: 562px; + width: 258px; + height: 85px; + font-size: 32px; +} +.help { + text-decoration: none; + top: 747px; + left: 952px; + font-size: 12px; + color: #2c63ef; + display: inline-block; + width: 60px; + height: 26px; +} +.help:hover { + color: rgba(43, 99, 240, 0.67); +} +.desktop-1 { + position: relative; + background-color: var(--color-white); + width: 100%; + height: 1024px; + overflow: hidden; + text-align: left; + font-size: var(--font-size-base); + color: var(--color-black); + font-family: var(--font-inter); +} diff --git a/Dial-404/kspone/Basic_front/index.html b/Dial-404/kspone/Basic_front/index.html new file mode 100755 index 00000000..b3a69f11 --- /dev/null +++ b/Dial-404/kspone/Basic_front/index.html @@ -0,0 +1,44 @@ + + + + + + + + + + + + +
+
+ +
+ +

KSPONE

+
+ Help? +
+ + diff --git a/Dial-404/kspone/Basic_front/package.json b/Dial-404/kspone/Basic_front/package.json new file mode 100755 index 00000000..6b40f9bf --- /dev/null +++ b/Dial-404/kspone/Basic_front/package.json @@ -0,0 +1,15 @@ +{ + "name": "login", + "version": "1.0.0", + "description": "", + "scripts": { + "start": "parcel ./*.html", + "build": "parcel build ./*.html --dist-dir ./build" + }, + "author": "", + "license": "ISC", + "devDependencies": { + "parcel": "^2.7.0" + } + } + \ No newline at end of file diff --git a/Dial-404/kspone/Basic_front/rectangle-5@2x.png b/Dial-404/kspone/Basic_front/rectangle-5@2x.png new file mode 100755 index 00000000..a79f880f Binary files /dev/null and b/Dial-404/kspone/Basic_front/rectangle-5@2x.png differ diff --git a/Dial-404/kspone/HTML/fingerprint.html b/Dial-404/kspone/HTML/fingerprint.html new file mode 100755 index 00000000..e3fd8c64 --- /dev/null +++ b/Dial-404/kspone/HTML/fingerprint.html @@ -0,0 +1,5 @@ +{% extends 'navbar.html' %} +{% block content%} +

FingerPrint

+
+{% endblock %} \ No newline at end of file diff --git a/Dial-404/kspone/HTML/home.html b/Dial-404/kspone/HTML/home.html new file mode 100755 index 00000000..4e903715 --- /dev/null +++ b/Dial-404/kspone/HTML/home.html @@ -0,0 +1,86 @@ + + + + + + + + + + + +
+ +
+
+

Search

+

To Search criminals in database

+
+ +
+

FingerPrint

+

To match the criminal with fingerprint analysis

+
+
+

Userguide

+

How to use the website

+
+
+ Logout +
+ +   + + \ No newline at end of file diff --git a/Dial-404/kspone/HTML/loginhelp.html b/Dial-404/kspone/HTML/loginhelp.html new file mode 100755 index 00000000..4761fcf1 --- /dev/null +++ b/Dial-404/kspone/HTML/loginhelp.html @@ -0,0 +1,19 @@ + + + + + + + Help + + + +

Contact your administrator for valid login details

+ Back + + + \ No newline at end of file diff --git a/Dial-404/kspone/HTML/loginpage.html b/Dial-404/kspone/HTML/loginpage.html new file mode 100755 index 00000000..20414b67 --- /dev/null +++ b/Dial-404/kspone/HTML/loginpage.html @@ -0,0 +1,68 @@ + + + + {% csrf_token %} + {% load static %} + + + + Login + + +
+
+
+
+
+
+ + KSPONE +
+
+
+ {% csrf_token %} +
+ + +
+
+ + +
+ + +
+ {%if messages%} + {% for message in messages %} + +{% endfor %} +{%endif%} +
+ +
+
+
+
+
+ \ No newline at end of file diff --git a/Dial-404/kspone/HTML/navbar.html b/Dial-404/kspone/HTML/navbar.html new file mode 100755 index 00000000..f9d46935 --- /dev/null +++ b/Dial-404/kspone/HTML/navbar.html @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + {% block content%} + + {% endblock %} + + \ No newline at end of file diff --git a/Dial-404/kspone/HTML/pdf.html b/Dial-404/kspone/HTML/pdf.html new file mode 100644 index 00000000..a49112fb --- /dev/null +++ b/Dial-404/kspone/HTML/pdf.html @@ -0,0 +1,51 @@ + + + + + + Search report + + +
+ + + +
+
+

Search results

+
+ + + + + + + + + + + {% if result %} + {%for name in result%} + + + + + + {%endfor%} + {%endif%} + + +
IDNameEmail
{{ name }}
+
+
+
+ + +
+ + + \ No newline at end of file diff --git a/Dial-404/kspone/HTML/search.html b/Dial-404/kspone/HTML/search.html new file mode 100755 index 00000000..3632d70c --- /dev/null +++ b/Dial-404/kspone/HTML/search.html @@ -0,0 +1,116 @@ + + + + + + + + Filter Search + + + +
+

Filter Search

+
+ {% csrf_token %} +
+ + +
+
+
+ +
+ + + + +
+
+ + + +
+ +
+ + + +
+
+ + + +
+
+
+{# #} + + +
+
+

Scrollable Table

+
+ + + + + + + + + {% if result %} + {%for name in result%} + + + + + + {%endfor%} + {%endif%} + + + + +
Name
{{ name }}
+
+
+
+ + + +
+ View Invoice +
+ + + + \ No newline at end of file diff --git a/Dial-404/kspone/HTML/userguide.html b/Dial-404/kspone/HTML/userguide.html new file mode 100755 index 00000000..17288625 --- /dev/null +++ b/Dial-404/kspone/HTML/userguide.html @@ -0,0 +1,5 @@ +{% extends 'navbar.html' %} +{% block content%} +

USER MANUAL

+
+{% endblock %} \ No newline at end of file diff --git a/Dial-404/kspone/base/__init__.py b/Dial-404/kspone/base/__init__.py new file mode 100755 index 00000000..e69de29b diff --git a/Dial-404/kspone/base/__pycache__/__init__.cpython-310.pyc b/Dial-404/kspone/base/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 00000000..10ae91a1 Binary files /dev/null and b/Dial-404/kspone/base/__pycache__/__init__.cpython-310.pyc differ diff --git a/Dial-404/kspone/base/__pycache__/admin.cpython-310.pyc b/Dial-404/kspone/base/__pycache__/admin.cpython-310.pyc new file mode 100644 index 00000000..1fe09a6a Binary files /dev/null and b/Dial-404/kspone/base/__pycache__/admin.cpython-310.pyc differ diff --git a/Dial-404/kspone/base/__pycache__/apps.cpython-310.pyc b/Dial-404/kspone/base/__pycache__/apps.cpython-310.pyc new file mode 100644 index 00000000..3d02fee9 Binary files /dev/null and b/Dial-404/kspone/base/__pycache__/apps.cpython-310.pyc differ diff --git a/Dial-404/kspone/base/__pycache__/models.cpython-310.pyc b/Dial-404/kspone/base/__pycache__/models.cpython-310.pyc new file mode 100644 index 00000000..b75f4b90 Binary files /dev/null and b/Dial-404/kspone/base/__pycache__/models.cpython-310.pyc differ diff --git a/Dial-404/kspone/base/__pycache__/pdf.cpython-310.pyc b/Dial-404/kspone/base/__pycache__/pdf.cpython-310.pyc new file mode 100644 index 00000000..ed0f6a06 Binary files /dev/null and b/Dial-404/kspone/base/__pycache__/pdf.cpython-310.pyc differ diff --git a/Dial-404/kspone/base/__pycache__/urls.cpython-310.pyc b/Dial-404/kspone/base/__pycache__/urls.cpython-310.pyc new file mode 100644 index 00000000..6acba123 Binary files /dev/null and b/Dial-404/kspone/base/__pycache__/urls.cpython-310.pyc differ diff --git a/Dial-404/kspone/base/__pycache__/views.cpython-310.pyc b/Dial-404/kspone/base/__pycache__/views.cpython-310.pyc new file mode 100644 index 00000000..a3e50613 Binary files /dev/null and b/Dial-404/kspone/base/__pycache__/views.cpython-310.pyc differ diff --git a/Dial-404/kspone/base/admin.py b/Dial-404/kspone/base/admin.py new file mode 100755 index 00000000..ea5d68b7 --- /dev/null +++ b/Dial-404/kspone/base/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/Dial-404/kspone/base/apps.py b/Dial-404/kspone/base/apps.py new file mode 100755 index 00000000..60c0149b --- /dev/null +++ b/Dial-404/kspone/base/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class BaseConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'base' diff --git a/Dial-404/kspone/base/migrations/0001_initial.py b/Dial-404/kspone/base/migrations/0001_initial.py new file mode 100644 index 00000000..d48ded90 --- /dev/null +++ b/Dial-404/kspone/base/migrations/0001_initial.py @@ -0,0 +1,21 @@ +# Generated by Django 4.1.6 on 2023-02-05 04:21 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Person', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=100)), + ], + ), + ] diff --git a/Dial-404/kspone/base/migrations/__init__.py b/Dial-404/kspone/base/migrations/__init__.py new file mode 100755 index 00000000..e69de29b diff --git a/Dial-404/kspone/base/migrations/__pycache__/0001_initial.cpython-310.pyc b/Dial-404/kspone/base/migrations/__pycache__/0001_initial.cpython-310.pyc new file mode 100644 index 00000000..381e1957 Binary files /dev/null and b/Dial-404/kspone/base/migrations/__pycache__/0001_initial.cpython-310.pyc differ diff --git a/Dial-404/kspone/base/migrations/__pycache__/__init__.cpython-310.pyc b/Dial-404/kspone/base/migrations/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 00000000..4773a289 Binary files /dev/null and b/Dial-404/kspone/base/migrations/__pycache__/__init__.cpython-310.pyc differ diff --git a/Dial-404/kspone/base/models.py b/Dial-404/kspone/base/models.py new file mode 100755 index 00000000..fcca48c7 --- /dev/null +++ b/Dial-404/kspone/base/models.py @@ -0,0 +1,7 @@ +from django.db import models + +# Create your models here. +class Person(models.Model): + name = models.CharField(max_length=100) +class Meta: + bd_table='Police' \ No newline at end of file diff --git a/Dial-404/kspone/base/pdf.py b/Dial-404/kspone/base/pdf.py new file mode 100644 index 00000000..78233edc --- /dev/null +++ b/Dial-404/kspone/base/pdf.py @@ -0,0 +1,14 @@ +from io import BytesIO +from xhtml2pdf import pisa +from django.views import View +from django.template.loader import get_template +from django.shortcuts import render, redirect, HttpResponse + +def html2pdf(template_source, context_dict={}): + template = get_template(template_source) + html = template.render(context_dict) + result = BytesIO() + pf = pisa.pisaDocument(BytesIO(html.encode("cp1252")), result) + if not pdf.err: + return HttpResponse(result.getvalue(), content_type="application/pdf") + return None \ No newline at end of file diff --git a/Dial-404/kspone/base/tests.py b/Dial-404/kspone/base/tests.py new file mode 100755 index 00000000..de8bdc00 --- /dev/null +++ b/Dial-404/kspone/base/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/Dial-404/kspone/base/urls.py b/Dial-404/kspone/base/urls.py new file mode 100755 index 00000000..d6be8a56 --- /dev/null +++ b/Dial-404/kspone/base/urls.py @@ -0,0 +1,14 @@ +from django.urls import path +from . import views + +urlpatterns =[ + + path('login/login', views.loginpage, name="login"), + path('help/', views.loginhelp, name="help"), + path('', views.home, name="home"), + path('search/', views.search, name="search"), + path('fingerprint/', views.fingerprint, name="fingerprint"), + path('userguide/', views.userguide, name="userguide"), + path("logout/", views.logoutuser, name = "logout"), + path('pdf/', views.pdf, name="pdf"), +] \ No newline at end of file diff --git a/Dial-404/kspone/base/views.py b/Dial-404/kspone/base/views.py new file mode 100755 index 00000000..b0682fde --- /dev/null +++ b/Dial-404/kspone/base/views.py @@ -0,0 +1,95 @@ +from django.shortcuts import render, redirect, HttpResponse +from django.contrib.auth import authenticate, login, logout +from django.contrib import messages +from django.contrib.auth.decorators import login_required +from .pdf import html2pdf +from .models import Person +from django.db import connection, reset_queries +import psycopg2 +from django.shortcuts import render +import asyncio +import fuzzywuzzy +from fuzzywuzzy import fuzz +import psycopg2 +from .models import Person +from django.db import connection + +# Create your views here. +def loginpage(request): + if request.user.is_authenticated: + return redirect('home') + if(request.method == 'POST'): + username = request.POST.get('username') + password = request.POST.get('password') + + user = authenticate(request, username=username, password=password) + if user is not None: + login(request, user) + return redirect("home") + else: + messages.error(request, "Username or password error") + context = {} + return render(request, 'loginpage.html', context) +def logoutuser(request): + logout(request) + return redirect("login") +def loginhelp(request): + + context = {} + return render(request, 'loginhelp.html', context) + +@login_required(login_url='login/login') +def home(request): + context = {} + return render(request, 'home.html', context) +def search(request): + context = {} + return render(request, 'search.html', context) +def fingerprint(request): + context = {} + return render(request, 'fingerprint.html', context) +def userguide(request): + context = {} + return render(request, 'userguide.html', context) + + + +async def fuzzy_name_search(names, query): + async def check_name(name): + return fuzz.token_sort_ratio(name, query) + + checks = [asyncio.ensure_future(check_name(name)) for name in names] + results = await asyncio.gather(*checks) + + return [names[i] for i, score in enumerate(results) if score >= 72] + +def search(request): + if request.method == 'POST': + query = request.POST['query'] + + names = [] + + # conn = psycopg2.connect( + # host="kspone.postgres.database.azure.com", + # database="police", + # user="mykspadmin", + # password="PoliceHackathon123", + # port='5432') + with connection.cursor() as curr: + curr.execute("SELECT person_name from icjs union select person_name from ksp where person_name is not null;") + names=curr.fetchall() + + names=[i[0] for i in names] + + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + + result = loop.run_until_complete(fuzzy_name_search(names, query)) + return render(request, 'search.html', {'result': result}) + + return render(request, 'search.html') + + +def pdf(request): + pdf = html2pdf("search.html") + return HttpResponse(pdf, content_type="application/pdf") \ No newline at end of file diff --git a/Dial-404/kspone/db.sqlite3 b/Dial-404/kspone/db.sqlite3 new file mode 100755 index 00000000..9de23545 Binary files /dev/null and b/Dial-404/kspone/db.sqlite3 differ diff --git a/Dial-404/kspone/kspone/__init__.py b/Dial-404/kspone/kspone/__init__.py new file mode 100755 index 00000000..e69de29b diff --git a/Dial-404/kspone/kspone/__pycache__/__init__.cpython-310.pyc b/Dial-404/kspone/kspone/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 00000000..3f3aa60a Binary files /dev/null and b/Dial-404/kspone/kspone/__pycache__/__init__.cpython-310.pyc differ diff --git a/Dial-404/kspone/kspone/__pycache__/settings.cpython-310.pyc b/Dial-404/kspone/kspone/__pycache__/settings.cpython-310.pyc new file mode 100644 index 00000000..0804c78c Binary files /dev/null and b/Dial-404/kspone/kspone/__pycache__/settings.cpython-310.pyc differ diff --git a/Dial-404/kspone/kspone/__pycache__/urls.cpython-310.pyc b/Dial-404/kspone/kspone/__pycache__/urls.cpython-310.pyc new file mode 100644 index 00000000..e618eee4 Binary files /dev/null and b/Dial-404/kspone/kspone/__pycache__/urls.cpython-310.pyc differ diff --git a/Dial-404/kspone/kspone/__pycache__/wsgi.cpython-310.pyc b/Dial-404/kspone/kspone/__pycache__/wsgi.cpython-310.pyc new file mode 100644 index 00000000..82020435 Binary files /dev/null and b/Dial-404/kspone/kspone/__pycache__/wsgi.cpython-310.pyc differ diff --git a/Dial-404/kspone/kspone/asgi.py b/Dial-404/kspone/kspone/asgi.py new file mode 100755 index 00000000..b941deb9 --- /dev/null +++ b/Dial-404/kspone/kspone/asgi.py @@ -0,0 +1,16 @@ +""" +ASGI config for kspone project. + +It exposes the ASGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/4.1/howto/deployment/asgi/ +""" + +import os + +from django.core.asgi import get_asgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'kspone.settings') + +application = get_asgi_application() diff --git a/Dial-404/kspone/kspone/settings.py b/Dial-404/kspone/kspone/settings.py new file mode 100755 index 00000000..dc246acb --- /dev/null +++ b/Dial-404/kspone/kspone/settings.py @@ -0,0 +1,136 @@ +""" +Django settings for kspone project. + +Generated by 'django-admin startproject' using Django 4.1.5. + +For more information on this file, see +https://docs.djangoproject.com/en/4.1/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/4.1/ref/settings/ +""" + + +from pathlib import Path + +# Build paths inside the project like this: BASE_DIR / 'subdir'. +BASE_DIR = Path(__file__).resolve().parent.parent + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/4.1/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = 'django-insecure-z&kuim%(t3=8c$4i#%h*d=^y#=ct(kz1ddzbgza@6*m70**r$v' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'base.apps.BaseConfig' + +] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'kspone.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [ + BASE_DIR / 'HTML' + ], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'kspone.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/4.1/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.postgresql', + 'NAME': 'police', + 'USER': 'mykspadmin', + 'PASSWORD': 'PoliceHackathon123', + 'HOST': 'kspone.postgres.database.azure.com', + 'PORT': '5432', + } +} + + +# Password validation +# https://docs.djangoproject.com/en/4.1/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/4.1/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/4.1/howto/static-files/ + +STATIC_URL = 'static/' + +STATICFILES_DIRS = [ + BASE_DIR / 'static' +] + +# Default primary key field type +# https://docs.djangoproject.com/en/4.1/ref/settings/#default-auto-field + +DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' diff --git a/Dial-404/kspone/kspone/urls.py b/Dial-404/kspone/kspone/urls.py new file mode 100755 index 00000000..737b00a9 --- /dev/null +++ b/Dial-404/kspone/kspone/urls.py @@ -0,0 +1,24 @@ +"""kspone URL Configuration + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/4.1/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" +from django.contrib import admin +from django.urls import path, include + + +urlpatterns = [ + path('admin/', admin.site.urls), + path('', include("base.urls") ) + +] diff --git a/Dial-404/kspone/kspone/wsgi.py b/Dial-404/kspone/kspone/wsgi.py new file mode 100755 index 00000000..8e91cc54 --- /dev/null +++ b/Dial-404/kspone/kspone/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for kspone project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/4.1/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'kspone.settings') + +application = get_wsgi_application() diff --git a/Dial-404/kspone/manage.py b/Dial-404/kspone/manage.py new file mode 100755 index 00000000..14bb0ea1 --- /dev/null +++ b/Dial-404/kspone/manage.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + + +def main(): + """Run administrative tasks.""" + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'kspone.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) + + +if __name__ == '__main__': + main() diff --git a/Dial-404/kspone/requirements.txt b/Dial-404/kspone/requirements.txt new file mode 100755 index 00000000..b2a09241 --- /dev/null +++ b/Dial-404/kspone/requirements.txt @@ -0,0 +1 @@ +Django==4.1.5 diff --git a/Dial-404/kspone/static/images/rectangle-5@2x.png b/Dial-404/kspone/static/images/rectangle-5@2x.png new file mode 100755 index 00000000..a79f880f Binary files /dev/null and b/Dial-404/kspone/static/images/rectangle-5@2x.png differ diff --git a/Dial-404/kspone/static/rectangle-5@2x.jpg b/Dial-404/kspone/static/rectangle-5@2x.jpg new file mode 100755 index 00000000..1fd36783 Binary files /dev/null and b/Dial-404/kspone/static/rectangle-5@2x.jpg differ diff --git a/Dial-404/kspone/static/rectangle-5@2x.png b/Dial-404/kspone/static/rectangle-5@2x.png new file mode 100755 index 00000000..a79f880f Binary files /dev/null and b/Dial-404/kspone/static/rectangle-5@2x.png differ diff --git a/Dial-404/kspone/static/styles/global.css b/Dial-404/kspone/static/styles/global.css new file mode 100755 index 00000000..21ed7445 --- /dev/null +++ b/Dial-404/kspone/static/styles/global.css @@ -0,0 +1,12 @@ +:root { + /* fonts */ + --font-inter: Inter; + + /* font sizes */ + --font-size-base: 16px; + + /* Colors */ + --color-white: #fff; + --color-black: #000; + --color-gainsboro: #e9e7e7; +} diff --git a/Dial-404/kspone/static/styles/index.css b/Dial-404/kspone/static/styles/index.css new file mode 100755 index 00000000..d257fc47 --- /dev/null +++ b/Dial-404/kspone/static/styles/index.css @@ -0,0 +1,129 @@ +body { + margin: 0; + line-height: normal; + align-items: center; + justify-content: center; + +} +.desktop-1-child { + position: absolute; + top: 200px; + left: 400px; + background-color: #f7f3f3; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.25); + width: 650px; + height: 600px; + display: block; +} +.desktop-1-inner, +.desktop-1-item { + border: 0; + background-color: var(--color-gainsboro); + position: absolute; + top: 401px; + left: 484px; + border-radius: 7px; + width: 498px; + height: 51px; + opacity: 0.8; + text-indent: 20px; +} +.desktop-1-inner { + top: 541px; + left: 480px; + border-radius: 6px; + width: 502px; + height: 53px; +} +.password, +.user { + cursor: pointer; + position: absolute; + top: 361px; + left: 480px; + font-weight: 600; + display: inline-block; + width: 51px; + height: 26px; +} +.password { + top: 500px; + width: 103px; +} +.rectangle-button { + cursor: auto; + border: 0; + padding: 0; + background-color: #938dbb; + position: absolute; + top: 637px; + left: 480px; + border-radius: 4px; + width: 502px; + height: 61px; + font-size: larger; + font-weight: bolder; + color: white; +} +.rectangle-button:hover { + background-color: rgba(134, 118, 184, 0.69); +} +.rectangle-button:active { + background-color: var(--color-white); +} +.group-child, +.kspone { + position: absolute; + display: inline-block; +} +.group-child { + top: 0; + left: 0; + width: 90px; + height: 85px; + object-fit: cover; +} +.kspone { + margin: 0; + top: 25px; + left: calc(50% - 9px); + font-size: inherit; + font-weight: 700; + font-family: inherit; + width: 138px; + height: 40px; +} +.help, +.rectangle-parent { + position: absolute; + top: 245px; + left: 562px; + width: 258px; + height: 85px; + font-size: 32px; +} +.help { + text-decoration: none; + top: 747px; + left: 952px; + font-size: 12px; + color: #2c63ef; + display: inline-block; + width: 60px; + height: 26px; +} + +.help:hover { + color: rgba(43, 99, 240, 0.67); +} +.desktop-1 { + position: relative; + background-color: var(--color-white); + width: 100%; + height: 1024px; + overflow: hidden; + text-align: left; + font-size: var(--font-size-base); + color: var(--color-black); + font-family: var(--font-inter); +} diff --git a/Dial-404/kspone/templates/README.md b/Dial-404/kspone/templates/README.md new file mode 100755 index 00000000..b1edf156 --- /dev/null +++ b/Dial-404/kspone/templates/README.md @@ -0,0 +1,10 @@ + + # login + + Note: Please ensure you have installed node js + + To preview and run the project on your device: + 1) Open project folder in Visual Studio Code + 2) In the terminal, run `npm install` + 3) Run `npm start` to view project in browser + \ No newline at end of file diff --git a/Dial-404/kspone/templates/index.html b/Dial-404/kspone/templates/index.html new file mode 100755 index 00000000..6dbe4fe0 --- /dev/null +++ b/Dial-404/kspone/templates/index.html @@ -0,0 +1,45 @@ + +{% load static %} + + + + + + + + + + + +
+
+ +
+ +

KSPONE

+
+ Help? +
+ + diff --git a/Dial-404/kspone/templates/package.json b/Dial-404/kspone/templates/package.json new file mode 100755 index 00000000..6f9438d3 --- /dev/null +++ b/Dial-404/kspone/templates/package.json @@ -0,0 +1,15 @@ +{ + "name": "login", + "version": "1.0.0", + "description": "", + "scripts": { + "start": "parcel ./*.html", + "build": "parcel build ./*.html --dist-dir ./build" + }, + "author": "", + "license": "ISC", + "devDependencies": { + "parcel": "^2.7.0" + } + } + \ No newline at end of file diff --git a/README.md b/README.md index 578bb9cc..81633960 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ -# ksp-submission -This repository is created for Karnataka State Police Hackathon 2023 - submission collection. -## Team Information -### Team Name - -### Problem Statement - +# Dial-404Again + +_Team name -> DIAL 404_ + +_Unification of Databases_ + +Note - We have built all the components but we were unable to integrate the components