From 00fab55ca3fc0654f5403963fed44779d0ed0bd2 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Sun, 22 Mar 2026 22:04:10 +0000 Subject: [PATCH] RIPLEY --- core/__pycache__/admin.cpython-311.pyc | Bin 212 -> 1115 bytes core/__pycache__/models.cpython-311.pyc | Bin 209 -> 2288 bytes core/admin.py | 12 +++++- core/migrations/0001_initial.py | 40 ++++++++++++++++++ .../__pycache__/0001_initial.cpython-311.pyc | Bin 0 -> 2258 bytes core/models.py | 29 ++++++++++++- core/services/ingestion.py | 30 +++++++++++++ core/services/resolution.py | 24 +++++++++++ 8 files changed, 133 insertions(+), 2 deletions(-) create mode 100644 core/migrations/0001_initial.py create mode 100644 core/migrations/__pycache__/0001_initial.cpython-311.pyc create mode 100644 core/services/ingestion.py create mode 100644 core/services/resolution.py diff --git a/core/__pycache__/admin.cpython-311.pyc b/core/__pycache__/admin.cpython-311.pyc index 5e8987a0cd478c226e501b5189550e758662c560..5ed0a0d66f073fd61031ec8756379c7d48d2a96c 100644 GIT binary patch literal 1115 zcma)4Jx|;~5Z(0`zB>*s#pDj z(D4t5BK|sQYyMbP*G*Z#)J!3WbJ*P-I;lwdAnbl%{qax-TNMVqlEm% zMK!Ez3&; zui`Ao2L4SUU{q~fJb=Xk5yYjOxEiOf&NbKII?x)bQ8K(lRv;UV=9|5^fIREj7160L$qfZ`;dF#wP!XA(v0yS?T6k#HB;e9e~0w~5%Tmaxxo6a zo_2SVNObe9JkIj2_$>T9OJw&`BHyQd&lg=kk)m7lxz-;@8*&OTz(|(?hBwdYeP{S~ z)Lt2`<0J1?q0@zU2<~Y@xF$D13{y2q8A~x>DGF6tHs}jwe)Pf|luk>&r9S}1I;C_(9v@G>BeHrt?LDRQ!^OSMzV(YP zozSJRrqRxr+=cxoCkw0R=(t2U*NL`#6K@l(HOZpWM`Lmqu35lwiQc~~6QPCfe*nCV B{?%JijQrxF9h(RX;huC{-V9lwLvQFAkgB{FKt1RJ$S$pl(JWE|vunAD9^# P8E-HsT)>8k*nlbkB)c`? diff --git a/core/__pycache__/models.cpython-311.pyc b/core/__pycache__/models.cpython-311.pyc index a251b5fb7c2b603c587f8162d643eb10596d2858..0a846fcabad4a30b77111596b1be7eaac49296ca 100644 GIT binary patch literal 2288 zcmaJ?J#5=X6h2ZUMeE15B-d`@)Ckh1uz*5tQ@b#lw1JVxhMQP5VmE+=q6DqG*i5Mkcbu#79S!UBSKZ|Zg?I; z=oLIsE5|~V1St7`P!d*FP(J>eZ^{cyso9vAPNj25*nwkVJA44$6GTv1z^E*Wh{UR0 z9XN-@{n&GG=GC!7WjVwso&DhQzVuuG1UykI$3ukLodZJdLkwW$Au1_bk_&B0Ho42I$m%o8EP{ z^a`1(*py5~K`d<5SzOZ`mulMXVB~nAGv_yU_`7eQ)==(I-B;f~U7>9CZ_3dzDjo7aL$sLI2CGaxrS}A^mW}Ot457P zxGdUY1XB*dB z*$a<94zd?sjQH6?Gg}Ce5Q>~i^u_PyC?IG zOJEqHf0B7v;K@y-YF7`LMPjG2PwB%*Sl(CqGL+|^R6Wi=G61u%B*7JgIZCZ%fb<>ev>n$i=0(#hcL8bi;(X`rS(LR%vdj2qTA3o=LDOE-vpT7MIV@ zVN8kRydDA1^CFEy$KsVu+o%wS@)Cw}i&j;HMhP+n7pl<9$|_T(ncvS(;OU1`6cOlAXsjj&~@7(QORwY9@R}Y6fueB z+8e~(B$SSG{Be;mi5sN_SUdxd!^MB9WMa}+$6IHw><#f>v~30;J^aJVi$8}Sf#~I* zr$DB_N8K=>r|2hsWwEp?et8~V!l$rNO9i`6g%?GJ-FJcGSPhD=NE(fX0 zjbbZ3v3EO2PyD!jF#7AnA5}lS)=aMj>9xjuYi#oIb}%-1kn_i8nqxD;*o-fYypz_t zi!WS1Gu_Ng2bpQkb)x)L8=V$!_}beOg(}FOb586RQR47RL)x+dT-B`&yMWgt?w6PN zhdQF`FfhF-dZb>7z8qiEt8fC(C8rLe9TNnhh0giC|F)zEK+LDb-t9-av7r-85vTTf*CZK zUxE~9GTvg#%}+_qDfZK3y2Y82m6(^Fua}Zk#0->N$?zGZX7WZx1JPd`Hb8ZyIjMF< Z96&KfATE}joX;V}eStv+h>F;NA^_W*AK(B0 diff --git a/core/admin.py b/core/admin.py index 8c38f3f..b540860 100644 --- a/core/admin.py +++ b/core/admin.py @@ -1,3 +1,13 @@ from django.contrib import admin +from .models import Source, Entity -# Register your models here. +@admin.register(Source) +class SourceAdmin(admin.ModelAdmin): + list_display = ('name', 'created_at') + search_fields = ('name',) + +@admin.register(Entity) +class EntityAdmin(admin.ModelAdmin): + list_display = ('entity_type', 'value', 'source', 'confidence_score', 'created_at') + list_filter = ('entity_type', 'source', 'created_at') + search_fields = ('value',) \ No newline at end of file diff --git a/core/migrations/0001_initial.py b/core/migrations/0001_initial.py new file mode 100644 index 0000000..5380c8b --- /dev/null +++ b/core/migrations/0001_initial.py @@ -0,0 +1,40 @@ +# Generated by Django 5.2.7 on 2026-03-22 21:58 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Source', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=255, unique=True)), + ('description', models.TextField(blank=True)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ], + ), + migrations.CreateModel( + name='Entity', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('entity_type', models.CharField(choices=[('PERSON', 'Person'), ('EMAIL', 'Email'), ('USERNAME', 'Username'), ('IP', 'IP Address')], max_length=20)), + ('value', models.CharField(db_index=True, max_length=255)), + ('confidence_score', models.FloatField(default=1.0)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('updated_at', models.DateTimeField(auto_now=True)), + ('source', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='entities', to='core.source')), + ], + options={ + 'verbose_name_plural': 'Entities', + 'unique_together': {('entity_type', 'value', 'source')}, + }, + ), + ] diff --git a/core/migrations/__pycache__/0001_initial.cpython-311.pyc b/core/migrations/__pycache__/0001_initial.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9525e9c30f5b384ebc35f5008c6c1ac0391d111f GIT binary patch literal 2258 zcmb7FJ#5=X6h2ZC^=n&l>?l%xBqw$e8G+?CfCCgx16#5Tr?G3qZc%6>^SjugN_xG6xUYz*uvOZ$$rTsujD=19J~d-v|W@BQ5I z_kn>Jf_6k+sZ9x?H+<4>p_9Q;83w-~jIf}gssO#HiOoPY&M-jtf4~aEuXFwL>6nRb*fmZp_@!<8klHi?L^k=k|&d+8Ijv2p53a5 zg=(OVszDKvPy_J#4U0GcoNyy@$`P=DgE-WY4uXIKKEG{>IP6JA`y3p>LMM6vR$jn& zDi!mjyx4Fa$ixo>kb%!{pefj6DzV}0n<0E8&6~fDeRia@y4hy=aTDvSxyk53;Tci*KYtrh%!?o{LpeNJ>i8q6c# zuPr=WnOk0f5jeo10#{sGeHvR@&Cg*>iD|wa@xg~{TZURACgo9Qp>0KLbLj})kX0R% z9iN}98TzJ*iC!bJSu-f9gETbv9{3T)WK(Ht7K^o8mnK*@Xa$8oCUJpI8uQN;FT07iZBjSj3A2>?#E4C9p}ab8-_1;Jk1)Epkh1Q$=G# zeiCHMs1s|8P}s<0OD_UpVZ%#`xl*{mBC?lGS!OX=hWn?j5f~?A`Egs(H~^T1Rb929 z2v`D>7J-oHHNZmorN-hVuWFY0%|-e3!V>dpeGclW!n4Str7eY?4A;qyps3(G2BeDOQ2FsCE5YC_V`{6uoXR5pO^`cyyqaShzH|R+=j>u$a*zCwJ!`=m>11 z_xFlhMw1lV8*SZc7s(E(0TNn#V$ersOR13}k9zUnJGVGJJ^dx5+4FCzwM+S3>Jfez z%{Oq(?VUca2Z#3--Jmcc?LBZKD4P2@=0vXbQkmDOQ9C{PY}-jsz6|~~ZdYYnr*_)x zrcEbp+DWUIO52&j{zWHKI9z)*VrMGdOvTAm?BrrEbX`Uas4@`EG9B$<5oz5(L%0d~1KkxqRzz`_EnH&Z2W?)w%PdU4INP zo(N@*@5%zl2NduD<@hS1I~0NFjG&ue^~NjqjYT&U7#(yGC+Q&`G9bsCxTD!&Y41LN zXsMs|g2Xa@(M{ovDgS>w)vr8y7sOcfblp1vUeWtyGtaens>(2WADQ*f(>HVxru>I# sZUAuuf*`mO62@$l_un46X@BZ= probability_threshold: + with transaction.atomic(): + entity_a = Entity.objects.get(identifier=identifier_a) + entity_b = Entity.objects.get(identifier=identifier_b) + + # Logic to merge entities (e.g., link them) + # In a graph db, we would add a relationship. + # In Django, we might link via a 'resolved_to' field if existing + + return True + return False