From ce4e9ac5e6f6936b2e640475ccd7d1e51ec7ad3d Mon Sep 17 00:00:00 2001 From: gitrusprus Date: Sun, 28 Jun 2026 22:16:01 +0300 Subject: [PATCH] Cleanup: remove tracked pycache and db.sqlite3; add map membership backfill, new components, backups, docs --- .../__pycache__/__init__.cpython-311.pyc | Bin 132 -> 0 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 157 -> 0 bytes .../__pycache__/settings.cpython-311.pyc | Bin 1261 -> 0 bytes .../__pycache__/settings.cpython-313.pyc | Bin 1214 -> 0 bytes .../config/__pycache__/urls.cpython-311.pyc | Bin 316 -> 0 bytes .../config/__pycache__/urls.cpython-313.pyc | Bin 304 -> 0 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 134 -> 0 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 159 -> 0 bytes .../__pycache__/models.cpython-311.pyc | Bin 5449 -> 0 bytes .../__pycache__/models.cpython-313.pyc | Bin 3443 -> 0 bytes .../__pycache__/serializers.cpython-311.pyc | Bin 4975 -> 0 bytes .../__pycache__/serializers.cpython-313.pyc | Bin 4360 -> 0 bytes .../contacts/__pycache__/urls.cpython-311.pyc | Bin 1118 -> 0 bytes .../contacts/__pycache__/urls.cpython-313.pyc | Bin 898 -> 0 bytes .../__pycache__/views.cpython-311.pyc | Bin 18971 -> 0 bytes .../__pycache__/views.cpython-313.pyc | Bin 11148 -> 0 bytes backend/contacts/map_membership_backfill.py | 62 + .../0012_backfill_map_memberships.py | 68 + .../__pycache__/0001_initial.cpython-311.pyc | Bin 3139 -> 0 bytes .../__pycache__/0001_initial.cpython-313.pyc | Bin 3075 -> 0 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 145 -> 0 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 170 -> 0 bytes backend/contacts/serializers.py | 2 +- backend/contacts_export.json | 3320 +++++++++++++ backend/db.sqlite3 | Bin 204800 -> 0 bytes backend/graph/services.py | 39 +- backups/full-backup-2026-06-24-1711.json | 4407 +++++++++++++++++ backups/full-backup-2026-06-24.json | 2985 +++++++++++ deploy/.env.prod.example | 3 +- deploy/README.md | 380 +- deploy/social.deepfishing.ru.md | 359 ++ docker-compose.prod.yml | 1 + .../src/application/usecases/graph.test.js | 15 + .../src/application/usecases/networkMaps.js | 15 + .../src/components/AddContactToMapModal.vue | 261 +- .../src/components/CreateContactModal.vue | 35 + .../src/components/GraphCanvasContextMenu.vue | 92 + frontend/src/components/SearchableSelect.vue | 7 +- .../composables/useGraphNodeContextMenu.js | 28 +- .../networkMapMembershipRepository.remote.js | 5 +- frontend/src/lib/map/conflictLayout.js | 15 +- frontend/src/lib/map/positioning.js | 20 +- frontend/src/lib/map/positioning.test.js | 14 + frontend/src/views/GraphView.vue | 49 +- frontend/src/views/NetworkMapRedirect.vue | 15 +- frontend/src/views/NetworkMapView.vue | 104 +- 46 files changed, 12125 insertions(+), 176 deletions(-) delete mode 100644 backend/config/__pycache__/__init__.cpython-311.pyc delete mode 100644 backend/config/__pycache__/__init__.cpython-313.pyc delete mode 100644 backend/config/__pycache__/settings.cpython-311.pyc delete mode 100644 backend/config/__pycache__/settings.cpython-313.pyc delete mode 100644 backend/config/__pycache__/urls.cpython-311.pyc delete mode 100644 backend/config/__pycache__/urls.cpython-313.pyc delete mode 100644 backend/contacts/__pycache__/__init__.cpython-311.pyc delete mode 100644 backend/contacts/__pycache__/__init__.cpython-313.pyc delete mode 100644 backend/contacts/__pycache__/models.cpython-311.pyc delete mode 100644 backend/contacts/__pycache__/models.cpython-313.pyc delete mode 100644 backend/contacts/__pycache__/serializers.cpython-311.pyc delete mode 100644 backend/contacts/__pycache__/serializers.cpython-313.pyc delete mode 100644 backend/contacts/__pycache__/urls.cpython-311.pyc delete mode 100644 backend/contacts/__pycache__/urls.cpython-313.pyc delete mode 100644 backend/contacts/__pycache__/views.cpython-311.pyc delete mode 100644 backend/contacts/__pycache__/views.cpython-313.pyc create mode 100644 backend/contacts/map_membership_backfill.py create mode 100644 backend/contacts/migrations/0012_backfill_map_memberships.py delete mode 100644 backend/contacts/migrations/__pycache__/0001_initial.cpython-311.pyc delete mode 100644 backend/contacts/migrations/__pycache__/0001_initial.cpython-313.pyc delete mode 100644 backend/contacts/migrations/__pycache__/__init__.cpython-311.pyc delete mode 100644 backend/contacts/migrations/__pycache__/__init__.cpython-313.pyc create mode 100644 backend/contacts_export.json delete mode 100644 backend/db.sqlite3 create mode 100644 backups/full-backup-2026-06-24-1711.json create mode 100644 backups/full-backup-2026-06-24.json create mode 100644 deploy/social.deepfishing.ru.md create mode 100644 frontend/src/components/CreateContactModal.vue create mode 100644 frontend/src/components/GraphCanvasContextMenu.vue diff --git a/backend/config/__pycache__/__init__.cpython-311.pyc b/backend/config/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index bc92fc14c1bc9395876ef39fcaf8aefe69eacbfe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 132 zcmZ3^%ge<81P=}0XM*U*AOZ#$p^VRLK*n^26oz01O-8?!3`I;p{%4TnFLC|Ef&%^I z{JgZxbp81F%)HE!_;|g7%3mBdx%nxjIjMFP9pSAJXtoFU$r-X!0Q9FBpVg!Z&ZfB$nRl_yQ&`uYpI) znCO4cWx==ni-LTpTekY-{HyBCGy&sJb* z;9%^MCw4%jDzKZ^({X8`w8H55gMse>F&(XN`lz@ob?x3M z@o*@G-@8skz8doYF8mTpQ%dVzy`|7(OKvLTOl6)_g$gU#jiq<9lZJNR@gR9PP}}a4 z)@aZr0eB1WHI8qJrQ0>-Q0_Dgt1W|uY}D13Rc*++PP2e0mR>g%2cd76@$MpFINHF+ z#0{kbr!S8p|Ii^WZk0A@dI-1fI^7_CpEP4xaosJ8rr~J5``>Jl}RIImj10Vq8c3Y=>vtFw;lp|SFXiigA z!|G^_s@giF*_v#~abzID7NcH`m#DDtV=fgnMK`QN4GMXrY7gjERn>IsN-?&Us@0(k zI^Bt5S)F!6m1|a0{?2MDO;vk%RSsHQ)=cggs&!ab8nxfioA~L!{h(qGhn4w#S3(j+ zj@J*R;n~~FT`1bfCHujrz>9z7@B+*%!7$7eZJ)o}FNL)q?mW%>xc}4sU&7v>!rq1O z$*Z{EdL`VRWG?gfC;T*%n{dI>b8aT`L5ThDec#Lp)J?AZI30TrOe3Sb~O ck8XZ=j<#U&qslqjxx8`b92Mt1_!zSK4@RM3E9LE3RRra8WmCQyCGNAk9#~2tZ3zqFNRe9t|Uf0fHjW5@U)~ zk5mG4;#jmxmIB#2_Xl+8uc*+$!T|+RbjqgIe;`L&3DgX|;qJZX9=^}}#mh=X0Cau% z{jc5+IRO67F7H-;Xh80|)n3Q2yf@`n} z*JT#3QBPG^!|THv^^G@~Zk-|dz8#N}uia;MFbo@B5FuxZQ6mZ+&-NQbY)?iF7d>yB zq4S0_q9jB~jR_9jsS|r)U=n7xUPwN^b|5=p5Mys}b)q1S&nGBKZhY`)PpRb155Oq4 zW6wGDd=wE0qbRmcu{}mFLVQLXuU_Bo<{OL^-xQA}>3D!JwU*!;H|rEj zwpvu zqISFbvDUI4>(GQm>hz#VAquGdJ|x0nr`76e$Eu-`vZ3pyb!2p#daq4NE!9*r&y++z zF+0udiHJ)(;}XfxplP)YTEk=AI3Sx%-GJ7WVzyhl(V-Q9r1q{N>XE5i?T*%M{Q@qt z!6tjkC>$eY8X>G?BNR<+2Pvyltt?xqT(?|_P#k-~Fp?+dgx{mZoBHS>zD1p7e{}RS z-4;29Vg3YLe~D`^`5zx%h&wZJ=MVALg}6HtcQ3?yGx1)^zpgw^g*jhNx%v9WOD?Va zn=jVbR9b8R?#?`~EV!J+rouu1)$O#rC;(2H*W`J1>($<@dix(PS1l}ZT!l?b3kgVD o)R(mRYI`Pqk&2YO^Ms*pDeKCm0B(NrJJ@{v(N{B2!#gy_xBG@|&j0`b diff --git a/backend/config/__pycache__/urls.cpython-311.pyc b/backend/config/__pycache__/urls.cpython-311.pyc deleted file mode 100644 index ecbfdceb5c3aa7a965fdcc419eecafc3e3a82cd5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 316 zcmZ3^%ge<81P=}0XQl$_#~=<2ut6E0oq&w#3@HpLj5!Rsj8TlaOi@gX3``8Ej44b& zk|~9G86yM3Y9NMyWlTUG5JNyZV-#}=OE7~b>r0S;CetmJg2a-HTkM&6$vLGdsZ}hA z1)2I)yvg}_C5g!;#d@VhImLdOEVsB*vJ&&s^TGTgW}wz079eqp8z>Jnpd_^@uXrWH zXONk{g!K~(3iN>{q-Cb-gY@eaRQ}?y$<0qG%}KQ@0{Ic-x?*P_@qw9IH1* t0~-S?XM;v)V#=|b%jOi12YppQv){$7I6U00RV?0P1yhd diff --git a/backend/config/__pycache__/urls.cpython-313.pyc b/backend/config/__pycache__/urls.cpython-313.pyc deleted file mode 100644 index c109547bd21b302058345093b685f45332ba6bf6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 304 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 at>w1O4)Wl$>FmthJ3ouDN58-!JpDgUdX)VD diff --git a/backend/contacts/__pycache__/models.cpython-313.pyc b/backend/contacts/__pycache__/models.cpython-313.pyc deleted file mode 100644 index 57083dcad2c6796413e2cb19abe986597cb50fcd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3443 zcmai1-EZ606({vAnUbup#IX}cOPsYzFllYvBEhn)X>2cv6R$Jf0Ry}ev_#8XXi~W( zo4V+OnhcqP25>X9NH7eA+lS5Blaa)$n#At@giGzg8i4`D_T;yAO0m6d=a7=WYITHl zbb0SNN9Ue<&hK~Kj7B32JpY+pk*|gr=AZb|e*CRLQ-Q&U4A1cFD07h|Y?kR^jxfBZ zm*KsW?6|LOu=V|t*BujYf#H2WV~NkP@PkF*|5*6T!CYtq&2y|BnAJ*>q8GP3GfbfM z(i~zjtVxEjJVQJ@OT4^?_$K}1+;(+$4B>itAMZcyAwkgS-cuvM2l)_aggg2O^8r4> zcb)cpESgkFD!j`XFn)OV_NMv<5Rz ztlM-I)}LnSL#s-ctzXlX{KkLL7Eg!Xqff1coX3vLif;*uq?U~tn|o6tQ<^RbsyHi6 z*#6;JQC2|5Kc$H36%q!!4g6s+~_L-Dho1G!0EqwQGV{DnYr0 z+V49G4$91Vnn&Pkcfl2)ws|k{^F9*b{Ulfp0xFAf+L^l*!l~fHTLK-PaL{`gA zqU_Z6tP2&zB%)$x1VJ}MLoN!UVGw!BG$dURNCqNl!iTZX6lSzpsbK07DO}UY6}=)B zrGl;%Wl{NFnTVB{!jxFNBB`Z9(JdUk;C5=hGH3g6*96Z2_ok;o++-T*-uF+ZX`e)E0{5sRK2(`TJhd=)YmSC`+(>X~ESDizTVy|q9ux;apudtZG)rgcgzk z@zkQ^HsD=Y1f)Yuv)-ehfl_G7)S;<#-NZTtL_t7W15a!8vn>4_@TLlmSFJl%6}0`D zF(VNZE2|w1D6Z_lksvJM)9i*y-HjuiiEFY0VYLX&*O{(5S|ZW;Px~Aa!*bvC09l46 zIX>)AosUF;VD{GH_$VLa<3NXNkYlpWk!{kH1MjuGogytyx*+O;u9>8L&i9;hShIf9 zDh96|)>HxR7?J_q>X<>(A-J~ibB8B@wX$TmHTMTB2ZZ5foJo3|&H7AyIUUWVoY<+ECfd!pb*` z=o?fNZ70>`q91@2wuze)JJ8w@UIMprZEk<1H3wyYkoH8zxT(rlO-V2`$PBcAyRAO( zw^5)Fc2L%0;r)kKOb-GKZ?X~yfZQ2&B6j+6DEG~ z+AvSf<78J!(u+i{ASsbNIxV1ZP6?ZE&oexQ3n)-S|2+s~nODAurq-kV^=N-16mKMZ z?&k008=2#c%yVCb{jorG3;SCJOAdwJGb8Xn!&LX%KrcgMWz`5 diff --git a/backend/contacts/__pycache__/serializers.cpython-311.pyc b/backend/contacts/__pycache__/serializers.cpython-311.pyc deleted file mode 100644 index e2244d91016b8f9128839203e94ae02e7b460e31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4975 zcmb7IU2GKB6~6Pg|NdcjFnTg!gpsprh>%>F{? z_0BhU?m74WobR6NPkMSH1k%3V!Np*dkpJR`m!x`T`yOQO6P2i(PL{YV#}SoR1)X0K zvci&>6*(g+VLi)oyDmtVZ4; zndtW@&TuShXf&_r`DKk7-*Z^Tv*2sRf~n+87W%oSD`vh}$a#(7TdaRe& z0jS;RS`)J3JS_6ZTvmcN4{vA|8Wf)lbTl|VqnS#kpYeH>i3MdzW0JO{?93$mxSq?A|~KvoL#px%#Js;K$00Waufu2?RZ8Igj~5ju#FLf8v1n+dXzEaRkPnMGuIsi>B9%*SN;*JVX_B^2$9Ng&j8 z7MROxx@xd~=valZ>epnq0Z5m=(JYAdpo^4S|t_S=^(?#&Rx4T|*g1 zPkR?kB2YJ+u|adYFLa0g88Q*P#U#a64!9LAZrI zo^i_NwUWl7s%GS9zU0u}?tH=2D4YhsfimU`z=ziy;%OnFN$85A`vVEJ8(jcp`w>PE z(gfCdVH(i6=&yY(!@UMsX;ud(5iityUyX+G)r-N=m~)GB>?Lq>+jZAmD|?ml{@Lm z`_{j#&#k{%k1IDTxAF6{${mp0PFr7s8Ok>@m!^IK;&wwC$1(&YKI46WCYp-BboYoIf9c_k|A_jOh;-RTq*Fh z7E7FpJ^NugF3~thC{C5)p${jw6X3F6 zKeDFR`a(bh1VQk-!44g-$p~(+8ibfi%b5lf6kUfxWFI<)D-!Y|Qv)|T?ZsSSe}>Dc zr%wJ9)G$s1tdMULd++^pGjV7maj23wY$pz{hHAV&o+KIAU)v3zTR5_v`g+u(tQHqR z`*K|5w~)C{{vQ{?c%?PoSodug8uL@DwSp^wt9Ny!<`bs7Q~d=Rtvl7*&*xNdBtFNW zz!`i;D;#Bv_Z*=h|XNKMV$r0f`7`SNQPst%W`NC#$aw9qU z_~I7}mE@G2oZ3uIZzQKH$r(F2vl?!7u#u-a*lZ@!78tOgEUU$wEIY9cJ&IF<`#Bt3 zaGA$*i@pU#6c5(+_~1O2A^Zp)_FWTu z@Ur5=em~bJ!<>8UV^=T%)=M?Rl;s9aY$dH`GQ1iU&P-9o`m7pb$1{{!l_g2Dg* diff --git a/backend/contacts/__pycache__/serializers.cpython-313.pyc b/backend/contacts/__pycache__/serializers.cpython-313.pyc deleted file mode 100644 index d0deb89b82cfe555357aeb4673bdd6529f5239b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4360 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 diff --git a/backend/contacts/__pycache__/urls.cpython-313.pyc b/backend/contacts/__pycache__/urls.cpython-313.pyc deleted file mode 100644 index 07ad4019aaf28f11e0ffddacf42962cecef72c1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 898 zcmZ`%&2G~`5MDcL=a0nDM4_!xQBpV9X!B`i=`bB>U zlVq6Xi??BX36o-&;{P!k#7ZZvUOVFuRiw}}{4R}Kj%f#NqzW|i1nnAu?Kj-ONBE3O zWmV~wh4u+en6Bd+rcY=RBiryT*C7=2uRT?-({%f# z;dI<`fNg?fj21)YXaOVQw|247L;Eh?E92>0f+ddN9|QA0K;^Jb6BuG)IDvg<1N^Xf3Kj^MrXq@;+4 JX?&B(`3rUM(&zvH diff --git a/backend/contacts/__pycache__/views.cpython-311.pyc b/backend/contacts/__pycache__/views.cpython-311.pyc deleted file mode 100644 index 9537f7d710617f7d5bee58edcfae93442f759297..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18971 zcmd^neNY=$mT$K{kc1@kjRcZFeA!?dupQ&XHuyTgPlewlVvVeatcBpeY4)h+?#_ zP>e39I$NHp+`CGOdLRDfW5`LkN`XuNEnF@I71S_>QTknI(fjZ(AB^!8>RkxFpNXJ` zDvEHHt>LUJ!f9H==`O-)Uc>2OEU!>QUd9Tvilnlwsk41es%nNFpqd>2fvxCkQb^i! zq2PHg80DlAE*gkVau^qw2>CHyDhUinLy_?&TGAd5aubnpF8CiPk){$!(-9eu!ee|A z4j`9QcD(Dz{=x3Y`}~6^k97@5h9lhvyZi&k4tE`gJ5yiR;FFIZ@AY?dAMZE<5svP@ z!LH-`J4gx)_YHIpo@`P|mUPwwK{gZ!hb{$K$(ku7C(d+;4NRO_jTp|p83-uSH(w4y z;D?}@K?=2TND)+?Rb?0x8STwPkZZwPE(vOewA0iG&CsuChji1_1$w9yWT=qJ()Bz6 zq8bQBhqJl@*o#1%0GTOOm=Z*ffVfihp)p*++RRUfEDFu)Fn~%3A{y6Ro7M;V9QiG__^oB3l6rm)!ZnZ^^BI z3mCZLK)#-$R*cqHpPYGe*;un=tPzZLqOopTku;cRj);baWkb`Fp=rKx;ecRxP&7O^ zO(*q+6h-S=k`~+5ipv%AJ7y~cOS5Qco<5K?S*CSgLatPkUefygvM{7lzke*kOol-) zlEDu`2!!P)tPWTuP2}|1AXHyc2Et)Un~@P~!iQ!qtKxF=N!ui2S{TE@aM5J-18(9OssI~8MYChG$An~*#hJ}N^Ud}aWlpu@xed0 z7f43FQ&iIA6iwC3rj{jB%lw5!mtZ;|nhq?R4lbDv3Z}!N=`f1C2}CZRa<-V6q&(C$ zm^V=15JU!w{|*5dCV*y+v)O?mk?qKtXL!vQRU8K>Dn@q}#w(&Zg3ie^^D1+*1T)Pj z^M{TNm91n{P_}YS*{Z01HT#$%ref6B75PIAyxNk$fnf$#CO<3MsPkf^gPwKsYPi(E`ckw=*|~2^gT^K3f8WwVBc& zi~|QbAWWuScmv_AEE(l>-J6P;@BsCm>KnSWPtq{Kk-%g)+N6^dAx2V%1E+&wNgWME z!$C0{99+Q4zh__{g33rL9OER_*+^)d^KfOaCng~+5p9UKdU z!fZS6un!}71j(aF9s}~8LQ=GBm*`;*Rov$zMNKxZoHN9RtYv4DZ;UxR`W%u0NctsurtSl9lf3+maQP z*WF29jp*B%vX$yeQxpk{giI2Mg_122>Il0X2@VcTYPJ$Ck~T95VxPiWT}D_OdlK$Be1R}y zO7|YAbhXE@KY&LK$nz5*Q`8?zD6_M0c92qJRoF#YD^nG4dk_24S4gJ1{^+4B6{6X< zY;IjLw=QTG8wGQRXzo}xA6haW63pGAxqGTRrO39|PFdY42i)GnmVbo=a&b`x`&@87 z$lG_pDd^ioeH*W8BZA56C)gZf5}$%W`iJWLxpOqzC#akm@%p`kp+6`vHi>NifHJZN zm^>(Hb*-0w2ZmL(o?(4W&8XLlk1L}17SqRSA6|dH!;~eey3rIRlJ7ys9?ef0@1f%W~BFvEY$f10tb5MB_bgqMWZeZq@q zj`_vCK4joOf$#$Var%)jG(H@jWP*Me1u}L842O?j#B{fXH^8hf`uJb-clclOzYt#b z@t^REaJ$$t2&;+;9X%ZeFTo3T590jAB^+1W!t za)*g;bnUQ4k!?$TPHp|9*W{R(4A)W20K4H7#ap+?=iL6;9anZ`Z`bPZ|5uX`whaZn zA4#FK za*&T)&JCN*>`-!_OzkizF6tT>OI*9M14xJpBZk2~fn?PLDv1eXPe81shoxoYe2@WS z%5m6BVD(HUQr|`Tryw2oLm;q}Oi>0jjah=G5mv@C`{uUt`UW`XYd+Yz=;pU{!kMz& zKbvW%wsz5Swz3jD2^E4#tqPSS$5xUlr#8YeLDqlzqP)x_R+B92Z~z6E~3y9Z?IaH@o|ZH18{;Q}I9w}{p)Q@!`g&sm8Te#ZGH=78NP40zE__z7r@QYvwKIK0~ z%knAz8{uW)MYJaTuZ7ozzeL-!2t1$iw^!}O9sZ;IWgX56$mm~1Dn`0}=?`Ew5T^m% zqGJk}u_|E3swXp6m}s2~gaMEuGgY()@5wzzqR&ZmINeL+<%Zl#YBQ56GLhwS3_*5) znt*J$dLUp4?A`MDVf{kQLjT-z^E-G)GoG0TM1NtXipt31%I!UxXe7aLUzN}3KT#+`7E&WH{jL&BCP~450IDc>rO5}Enb0%#+2~-HkfF@^=1C= z`9%mXk}1a>pf5uBHcTKsMHLce?vKW>A*d&rHn3RZb<|^X?(i^tCK4JBuB#*GF?m`? zT)jLwKV%jHiKHA#s$+@?I;M#$X8bXlgyb$nA6WN;P2G)~W5zf;4A|-81 z%Q|Ap_1D)iZGIUvH4~hrXIhCh)+chT$!Z&71y*7Nv3^7Vf_Ephu~kq!joU{9gU2Kh6BDv;YVO9Uc?CmE>?Yk;o->Sc(er*HKFAIOd0aL zg9e9S$}ruygArhAU?scFM-WP|F?ZoPtWn|d$FMYIaT{4u5md{V#$Ws+pP=d_yrnJydqpO7 z^F1Wf>ZIQM#-7*q%$^YR9#QW}n3nXdyuLN*^jy7o`C`H)IJbz-ExdF4{Aqx{j9Uqr zRVH2T8=7mHgh6mMi>_wg^}vF4R=whK&vo7CzSf->5j@SJrq|T_+cn$u#cD8R!P2c% zneB~}ubrGdCm5?lV^w0)lChCDHm+Y^rLj3h0hv{<~RWc+Z0i z$CushOYZi?6N0-_ba(RZp3fD6vsZNXE<5{|oc)4xKy(hws**M*R<=25uU@uqTC#6S zL^tD?N@XoW$ErqS=tSiwbtT%pLXdO{rX606t~RN z2V;n7V!D|2+qc{%>NlL1cC^4_B42Lt(pV{{0NbXI=3=YrB5$~0R*;|94?v&d`nVx( z1iPB^4l`{7%_)r;VtPgka}pzCyk4MbG|b*+9*6(Gj47eVgZ*U6V$?ZmR>_*=IUZA1 zk4e*0*=EKjawMdWHO zNL?N)#%U?wTr)O69rdh&rpD=+$DqcBqBXV_=7eL~sYm0cyc(N|)Yw*#x;$2l^H0~< z5HsY|*bKF{6s@(rpj@(AIrXEsHLupzBDHoDq%MyY<18=WTq|euhDvl6MCiLL_9 z;&rPi;9OfbOU#^>=#OJ&?my?%v{-+uEXcLI=sWn6ve}S*%9mfUS{2H#c&!TMw?--( zs+Hy2$K04XX4#N5-38LzT2z{z0?y(s^cHY_uNJOrFO)M%VkfF#1lSt4#cXIV*oM5> z7ZtOuT8-i}F}5_8$2kmR(Ev5GZ4_uz_2mD830*0!KlrzBIR@*g1z2jq8Vry;^yk6d zMp$S;l<-3U^Iqrg_;48}bCT`Eo`J{vU=`?t^&Bh&VOx*#|&mZkAX%01*kGxEJe;$J5W(qH9a-USCT~ zOMDyBQ|aXC^=8NMqlIhECP@B#ZF=DeNuRI9WgG+`H(WqMs5ZRl^FQN16yC%oGOmPu zY>)$oAuiqU=K=mE_t{!yWR{-_+m)47PCH3MND@htmII3mOcrrENt3QR`#eU)FsgL5 z{_;v&m#w{|9}6)II8@?`_=fiN!CuY*Oo;1Y_OFn1BIyEx{uHo0Cfhucku012MvOs?XVabq|F>#BMRBYrt$4(=AH7=1}+1+2rpO)1J@aoi3ED`}q3(i>%-~Ao>n0`wlPp4hy~>(bof<)wPMXTYGNqnSWZS+auQP;p-k< zJT6o}CRRVTTzzn<`k+vKSgbxgr&_70Pdst!abS~HQ zEYe?F@u3h+f$$WGnxOn2TLB6d=XzUdmdxh#FV)c;}rSMhq#|D;< zJ+*Y~sTEIcV%L1bf_>gAcpelz55m@DKV1oXlR)QGsS?Up53i-7;om&*D!L@ZxJvW&MCS9Hz`fK`RePgm=3!d9rl8qQh88r=+DGJCv zN>kzf3JKg+fDn;5L6WIWl--5U2)x4T+1@YojyXH8_X>J%(&m`%1joF&Euy0#Mb#N? z_mIre2odeS(RHmWu}$!_ik?>9)3&fvaP1adyO&+t$Di1_@p zP}wh5_Rn^pO7FV$(9MVDyWW2Eok#h)-~w~^%hgq_Hl68^LSAM0chxM;B`DHr#GlEE9Gf z5_cZrtB!uYQ>g3{EBlr!2bU@bg~}6RvY8@3*Bydk_%~7}$#GV4=5!$%+$j^U$)CK(TKpO97B?7xqj@6u2ov)*- z(`4!_BDLg*6`(W)d1<0(&C^G$uq5sHwW4h-z|hz;(dtY--~nmQg#WKvUVz0E)Lj>? z%aj7xQ~_@sc8J#KM(M_NW4utW^xq-vgLPE2ezk7(@Eu3Iv_MY{vC_Yx-coEd*I~s; ziZRAZ{}cET%GdMsdFq1lBz2ySZeA^`aPKRwk2V#53Mic7)Is8{0=QpvYYwNeNFOZA ze+v`8j1}W7#HQXZ%2|j*%`lb(ZgZ_UqUgMyKA4TwcMaae6ktdRS0=~YYktq%kYv_i zMBk^RZ^wJ{WxtV{$ID`6TpgeQIitgBI~hmJz?5Hth`*s2=UWAP6f^}N#*|-zu_Uen zT(>;BYc=IrcP5ji!sfa&-q|2OCxS=z$}{jamz z>;NL<_<?E3U{vE)U zKH`6czU+4ptU}D`4*0e$@Sn7R@3{(iSOt(vs+M8y+$G&)bfo#AW-c^(Ne!Q@MaD0w zNzCLdX7(21U@w!@1ffE|Hv9~Zcr^fC_6dZEvs(^UCX3exunt09STF!=fM>mdp7vQ_ ztI%yC{hsjk6!=Z7%By8^KUQiTG)?$%x(EP~RzDYzUpc7{qIpCv!s{)Q=#0z%Oqho1 zeMm4TY!kHRLjw3MWO@08y}mvfg;Di^j!c$d!goO3e#TygAo~UqG*m1~YZ512{M%5I zDX0X&vT)Kzii7VHJ|$Irnb4Qu>jN2hM7;&2yyKJMz4fppR)%tlKT^nb)TTeS1HUl% z#4ZvAUkuGK8^q5_B@Op%2pl`WM}(*f*W{Jd2fN{OcNyU!&Y-9olKt@D;4%NM?c4na z_ILV^clAHfH83dWuSREXR?>od2zNddJp=eoFaS9+!D09YQc{9CNu`~D8XbpdU{r)6 zl6C;RO2$XKA5ViysA2FKU?jkBEP^tUuIs{ZkbFlaDZ{~WNf!ik48GKYueAv5w2C;r z4D1APTJ^VkhJb2cwj1 z;Jie`*M>xD1TvE75JX4LlcsaH#k)SzB!8cn@nhjw9yn9*&ly0R;IVF{47Qnvm-U_{ zy=M-bR1h?p>P+fQu-a6gp;t`KIVWGcpLZSjm)&CT2yYq{OrxS{l-G`aVY1C!eB*`J zUJy(^(d2_~cgsvuhh$&jNF7Z$OnB-R7UHHvpVSjpBbw9IR#J$t5|W@i0<7fwbBKPPat0*L7c&wQbK}1 z8Yu9svAFokQ@r_^6{lBp?gVCg88F++fZ1LK%*L{>zy70^GB{A2=jmLU7VWXm`}x{q zc)I$3KlB&k&?Ij}%)+?=9w$%(nn6|-%&%Ay?SK&(7ze%e~>>rXjsxVBrT3VRCwkFZajJI$;6X_w^{Ty^IpWf zDt3t#yOt~VE>-LmD%!=0_LYtD0i@Y+>(I?Z^L^h6X(IZiyrsFRnJ>+OLh|xhZ`~Ij9#BHKp5hkJ9NtY(P?k*eRWPcE_uRY0ayeKj>{qi#utn z#MA0Z>D1^C3*;W9Mt@i!_}c~=t^r1c-&S@scWtJAr}ZM;Tzb&0{N0Y~gXPM9GSd+L zr*bvWCLjAL@UovF`3E5Aj}JR2Bk*e#LHszHMbv~?a;YN!Nehm}FnC5-jzwsLMT;dl z3z*=R{ALRA9tI2^M(;2ukE-C;C4Uvb<~tQj`qiI=;K+|e$iGj3UMG^_DCUs<^#l1w zAeu3sA0Qb)5fs5i>;}qj~D_VrQyEN5g2h zmdrjSI<|nq(J&xppSl$E7J%Q@kl8b0`PO^*0Fd*{(^5)NI^~*fo8BzYRuM{3RMERr z6p(vLN@2^!9Dv^^DqyTdMj)$<7}K+sQ9<{@V2gB>mBg(ryo81h0A!UBW2_E(J8Xtz o$o8jb8aiAKJ*SXsw|lx#prO*Xl%k8qtdL?}_JTP12>~1b5ArK)vH$=8 diff --git a/backend/contacts/__pycache__/views.cpython-313.pyc b/backend/contacts/__pycache__/views.cpython-313.pyc deleted file mode 100644 index bc822aa8d4edaeb6a695b7716e04c6ff807e8935..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11148 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 diff --git a/backend/contacts/migrations/__pycache__/__init__.cpython-313.pyc b/backend/contacts/migrations/__pycache__/__init__.cpython-313.pyc deleted file mode 100644 index e2942d470188846187cf70dd5c50ff9b47db0152..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 170 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 IO2qa52Z9MkT>t<8 diff --git a/backend/graph/services.py b/backend/graph/services.py index 837b1ef..d1e27c2 100644 --- a/backend/graph/services.py +++ b/backend/graph/services.py @@ -29,19 +29,20 @@ def _network_maps_qs(user): return qs -def node_from_contact(contact): +def node_from_contact(contact, defaults=None): + defaults = defaults or {} return { 'id': contact.id, 'label': contact.name, 'title': '\n'.join(filter(None, [contact.organization, contact.position, contact.email])), 'group': contact.organization or 'default', + **defaults, } def node_from_membership(membership): contact = membership.contact - return { - **node_from_contact(contact), + return node_from_contact(contact, { 'life_sphere': membership.life_sphere, 'network_circle': membership.network_circle, 'importance': membership.importance, @@ -49,7 +50,22 @@ def node_from_membership(membership): 'map_angle': membership.map_angle, 'map_radius_ratio': membership.map_radius_ratio, 'membership_id': membership.id, - } + }) + + +def nodes_for_network_map(network_map, user): + memberships = list( + NetworkMapMembership.objects.filter(map_id=network_map.id) + .select_related('contact', 'map') + .order_by('contact__name') + ) + if use_jwt_auth() and user and user.is_authenticated: + memberships = [ + m for m in memberships + if m.map.owner_id == user.id and m.contact.owner_id == user.id + ] + + return [node_from_membership(m) for m in memberships] def edge_from_relation(relation): @@ -85,19 +101,8 @@ def build_network_map_graph(map_id=None, user=None): if not network_map: return {'nodes': [], 'edges': [], 'conflictology': False, 'conflict_subject': ''} - memberships = list( - NetworkMapMembership.objects.filter(map_id=map_id) - .select_related('contact', 'map') - .order_by('contact__name') - ) - if use_jwt_auth() and user and user.is_authenticated: - memberships = [ - m for m in memberships - if m.map.owner_id == user.id and m.contact.owner_id == user.id - ] - - allowed_ids = {m.contact_id for m in memberships} - nodes = [node_from_membership(m) for m in memberships] + nodes = nodes_for_network_map(network_map, user) + allowed_ids = {n['id'] for n in nodes} relations = _relations_qs(user) edges = [ edge_from_relation(r) diff --git a/backups/full-backup-2026-06-24-1711.json b/backups/full-backup-2026-06-24-1711.json new file mode 100644 index 0000000..3256226 --- /dev/null +++ b/backups/full-backup-2026-06-24-1711.json @@ -0,0 +1,4407 @@ +{ + "version": 2, + "exportedAt": "2026-06-24", + "source": "django-backup", + "contacts": [ + { + "id": 161, + "name": "А.В. Бельченко", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:48.040973", + "updated_at": "2026-03-15T05:42:48.040995", + "relations_count": 1 + }, + { + "id": 154, + "name": "А.И. Машошин", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:46.596607", + "updated_at": "2026-03-15T05:42:46.596669", + "relations_count": 0 + }, + { + "id": 153, + "name": "А.И. Стариков", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "Начальник сектора", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:46.438511", + "updated_at": "2026-05-14T02:29:17.773428", + "relations_count": 0 + }, + { + "id": 115, + "name": "Аглиулин Шамиль", + "email": "", + "phone": "+79610464441", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:39.717558", + "updated_at": "2026-03-15T05:42:39.717620", + "relations_count": 0 + }, + { + "id": 113, + "name": "Аглиулин Эмиль Шамилевич", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:39.418904", + "updated_at": "2026-03-15T05:42:39.418936", + "relations_count": 2 + }, + { + "id": 114, + "name": "Аглиулина Милена Шамилевна", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:39.564127", + "updated_at": "2026-03-15T05:42:39.564183", + "relations_count": 0 + }, + { + "id": 32, + "name": "Айрат Габидулин", + "email": "", + "phone": "+79963093836", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:24.423395", + "updated_at": "2026-03-15T05:42:24.423418", + "relations_count": 0 + }, + { + "id": 133, + "name": "Александр Александрович Александров", + "email": "", + "phone": "+79013454293", + "organization": "", + "position": "", + "notes": "Главный координационный центр. Подполковник. 2024 учился в Военном институте связи в Спб. Зп 150 тр. Москва для людей. Наслаждается жизнью. Работает 1\\3. Показывал фото дочери.", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:42.831933", + "updated_at": "2026-03-15T05:42:42.832028", + "relations_count": 0 + }, + { + "id": 39, + "name": "Александр Александрович Елисеев", + "email": "", + "phone": "89214891842", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:25.585459", + "updated_at": "2026-03-15T05:42:25.585502", + "relations_count": 0 + }, + { + "id": 26, + "name": "Александр Взрввозащита", + "email": "", + "phone": "8 911 166-65-65", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:23.390347", + "updated_at": "2026-03-15T05:42:23.390410", + "relations_count": 0 + }, + { + "id": 93, + "name": "Александр Сайкин", + "email": "", + "phone": "+79295831376", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:34.857700", + "updated_at": "2026-03-15T05:42:34.857734", + "relations_count": 0 + }, + { + "id": 15, + "name": "Александр Эдуардович Алексюк", + "email": "", + "phone": "+79212955441", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:21.310263", + "updated_at": "2026-03-15T05:42:21.310325", + "relations_count": 0 + }, + { + "id": 71, + "name": "Алексей Викторович Мурзаев", + "email": "", + "phone": "+79214764550", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:30.846868", + "updated_at": "2026-03-15T05:42:30.846964", + "relations_count": 0 + }, + { + "id": 150, + "name": "Алексей Кузнецов", + "email": "", + "phone": "89126503557", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:45.811440", + "updated_at": "2026-03-15T05:42:45.811501", + "relations_count": 0 + }, + { + "id": 123, + "name": "Алексей Михайлович Кузенков", + "email": "", + "phone": "+79219619580", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:40.945453", + "updated_at": "2026-03-15T05:42:40.945507", + "relations_count": 0 + }, + { + "id": 139, + "name": "Алексей Павлов", + "email": "", + "phone": "+7996450-29-19", + "organization": "", + "position": "", + "notes": "Вспыльчив. Любит поговорить. Обостренное чувство честности. Мнителен.\nНа НГ планировал уволиться (причины: вопросы с дочкой, и видимо товарищ предложил работу программистом с более высокой оплатой). Уговорили остаться уважаемые люди + выплатили высокую премию. Вышел на удаленку.", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:43.966363", + "updated_at": "2026-05-14T02:29:22.513547", + "relations_count": 0 + }, + { + "id": 3, + "name": "Алексей Смирнов", + "email": "", + "phone": "", + "organization": "Яндекс", + "position": "Разработчик", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-14T09:22:00.513396", + "updated_at": "2026-03-14T09:22:00.513406", + "relations_count": 2 + }, + { + "id": 109, + "name": "Алексей Ходосов", + "email": "dion26rus@gmail.com", + "phone": "89216786805", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:38.789024", + "updated_at": "2026-05-14T02:21:45.391178", + "relations_count": 1 + }, + { + "id": 131, + "name": "Алина Корги", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:42.433588", + "updated_at": "2026-03-15T05:42:42.433627", + "relations_count": 0 + }, + { + "id": 89, + "name": "Алла Риелтер", + "email": "", + "phone": "8 962 720-36-73", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:34.184510", + "updated_at": "2026-03-15T05:42:34.184601", + "relations_count": 0 + }, + { + "id": 73, + "name": "Анатолий Мысов", + "email": "", + "phone": "+79214730344", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:31.179714", + "updated_at": "2026-03-15T05:42:31.179736", + "relations_count": 0 + }, + { + "id": 126, + "name": "Андрей", + "email": "", + "phone": "+7 (931) 964-80-47", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:41.471021", + "updated_at": "2026-03-15T05:42:41.471054", + "relations_count": 0 + }, + { + "id": 146, + "name": "Андрей Наумов", + "email": "", + "phone": "+79522867684", + "organization": "", + "position": "", + "notes": "Женат. Дочь. Большой опыт в электромонтаже. Душа компании. Располагает к себе людей. Хорошо ладит с детьми. Мягкий. Добросовестный. Трудолюбивый.\nДальнозорк", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:44.997469", + "updated_at": "2026-03-15T05:42:44.997494", + "relations_count": 0 + }, + { + "id": 74, + "name": "Андрей Николаев", + "email": "", + "phone": "89815639450", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:31.329122", + "updated_at": "2026-03-15T05:42:31.329184", + "relations_count": 0 + }, + { + "id": 75, + "name": "Андрей Николаев Моск", + "email": "", + "phone": "+79257177037", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:31.519869", + "updated_at": "2026-03-15T05:42:31.519943", + "relations_count": 0 + }, + { + "id": 152, + "name": "Андрей Шафранюк", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "к.т.н", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:46.258186", + "updated_at": "2026-03-15T05:42:46.258209", + "relations_count": 0 + }, + { + "id": 81, + "name": "Андрюха Орлов", + "email": "", + "phone": "89642960683", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:32.655827", + "updated_at": "2026-03-15T05:42:32.655850", + "relations_count": 0 + }, + { + "id": 95, + "name": "Ануфриева Света", + "email": "", + "phone": "89539358648", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:35.346735", + "updated_at": "2026-03-15T05:42:35.346828", + "relations_count": 0 + }, + { + "id": 175, + "name": "Артем", + "email": "", + "phone": "+7 995 913 77 50", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:50.710218", + "updated_at": "2026-03-15T05:42:50.710270", + "relations_count": 0 + }, + { + "id": 60, + "name": "Артем Витальевич Лунин", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:29.112836", + "updated_at": "2026-03-15T05:42:29.112870", + "relations_count": 0 + }, + { + "id": 167, + "name": "Артем Востриков", + "email": "", + "phone": "89132703333", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:49.307902", + "updated_at": "2026-03-15T05:42:49.307940", + "relations_count": 0 + }, + { + "id": 46, + "name": "Артем Клименко", + "email": "", + "phone": "+7 927 311-37-97", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:26.842013", + "updated_at": "2026-03-15T05:42:26.842035", + "relations_count": 0 + }, + { + "id": 20, + "name": "Артур Ахмедзянов", + "email": "", + "phone": "+79602340617", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:22.286368", + "updated_at": "2026-03-15T05:42:22.286400", + "relations_count": 2 + }, + { + "id": 179, + "name": "Баскаков Иван Анатольевич", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "В секторе Подшивалова", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:51.394701", + "updated_at": "2026-05-14T02:29:20.300137", + "relations_count": 0 + }, + { + "id": 6, + "name": "Баходир 2", + "email": "", + "phone": "8 931 986-04-51", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:19.967420", + "updated_at": "2026-03-15T05:42:19.967446", + "relations_count": 0 + }, + { + "id": 55, + "name": "Борис Александрович Летучев", + "email": "", + "phone": "89210857720", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:28.285100", + "updated_at": "2026-03-15T05:42:28.285124", + "relations_count": 0 + }, + { + "id": 99, + "name": "Боря сосед", + "email": "", + "phone": "8 967 359-25-07", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:36.046517", + "updated_at": "2026-03-15T05:42:36.046569", + "relations_count": 0 + }, + { + "id": 180, + "name": "Брага Юрий Алексеевич", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:51.541547", + "updated_at": "2026-03-15T05:42:51.541609", + "relations_count": 0 + }, + { + "id": 181, + "name": "Быкова Валентина Сергеевна", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "Начальник сектора. Мой начальник.", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:51.762749", + "updated_at": "2026-05-14T02:37:55.609887", + "relations_count": 1 + }, + { + "id": 156, + "name": "В.А. Потапов", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:46.875252", + "updated_at": "2026-03-15T05:42:46.875288", + "relations_count": 0 + }, + { + "id": 155, + "name": "В.В. Прокопович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:46.757341", + "updated_at": "2026-03-15T05:42:46.757392", + "relations_count": 0 + }, + { + "id": 158, + "name": "В.С. Мельканович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:47.509315", + "updated_at": "2026-03-15T05:42:47.509340", + "relations_count": 0 + }, + { + "id": 136, + "name": "Вадим Галкин", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:43.388761", + "updated_at": "2026-03-15T05:42:43.388868", + "relations_count": 0 + }, + { + "id": 34, + "name": "Вадим Сергеевич Гончаров", + "email": "", + "phone": "89212442006", + "organization": "", + "position": "", + "notes": "Служит в 14003. Начальник отделения. Планирует уволиться ~ 2026 г. Планирует продать однушку и заипотечиться в двушку, чтоб жить втроем на Комендане.", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:24.682908", + "updated_at": "2026-03-15T05:42:24.682939", + "relations_count": 0 + }, + { + "id": 108, + "name": "Вадим Харьков", + "email": "", + "phone": "+79112933468", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:38.587916", + "updated_at": "2026-03-15T05:42:38.587952", + "relations_count": 0 + }, + { + "id": 143, + "name": "Валентина Сергеевна", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "Пользуется вниманием. 14 лет в НИИ. Натянутые отношения с др. начальниками групп. Хорошие отношения с высокими начальниками. Работает над сферой организации проектов. На корпаративе может выпить несколько рюмок водки.", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:44.620660", + "updated_at": "2026-03-15T05:42:44.620689", + "relations_count": 0 + }, + { + "id": 172, + "name": "Валентина Сергеевна Быкова", + "email": "", + "phone": "+7921350-22-93", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:50.069189", + "updated_at": "2026-03-15T05:42:50.069233", + "relations_count": 0 + }, + { + "id": 116, + "name": "Валентинович Всеволод Шатов", + "email": "", + "phone": "+79214910619", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:39.871525", + "updated_at": "2026-03-15T05:42:39.871548", + "relations_count": 0 + }, + { + "id": 24, + "name": "Василий", + "email": "", + "phone": "+79998128872", + "organization": "", + "position": "", + "notes": "Хочет реализовать интернет проект.", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:23.072756", + "updated_at": "2026-03-15T05:42:23.072880", + "relations_count": 0 + }, + { + "id": 134, + "name": "Вера", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:43.076717", + "updated_at": "2026-03-15T05:42:43.076846", + "relations_count": 0 + }, + { + "id": 49, + "name": "Вероника Королева", + "email": "", + "phone": "+7-931-535-65-06", + "organization": "", + "position": "", + "notes": "Работает в детском саду.", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:27.442141", + "updated_at": "2026-03-15T05:42:27.442211", + "relations_count": 0 + }, + { + "id": 125, + "name": "Виктор Андронов", + "email": "", + "phone": "+79643429812", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:41.249174", + "updated_at": "2026-03-15T05:42:41.249235", + "relations_count": 0 + }, + { + "id": 57, + "name": "Виктор Локтев", + "email": "", + "phone": "+79121719937", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:28.679492", + "updated_at": "2026-03-15T05:42:28.679516", + "relations_count": 0 + }, + { + "id": 47, + "name": "Виталик Коптелов", + "email": "", + "phone": "+79144069116", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:27.011628", + "updated_at": "2026-03-15T05:42:27.011684", + "relations_count": 0 + }, + { + "id": 107, + "name": "Виталик Фролов", + "email": "", + "phone": "8 906 194-41-46", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:38.454000", + "updated_at": "2026-03-15T05:42:38.454095", + "relations_count": 0 + }, + { + "id": 42, + "name": "Витя Зос", + "email": "", + "phone": "+7 911 230-09-30", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:26.068814", + "updated_at": "2026-03-15T05:42:26.068848", + "relations_count": 0 + }, + { + "id": 80, + "name": "Витя Опар2", + "email": "", + "phone": "89992003135", + "organization": "", + "position": "", + "notes": "Уехал в Тайланд на полгода. Занимается спекуляцией крипты.\nИмееет дачу. Любит копаться в земле. Предлагает во второй половине 2025 заняться потолками.", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:32.467962", + "updated_at": "2026-03-15T05:42:32.468024", + "relations_count": 0 + }, + { + "id": 105, + "name": "Влад Богомолов", + "email": "", + "phone": "8 911 824-16-27", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:38.002532", + "updated_at": "2026-03-15T05:42:38.002588", + "relations_count": 0 + }, + { + "id": 21, + "name": "Владимир Артурович Березин", + "email": "", + "phone": "+79778491152", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:22.448377", + "updated_at": "2026-03-15T05:42:22.448400", + "relations_count": 0 + }, + { + "id": 182, + "name": "Волкова Александра Юрьевна", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:51.928588", + "updated_at": "2026-03-15T05:42:51.928611", + "relations_count": 0 + }, + { + "id": 25, + "name": "Галикеев Василь", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:23.210873", + "updated_at": "2026-03-15T05:42:23.210933", + "relations_count": 0 + }, + { + "id": 171, + "name": "Георгий Осипков", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "Помогает с контроллерами.", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:49.859344", + "updated_at": "2026-03-15T05:42:49.859372", + "relations_count": 0 + }, + { + "id": 168, + "name": "Георгий Подшивалов", + "email": "", + "phone": "+7 921 310 1889", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:49.448599", + "updated_at": "2026-03-15T05:42:49.448651", + "relations_count": 0 + }, + { + "id": 183, + "name": "Говоров Владимир Денисович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:52.015169", + "updated_at": "2026-03-15T05:42:52.015199", + "relations_count": 0 + }, + { + "id": 184, + "name": "Горбунов Николай Иванович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:52.209481", + "updated_at": "2026-03-15T05:42:52.209543", + "relations_count": 0 + }, + { + "id": 186, + "name": "Горбунов Станислав Александрович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:52.580351", + "updated_at": "2026-03-15T05:42:52.580380", + "relations_count": 1 + }, + { + "id": 185, + "name": "Горюнов Евгений Алексеевич", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:52.399745", + "updated_at": "2026-03-15T05:42:52.399934", + "relations_count": 0 + }, + { + "id": 187, + "name": "Гриненков Алексей Владимирович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:52.758699", + "updated_at": "2026-05-14T02:29:13.796983", + "relations_count": 1 + }, + { + "id": 237, + "name": "Гриценков Алексей Владимирович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:51:56.021181", + "updated_at": "2026-03-15T05:51:56.021228", + "relations_count": 0 + }, + { + "id": 188, + "name": "Гришманова Татьяна Александровна", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:53.016275", + "updated_at": "2026-03-15T05:42:53.016338", + "relations_count": 0 + }, + { + "id": 69, + "name": "Гулюта Сергей Михайлович", + "email": "", + "phone": "89214856521", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:30.476344", + "updated_at": "2026-03-15T05:42:30.476420", + "relations_count": 0 + }, + { + "id": 163, + "name": "Д.Г. Кореньков", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:48.694569", + "updated_at": "2026-03-15T05:42:48.694603", + "relations_count": 0 + }, + { + "id": 45, + "name": "Давлетшин Карим", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:26.694727", + "updated_at": "2026-03-15T05:42:26.694763", + "relations_count": 0 + }, + { + "id": 90, + "name": "Давлетшин Рустам Ринатович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:34.445382", + "updated_at": "2026-03-15T05:42:34.445455", + "relations_count": 0 + }, + { + "id": 130, + "name": "Даша Андреевна Драгун", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:42.253213", + "updated_at": "2026-03-15T05:42:42.253270", + "relations_count": 0 + }, + { + "id": 189, + "name": "Демиденко Дмитрий Алексеевич", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:53.189563", + "updated_at": "2026-03-15T05:42:53.189615", + "relations_count": 0 + }, + { + "id": 33, + "name": "Денис Гизатулин", + "email": "", + "phone": "+7 916 009-26-16", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:24.550248", + "updated_at": "2026-03-15T05:42:24.550276", + "relations_count": 0 + }, + { + "id": 97, + "name": "Дмитрий Александрович Сечко", + "email": "", + "phone": "+79210775033", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:35.640202", + "updated_at": "2026-03-15T05:42:35.640236", + "relations_count": 0 + }, + { + "id": 178, + "name": "Дмитрий Шторн", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:51.219239", + "updated_at": "2026-03-15T05:42:51.219274", + "relations_count": 0 + }, + { + "id": 19, + "name": "Добрынин Антон", + "email": "", + "phone": "8 987 019-58-65", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:22.154606", + "updated_at": "2026-03-15T05:42:22.154637", + "relations_count": 0 + }, + { + "id": 129, + "name": "Дочь", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:42.023423", + "updated_at": "2026-03-15T05:42:42.023498", + "relations_count": 0 + }, + { + "id": 38, + "name": "Дружинин", + "email": "", + "phone": "+79195548628", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:25.437295", + "updated_at": "2026-03-15T05:42:25.437329", + "relations_count": 0 + }, + { + "id": 29, + "name": "Душейко Владимир Владимирович", + "email": "", + "phone": "89216760552", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:23.965053", + "updated_at": "2026-03-15T05:42:23.965086", + "relations_count": 0 + }, + { + "id": 160, + "name": "Е.А. Горбунов", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:47.898581", + "updated_at": "2026-03-15T05:42:47.898632", + "relations_count": 0 + }, + { + "id": 164, + "name": "Евгений", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "Хорошо эрудирован. Не женат. Имеет 3д виртуальные очки. Приятен в общении. Проявил интерес к распечатанной турели.", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:48.816257", + "updated_at": "2026-03-15T05:42:48.816314", + "relations_count": 0 + }, + { + "id": 149, + "name": "Евгений Андрущенко", + "email": "", + "phone": "@EvgeniySPbRf", + "organization": "", + "position": "", + "notes": "Занимался стартапом по производству дронов полтора года.", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:45.637821", + "updated_at": "2026-03-15T05:42:45.637864", + "relations_count": 0 + }, + { + "id": 52, + "name": "Екатерина Наильевна Крикунова", + "email": "", + "phone": "89314171873", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:27.860197", + "updated_at": "2026-03-15T05:42:27.860221", + "relations_count": 0 + }, + { + "id": 147, + "name": "Екатерина Тихова", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:45.186628", + "updated_at": "2026-05-17T04:25:31.045777", + "relations_count": 1 + }, + { + "id": 190, + "name": "Ефимова Анна Сергеевна", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:53.360200", + "updated_at": "2026-03-15T05:42:53.360224", + "relations_count": 0 + }, + { + "id": 127, + "name": "Жена", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:41.628079", + "updated_at": "2026-03-15T05:42:41.628134", + "relations_count": 0 + }, + { + "id": 37, + "name": "Женя Додонов", + "email": "", + "phone": "+79119158495", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:25.229329", + "updated_at": "2026-03-15T05:42:25.229378", + "relations_count": 1 + }, + { + "id": 192, + "name": "Жуменков Сергей Васильевич", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:53.674630", + "updated_at": "2026-03-15T05:42:53.674681", + "relations_count": 2 + }, + { + "id": 191, + "name": "Журавлёв Алексей Сергеевич", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:53.517587", + "updated_at": "2026-03-15T05:42:53.517619", + "relations_count": 0 + }, + { + "id": 87, + "name": "Зайнулов Расим", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:33.807418", + "updated_at": "2026-03-15T05:42:33.807441", + "relations_count": 0 + }, + { + "id": 88, + "name": "Зайнулов Ринат Рафикович", + "email": "", + "phone": "+7 937 358-82-37", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:33.965442", + "updated_at": "2026-03-15T05:42:33.965506", + "relations_count": 0 + }, + { + "id": 92, + "name": "Зайнулов Рустам", + "email": "", + "phone": "+79991300454", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:34.715546", + "updated_at": "2026-03-15T05:42:34.715608", + "relations_count": 0 + }, + { + "id": 193, + "name": "Зайцев Сергей Александрович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:53.909059", + "updated_at": "2026-03-15T05:42:53.909094", + "relations_count": 0 + }, + { + "id": 82, + "name": "Звонков Павел", + "email": "", + "phone": "+79899568256", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:32.754444", + "updated_at": "2026-03-15T05:42:32.754466", + "relations_count": 0 + }, + { + "id": 194, + "name": "Знаменский Даниил Александрович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:54.053719", + "updated_at": "2026-03-15T05:42:54.053767", + "relations_count": 0 + }, + { + "id": 157, + "name": "И.В. Пашкевич", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:46.990213", + "updated_at": "2026-03-15T05:42:46.990246", + "relations_count": 1 + }, + { + "id": 62, + "name": "Иван Витальевич Малимон", + "email": "", + "phone": "89115805720", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:29.432589", + "updated_at": "2026-03-15T05:42:29.432621", + "relations_count": 0 + }, + { + "id": 1, + "name": "Иван Иванов", + "email": "ivan@test.com", + "phone": "", + "organization": "ООО Ромашка", + "position": "Директор", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-14T09:22:00.510250", + "updated_at": "2026-03-14T09:22:00.510270", + "relations_count": 5 + }, + { + "id": 195, + "name": "Иванов Максим Станиславович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:54.277661", + "updated_at": "2026-03-15T05:42:54.277753", + "relations_count": 0 + }, + { + "id": 56, + "name": "Игорь Павлович Лобода", + "email": "", + "phone": "89314067638", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:28.482372", + "updated_at": "2026-03-15T05:42:28.482405", + "relations_count": 0 + }, + { + "id": 174, + "name": "Икбол", + "email": "", + "phone": "89955918819", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:50.521550", + "updated_at": "2026-03-15T05:42:50.521583", + "relations_count": 0 + }, + { + "id": 118, + "name": "Илдус Якупов", + "email": "", + "phone": "+79279571795", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:40.186406", + "updated_at": "2026-03-15T05:42:40.186461", + "relations_count": 0 + }, + { + "id": 104, + "name": "Ильнур Тимиргазин", + "email": "", + "phone": "+7 962 533-96-56", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:37.781757", + "updated_at": "2026-03-15T05:42:37.781780", + "relations_count": 0 + }, + { + "id": 122, + "name": "Ильнур Янтур", + "email": "", + "phone": "+79196228909", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:40.758321", + "updated_at": "2026-03-15T05:42:40.758344", + "relations_count": 0 + }, + { + "id": 17, + "name": "Инсаф Якупов Анварович", + "email": "", + "phone": "+79128812711", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:21.784841", + "updated_at": "2026-03-15T05:42:21.784872", + "relations_count": 0 + }, + { + "id": 137, + "name": "Катя", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:43.597679", + "updated_at": "2026-03-15T05:42:43.597741", + "relations_count": 0 + }, + { + "id": 142, + "name": "Катя Полтавская", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:44.489662", + "updated_at": "2026-03-15T05:42:44.489694", + "relations_count": 0 + }, + { + "id": 145, + "name": "Кирилл", + "email": "", + "phone": "+79117315490", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:44.885619", + "updated_at": "2026-03-15T05:42:44.885650", + "relations_count": 0 + }, + { + "id": 106, + "name": "Клименко Андрей Федорович", + "email": "", + "phone": "89217818881", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:38.242982", + "updated_at": "2026-03-15T05:42:38.243003", + "relations_count": 0 + }, + { + "id": 196, + "name": "Кобяшев Евгений Владимирович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:54.437218", + "updated_at": "2026-03-15T05:42:54.437268", + "relations_count": 0 + }, + { + "id": 197, + "name": "Колесников Максим Павлович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:54.590576", + "updated_at": "2026-03-15T05:42:54.590598", + "relations_count": 0 + }, + { + "id": 198, + "name": "Колесов Иван Сергеевич", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:54.740101", + "updated_at": "2026-03-15T05:42:54.740195", + "relations_count": 0 + }, + { + "id": 199, + "name": "Комарова Яна Александровна", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:54.905062", + "updated_at": "2026-03-15T05:42:54.905085", + "relations_count": 0 + }, + { + "id": 200, + "name": "Конюхов Геннадий Вячеславович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:55.006505", + "updated_at": "2026-03-15T05:42:55.006567", + "relations_count": 0 + }, + { + "id": 50, + "name": "Котляров", + "email": "", + "phone": "89112600481", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:27.609595", + "updated_at": "2026-03-15T05:42:27.609626", + "relations_count": 0 + }, + { + "id": 30, + "name": "Котляров Вова", + "email": "", + "phone": "+7 915 733-92-97", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:24.101293", + "updated_at": "2026-03-15T05:42:24.101511", + "relations_count": 0 + }, + { + "id": 72, + "name": "Кристина Мысцева", + "email": "", + "phone": "+79062805558", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:30.995906", + "updated_at": "2026-03-15T05:42:30.995941", + "relations_count": 0 + }, + { + "id": 51, + "name": "Ксюша Пулатова(Красникова)", + "email": "", + "phone": "+79516535670", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:27.723198", + "updated_at": "2026-03-15T05:42:27.723250", + "relations_count": 0 + }, + { + "id": 201, + "name": "Кузнецов Кирилл Вячеславович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:55.230256", + "updated_at": "2026-03-15T05:42:55.230279", + "relations_count": 0 + }, + { + "id": 202, + "name": "Куликовских Юлия Валентиновна", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:55.411693", + "updated_at": "2026-05-14T02:29:12.002232", + "relations_count": 0 + }, + { + "id": 159, + "name": "Л.А. Мартынова", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:47.698918", + "updated_at": "2026-03-15T05:42:47.698956", + "relations_count": 0 + }, + { + "id": 54, + "name": "Лаврищев", + "email": "", + "phone": "89210866646", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:28.151721", + "updated_at": "2026-03-15T05:42:28.151848", + "relations_count": 0 + }, + { + "id": 27, + "name": "Леонид Вилисов", + "email": "", + "phone": "+7 914 155-22-98", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:23.620436", + "updated_at": "2026-03-15T05:42:23.620460", + "relations_count": 0 + }, + { + "id": 10, + "name": "Лилия Ильясовна Аглиуллина", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:20.522723", + "updated_at": "2026-03-15T05:42:20.522781", + "relations_count": 0 + }, + { + "id": 9, + "name": "Лиля Аглиулина", + "email": "", + "phone": "+7 960 397-55-50", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:20.345590", + "updated_at": "2026-03-15T05:42:20.345656", + "relations_count": 0 + }, + { + "id": 203, + "name": "Литовченко Сергей Анатольевич", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:55.586908", + "updated_at": "2026-03-15T05:42:55.586938", + "relations_count": 0 + }, + { + "id": 61, + "name": "Люба", + "email": "", + "phone": "89212446797", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:29.268614", + "updated_at": "2026-03-15T05:42:29.268666", + "relations_count": 0 + }, + { + "id": 151, + "name": "Любовь Александровна", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:46.004330", + "updated_at": "2026-03-15T05:42:46.004404", + "relations_count": 0 + }, + { + "id": 41, + "name": "Маким Зайцев", + "email": "", + "phone": "+79276369798", + "organization": "", + "position": "", + "notes": "Занимается стройкой\nИграет в танки и знакомится с нужными людьми. Купил квартиру в Деме. Не женат. Обычно интересуется родителями.\nЛетом 2024 ездил на Дагестан. Жил в слоеном доме. НГ 2025 встречает с очередной девушкой.\nвстречает НГ с родителями девушки в Иглино\nСозванивались. В январе разошлись с партнером. Вместе работали 8 лет. Открыл свою фирму. СНН.", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:25.934153", + "updated_at": "2026-03-15T05:42:25.934186", + "relations_count": 0 + }, + { + "id": 138, + "name": "Максим Сергеевич Бабинцев", + "email": "", + "phone": "+79523657942", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:43.798677", + "updated_at": "2026-03-15T05:42:43.798738", + "relations_count": 0 + }, + { + "id": 177, + "name": "Максим Филипович Шарп", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:51.046857", + "updated_at": "2026-03-15T05:42:51.046902", + "relations_count": 0 + }, + { + "id": 28, + "name": "Малимон Витальевич", + "email": "", + "phone": "+7 911 007-25-75", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:23.804031", + "updated_at": "2026-03-15T05:42:23.804123", + "relations_count": 0 + }, + { + "id": 16, + "name": "Малинков Юрий Анатольевич", + "email": "", + "phone": "+79212441013", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:21.586650", + "updated_at": "2026-03-15T05:42:21.586764", + "relations_count": 0 + }, + { + "id": 204, + "name": "Малышев Владислав Александрович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:55.856786", + "updated_at": "2026-03-15T05:42:55.856851", + "relations_count": 0 + }, + { + "id": 205, + "name": "Малышкин Геннадий Александрович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:56.021720", + "updated_at": "2026-03-15T05:42:56.021742", + "relations_count": 0 + }, + { + "id": 5, + "name": "Малюк Андрей Андреевич", + "email": "", + "phone": "+7 996 502-13-72", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:19.849063", + "updated_at": "2026-03-15T05:42:19.849090", + "relations_count": 0 + }, + { + "id": 76, + "name": "Малюк Андрей Новый", + "email": "", + "phone": "+7 978 968-41-17", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:31.688292", + "updated_at": "2026-03-15T05:42:31.688328", + "relations_count": 0 + }, + { + "id": 67, + "name": "Мама", + "email": "", + "phone": "+7 931 376-43-75", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:30.160936", + "updated_at": "2026-03-15T05:42:30.160960", + "relations_count": 0 + }, + { + "id": 206, + "name": "Марасёв Станислав Евгеньевич", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:56.212143", + "updated_at": "2026-03-15T05:42:56.212208", + "relations_count": 0 + }, + { + "id": 11, + "name": "Марат Жаксыбаевич Адылханов", + "email": "", + "phone": "+79314061507", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:20.721503", + "updated_at": "2026-03-15T05:42:20.721558", + "relations_count": 0 + }, + { + "id": 53, + "name": "Марат Купаев", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:28.015164", + "updated_at": "2026-03-15T05:42:28.015198", + "relations_count": 0 + }, + { + "id": 66, + "name": "Марина Борисовна Малюк", + "email": "", + "phone": "+79115912127", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:30.033225", + "updated_at": "2026-03-15T05:42:30.033287", + "relations_count": 0 + }, + { + "id": 120, + "name": "Марина Якупова", + "email": "", + "phone": "8 (981) 758-69-35", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:40.414894", + "updated_at": "2026-03-15T05:42:40.414917", + "relations_count": 0 + }, + { + "id": 2, + "name": "Мария Петрова", + "email": "maria@test.com", + "phone": "", + "organization": "Газпром", + "position": "Аналитик", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-14T09:22:00.512129", + "updated_at": "2026-03-14T09:22:00.512140", + "relations_count": 2 + }, + { + "id": 207, + "name": "Марков Антон Викторович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:56.404157", + "updated_at": "2026-03-15T05:42:56.404193", + "relations_count": 0 + }, + { + "id": 140, + "name": "Милош Бороцкий", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "Ездил на СВО 2024 году. По возвращении ию проблемы с коленом.\nДочь учится в частной школе.", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:44.124123", + "updated_at": "2026-05-14T02:29:36.836569", + "relations_count": 0 + }, + { + "id": 208, + "name": "Митрохин Виктор Сергеевич", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:56.539372", + "updated_at": "2026-03-15T05:42:56.539432", + "relations_count": 0 + }, + { + "id": 43, + "name": "Мухаметов Ильнар", + "email": "", + "phone": "+7 999 669-33-67", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:26.346481", + "updated_at": "2026-03-15T05:42:26.346515", + "relations_count": 0 + }, + { + "id": 14, + "name": "Мясников Александр", + "email": "", + "phone": "+79210717608", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:21.153553", + "updated_at": "2026-03-15T05:42:21.153629", + "relations_count": 0 + }, + { + "id": 68, + "name": "Надежда Манхеттен", + "email": "", + "phone": "8 921 898-25-85", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:30.333943", + "updated_at": "2026-03-15T05:42:30.334007", + "relations_count": 0 + }, + { + "id": 209, + "name": "Назарова Александра Викторовна", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:56.695813", + "updated_at": "2026-03-15T05:42:56.695874", + "relations_count": 0 + }, + { + "id": 63, + "name": "Настя Малимон", + "email": "", + "phone": "+79116852335", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:29.557319", + "updated_at": "2026-03-15T05:42:29.557349", + "relations_count": 0 + }, + { + "id": 112, + "name": "Настя Шакирова", + "email": "", + "phone": "+79214854728", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:39.288538", + "updated_at": "2026-03-15T05:42:39.288597", + "relations_count": 0 + }, + { + "id": 22, + "name": "Наталья Мама Бори", + "email": "", + "phone": "+7 903 466-07-20", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:22.591864", + "updated_at": "2026-03-15T05:42:22.591911", + "relations_count": 0 + }, + { + "id": 176, + "name": "Наур", + "email": "", + "phone": "@vozhd77", + "organization": "", + "position": "", + "notes": "На Донбассе. Воюет с 2014.", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:50.879448", + "updated_at": "2026-03-15T05:42:50.879500", + "relations_count": 0 + }, + { + "id": 210, + "name": "Некрасов Алексей Николаевич", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:56.839335", + "updated_at": "2026-03-15T05:42:56.839357", + "relations_count": 0 + }, + { + "id": 218, + "name": "Ненашев Александр Валерьевич", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:58.504178", + "updated_at": "2026-03-15T05:42:58.504208", + "relations_count": 0 + }, + { + "id": 170, + "name": "Никита Алексеевич Затеев", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:49.721524", + "updated_at": "2026-03-15T05:42:49.721579", + "relations_count": 0 + }, + { + "id": 219, + "name": "Николаев Антон Сергеевич", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:58.695709", + "updated_at": "2026-03-15T05:42:58.695742", + "relations_count": 0 + }, + { + "id": 211, + "name": "Николаев Игорь Владимирович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:56.952521", + "updated_at": "2026-03-15T05:42:56.952560", + "relations_count": 0 + }, + { + "id": 35, + "name": "Николай Александрович Горбаненко", + "email": "", + "phone": "89218139891", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:24.799763", + "updated_at": "2026-03-15T05:42:24.799844", + "relations_count": 0 + }, + { + "id": 166, + "name": "Николай Крюков", + "email": "", + "phone": "+7 960 235-13-56", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:49.132857", + "updated_at": "2026-03-15T05:42:49.132894", + "relations_count": 0 + }, + { + "id": 111, + "name": "Николай Петрович Черный", + "email": "", + "phone": "89210705228", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:39.122687", + "updated_at": "2026-03-15T05:42:39.122711", + "relations_count": 0 + }, + { + "id": 212, + "name": "Новиков Вадим Евгеньевич", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:57.165483", + "updated_at": "2026-03-15T05:42:57.165540", + "relations_count": 0 + }, + { + "id": 128, + "name": "Оксана", + "email": "", + "phone": "+7 953 171-32-13", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:41.844615", + "updated_at": "2026-03-15T05:42:41.844665", + "relations_count": 0 + }, + { + "id": 78, + "name": "Оксана Огнева", + "email": "", + "phone": "8 911 006-84-43", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:32.128593", + "updated_at": "2026-03-15T05:42:32.128615", + "relations_count": 0 + }, + { + "id": 59, + "name": "Олег Викторович Лопатин", + "email": "", + "phone": "89214814746", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:28.967747", + "updated_at": "2026-03-15T05:42:28.967770", + "relations_count": 0 + }, + { + "id": 79, + "name": "Онищенко", + "email": "", + "phone": "89121724618", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:32.323844", + "updated_at": "2026-03-15T05:42:32.323931", + "relations_count": 0 + }, + { + "id": 220, + "name": "Осечкин Роман Александрович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:58.814577", + "updated_at": "2026-03-15T05:42:58.814638", + "relations_count": 0 + }, + { + "id": 221, + "name": "Осмолин Владимир Владимирович", + "email": "", + "phone": "89215581401", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:58.979122", + "updated_at": "2026-03-15T05:42:58.979146", + "relations_count": 0 + }, + { + "id": 222, + "name": "Остапенко Никита Романович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:59.178463", + "updated_at": "2026-03-15T05:42:59.178505", + "relations_count": 0 + }, + { + "id": 64, + "name": "Отец Малимона", + "email": "", + "phone": "+79218642151", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:29.746834", + "updated_at": "2026-05-10T07:24:10.889352", + "relations_count": 0 + }, + { + "id": 101, + "name": "Отец Спб", + "email": "", + "phone": "+79110046322", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:36.471719", + "updated_at": "2026-03-15T05:42:36.471754", + "relations_count": 0 + }, + { + "id": 124, + "name": "Павел", + "email": "", + "phone": "@Pavel0880", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:41.105890", + "updated_at": "2026-03-15T05:42:41.105948", + "relations_count": 0 + }, + { + "id": 58, + "name": "Павел Локтев", + "email": "", + "phone": "8 (904) 613-59-68", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:28.785208", + "updated_at": "2026-03-15T05:42:28.785257", + "relations_count": 0 + }, + { + "id": 141, + "name": "Павел Полтавский", + "email": "", + "phone": "+79214944569", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:44.301654", + "updated_at": "2026-03-15T05:42:44.301688", + "relations_count": 0 + }, + { + "id": 223, + "name": "Павлов Алексей Александрович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:59.377177", + "updated_at": "2026-03-15T05:42:59.377198", + "relations_count": 0 + }, + { + "id": 213, + "name": "Павлов Дмитрий Александрович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:57.361861", + "updated_at": "2026-03-15T05:42:57.361884", + "relations_count": 0 + }, + { + "id": 214, + "name": "Панфёрова Галина Сергеевна", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:57.623999", + "updated_at": "2026-03-15T05:42:57.624050", + "relations_count": 0 + }, + { + "id": 83, + "name": "Паша Полтавский", + "email": "", + "phone": "+79214944569", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:32.916372", + "updated_at": "2026-03-15T05:42:32.916419", + "relations_count": 0 + }, + { + "id": 224, + "name": "Пашкевич Иван Владимирович", + "email": "", + "phone": "89119330006", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:59.552678", + "updated_at": "2026-03-15T05:42:59.552707", + "relations_count": 0 + }, + { + "id": 215, + "name": "Петрова Юлия Михайловна", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:57.755890", + "updated_at": "2026-03-15T05:42:57.755913", + "relations_count": 0 + }, + { + "id": 225, + "name": "Подшивалов Георгий Андреевич", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "Начальник сектора", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:59.690426", + "updated_at": "2026-05-14T02:33:17.478583", + "relations_count": 0 + }, + { + "id": 216, + "name": "Поляков Сергей Александрович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:58.005579", + "updated_at": "2026-03-15T05:42:58.005636", + "relations_count": 0 + }, + { + "id": 217, + "name": "Попова Анна Викторовна", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:58.305717", + "updated_at": "2026-03-15T05:42:58.305751", + "relations_count": 0 + }, + { + "id": 84, + "name": "Прокат Вело", + "email": "", + "phone": "88129093672", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:33.065999", + "updated_at": "2026-03-15T05:42:33.066061", + "relations_count": 0 + }, + { + "id": 44, + "name": "Радик Ишмаев", + "email": "", + "phone": "89272495520", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:26.522407", + "updated_at": "2026-03-15T05:42:26.522463", + "relations_count": 0 + }, + { + "id": 85, + "name": "Радмила", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:33.204502", + "updated_at": "2026-03-15T05:42:33.204554", + "relations_count": 0 + }, + { + "id": 86, + "name": "Радмир", + "email": "", + "phone": "+79373021892", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:33.596383", + "updated_at": "2026-03-15T05:42:33.596434", + "relations_count": 0 + }, + { + "id": 77, + "name": "Рамис Новый", + "email": "", + "phone": "8 962 693-28-84", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:31.968989", + "updated_at": "2026-03-15T05:42:31.969050", + "relations_count": 0 + }, + { + "id": 100, + "name": "Рамис Сосед", + "email": "", + "phone": "+7 931 982-62-48", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:36.244482", + "updated_at": "2026-03-15T05:42:36.244531", + "relations_count": 0 + }, + { + "id": 173, + "name": "Регина", + "email": "", + "phone": "89817262898", + "organization": "", + "position": "", + "notes": "Жена Икбола. Знакома с Сократом. Общительная.", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:50.277355", + "updated_at": "2026-03-15T05:42:50.277395", + "relations_count": 0 + }, + { + "id": 12, + "name": "Ренат Наильевич Аитов", + "email": "", + "phone": "+79657986479", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:20.888703", + "updated_at": "2026-03-15T05:42:20.888850", + "relations_count": 0 + }, + { + "id": 121, + "name": "Римма Якупова", + "email": "", + "phone": "+7 937 309-17-17", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:40.537990", + "updated_at": "2026-03-15T05:42:40.538052", + "relations_count": 0 + }, + { + "id": 13, + "name": "Ринат Аитов", + "email": "", + "phone": "89214870226", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:21.038669", + "updated_at": "2026-03-15T05:42:21.038701", + "relations_count": 0 + }, + { + "id": 119, + "name": "Ринат Ильгизович Якупов", + "email": "rinatka7@bk.ru", + "phone": "+79967980562", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:40.320586", + "updated_at": "2026-03-15T05:42:40.320632", + "relations_count": 0 + }, + { + "id": 110, + "name": "Роман Ринатович Хусаинов", + "email": "", + "phone": "89214912576", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:38.977862", + "updated_at": "2026-03-15T05:42:38.977918", + "relations_count": 0 + }, + { + "id": 162, + "name": "С.А. Горбунов", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:48.475001", + "updated_at": "2026-03-15T05:42:48.475063", + "relations_count": 0 + }, + { + "id": 94, + "name": "Сафура", + "email": "", + "phone": "+79053542960", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:35.181564", + "updated_at": "2026-03-15T05:42:35.181586", + "relations_count": 0 + }, + { + "id": 91, + "name": "Света Казань родственники", + "email": "", + "phone": "+79655908514", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:34.580369", + "updated_at": "2026-03-15T05:42:34.580392", + "relations_count": 0 + }, + { + "id": 98, + "name": "Света Симановская", + "email": "", + "phone": "8 981 803-22-09", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:35.911553", + "updated_at": "2026-03-15T05:42:35.911609", + "relations_count": 0 + }, + { + "id": 36, + "name": "Светлана Гулюта", + "email": "", + "phone": "89214835894", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:24.983954", + "updated_at": "2026-03-15T05:42:24.983987", + "relations_count": 0 + }, + { + "id": 165, + "name": "Светлана Морозова", + "email": "", + "phone": "@Svetlana_Morozova_Electropribor", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:49.010547", + "updated_at": "2026-03-15T05:42:49.010600", + "relations_count": 0 + }, + { + "id": 135, + "name": "Сергей Константинович Сурин", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "Офицер энергонадзора в Можайке. Зп 65 тр. Подрабатывает монтажом под ключ. 2 разряд по пауерлифтингу получил в Няндоме(показывал фото). Планирует уволиться в 2026 году.", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:43.227613", + "updated_at": "2026-03-15T05:42:43.227643", + "relations_count": 0 + }, + { + "id": 40, + "name": "Серега Емельянович", + "email": "", + "phone": "+79154189674", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:25.778921", + "updated_at": "2026-03-15T05:42:25.779010", + "relations_count": 0 + }, + { + "id": 70, + "name": "Сечко Москва", + "email": "", + "phone": "+79046590150", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:30.667676", + "updated_at": "2026-03-15T05:42:30.667719", + "relations_count": 0 + }, + { + "id": 227, + "name": "Смирнов Алексей Сергеевич", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:59.940627", + "updated_at": "2026-03-15T05:42:59.940665", + "relations_count": 0 + }, + { + "id": 148, + "name": "Соня", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:45.397991", + "updated_at": "2026-03-15T05:42:45.398043", + "relations_count": 0 + }, + { + "id": 228, + "name": "Стариков Александр Иванович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:43:00.097057", + "updated_at": "2026-03-15T05:43:00.097091", + "relations_count": 0 + }, + { + "id": 169, + "name": "Стас Маросев", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:49.581718", + "updated_at": "2026-05-14T02:33:20.778179", + "relations_count": 0 + }, + { + "id": 102, + "name": "Степан", + "email": "", + "phone": "+7 914 849-46-02", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:36.628573", + "updated_at": "2026-05-17T04:27:40.531840", + "relations_count": 1 + }, + { + "id": 48, + "name": "Степан Королев", + "email": "st.korolev@list.ru", + "phone": "+79817014384", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:27.251878", + "updated_at": "2026-05-10T08:17:19.742143", + "relations_count": 0 + }, + { + "id": 103, + "name": "Тарасов", + "email": "", + "phone": "+7 911 975-03-84", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:36.783930", + "updated_at": "2026-03-15T05:42:36.783953", + "relations_count": 0 + }, + { + "id": 144, + "name": "Татьяна", + "email": "", + "phone": "+7 995 628 4534", + "organization": "", + "position": "", + "notes": "Бизнес вумен. Учится по вечерам - студентка. Много работатет - рискует перегореть.", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:44.770697", + "updated_at": "2026-03-15T05:42:44.770720", + "relations_count": 0 + }, + { + "id": 65, + "name": "Теща Малимона", + "email": "", + "phone": "+79112195520", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:29.911947", + "updated_at": "2026-03-15T05:42:29.912041", + "relations_count": 0 + }, + { + "id": 229, + "name": "Тимофеев Виталий Николаевич", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:43:00.253713", + "updated_at": "2026-03-15T05:43:00.253775", + "relations_count": 0 + }, + { + "id": 226, + "name": "Топалов Владимир Владимирович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:59.808641", + "updated_at": "2026-03-15T05:42:59.808662", + "relations_count": 0 + }, + { + "id": 31, + "name": "Тумский В Г", + "email": "", + "phone": "89314156919", + "organization": "", + "position": "", + "notes": "ФГУП СКБ \\\"Титан\\\"", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:24.220384", + "updated_at": "2026-03-15T05:42:24.220434", + "relations_count": 0 + }, + { + "id": 230, + "name": "Тюрюхин Михаил Евгеньевич", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:43:00.418988", + "updated_at": "2026-03-15T05:43:00.419044", + "relations_count": 0 + }, + { + "id": 231, + "name": "Тюфряк Андрей Валерьевич", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:43:00.611877", + "updated_at": "2026-03-15T05:43:00.611957", + "relations_count": 0 + }, + { + "id": 236, + "name": "Устин", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:43:01.294031", + "updated_at": "2026-03-15T05:43:01.294088", + "relations_count": 0 + }, + { + "id": 232, + "name": "Ушаков Сергей Иванович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:43:00.747236", + "updated_at": "2026-03-15T05:43:00.747271", + "relations_count": 0 + }, + { + "id": 233, + "name": "Филименко Ян Игоревич", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:43:00.872021", + "updated_at": "2026-03-15T05:43:00.872045", + "relations_count": 0 + }, + { + "id": 234, + "name": "Чапков Руслан Ильгизович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:43:01.027109", + "updated_at": "2026-03-15T05:43:01.027145", + "relations_count": 0 + }, + { + "id": 4, + "name": "Шакиров Айдар", + "email": "", + "phone": "+79214854729", + "organization": "", + "position": "", + "notes": "https://yar.diskstation.me/dokuwiki/doku.php?id=wiki:parking:forum:forum", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:19.669385", + "updated_at": "2026-03-15T05:42:19.669415", + "relations_count": 0 + }, + { + "id": 23, + "name": "Шива Вадим", + "email": "", + "phone": "+380661894022", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:22.791033", + "updated_at": "2026-03-15T05:42:22.791095", + "relations_count": 0 + }, + { + "id": 117, + "name": "Шоди", + "email": "", + "phone": "8 921 641-40-97", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:40.008786", + "updated_at": "2026-03-15T05:42:40.008905", + "relations_count": 0 + }, + { + "id": 8, + "name": "Эмиль Аглиулин", + "email": "", + "phone": "89603975444", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:20.203159", + "updated_at": "2026-03-15T05:42:20.203228", + "relations_count": 0 + }, + { + "id": 7, + "name": "Яковлев А. А", + "email": "", + "phone": "89815539615", + "organization": "", + "position": "", + "notes": "\\\"ЦЕНКИ\\\" НИИСК", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:20.034206", + "updated_at": "2026-03-15T05:42:20.034245", + "relations_count": 0 + }, + { + "id": 235, + "name": "Яковлев Сергей Николаевич", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:43:01.170322", + "updated_at": "2026-03-15T05:43:01.170368", + "relations_count": 0 + }, + { + "id": 18, + "name": "Якупов Илдус Анварович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:21.962744", + "updated_at": "2026-05-17T13:55:24.151928", + "relations_count": 0 + }, + { + "id": 96, + "name": "Якупова Света", + "email": "", + "phone": "+7 937 308-53-58", + "organization": "", + "position": "", + "notes": "", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:35.513494", + "updated_at": "2026-03-15T05:42:35.513558", + "relations_count": 0 + }, + { + "id": 132, + "name": "Яна Яновна", + "email": "", + "phone": "89110063164", + "organization": "", + "position": "", + "notes": "Регистрация брака. 27.09.2024", + "life_sphere": "other", + "network_circle": "productivity", + "importance": 3, + "include_on_network_map": false, + "map_angle": null, + "map_radius_ratio": null, + "created_at": "2026-03-15T05:42:42.636658", + "updated_at": "2026-03-15T05:42:42.636726", + "relations_count": 0 + } + ], + "relations": [ + { + "id": 1, + "source": 1, + "source_name": "Иван Иванов", + "target": 2, + "target_name": "Мария Петрова", + "relation_type": "colleague", + "description": "Партнёры по проекту", + "interaction_intensity": "intense", + "created_at": "2026-03-14T09:22:00.514711" + }, + { + "id": 2, + "source": 1, + "source_name": "Иван Иванов", + "target": 3, + "target_name": "Алексей Смирнов", + "relation_type": "friend", + "description": "", + "interaction_intensity": "intense", + "created_at": "2026-03-14T09:22:00.516057" + }, + { + "id": 3, + "source": 3, + "source_name": "Алексей Смирнов", + "target": 1, + "target_name": "Иван Иванов", + "relation_type": "acquaintance", + "description": "", + "interaction_intensity": "intense", + "created_at": "2026-03-15T04:59:10.431002" + }, + { + "id": 4, + "source": 2, + "source_name": "Мария Петрова", + "target": 1, + "target_name": "Иван Иванов", + "relation_type": "business", + "description": "", + "interaction_intensity": "intense", + "created_at": "2026-03-15T05:00:23.796924" + }, + { + "id": 5, + "source": 186, + "source_name": "Горбунов Станислав Александрович", + "target": 157, + "target_name": "И.В. Пашкевич", + "relation_type": "colleague", + "description": "Отношение нейтральные", + "interaction_intensity": "intense", + "created_at": "2026-03-15T05:48:15.751607" + }, + { + "id": 6, + "source": 37, + "source_name": "Женя Додонов", + "target": 192, + "target_name": "Жуменков Сергей Васильевич", + "relation_type": "acquaintance", + "description": "", + "interaction_intensity": "intense", + "created_at": "2026-03-15T05:54:44.442326" + }, + { + "id": 7, + "source": 192, + "source_name": "Жуменков Сергей Васильевич", + "target": 113, + "target_name": "Аглиулин Эмиль Шамилевич", + "relation_type": "acquaintance", + "description": "", + "interaction_intensity": "intense", + "created_at": "2026-03-15T05:57:57.794219" + }, + { + "id": 8, + "source": 1, + "source_name": "Иван Иванов", + "target": 113, + "target_name": "Аглиулин Эмиль Шамилевич", + "relation_type": "acquaintance", + "description": "", + "interaction_intensity": "intense", + "created_at": "2026-03-15T15:22:39.588059" + }, + { + "id": 9, + "source": 147, + "source_name": "Екатерина Тихова", + "target": 109, + "target_name": "Алексей Ходосов", + "relation_type": "acquaintance", + "description": "", + "interaction_intensity": "intense", + "created_at": "2026-05-10T07:47:58.237244" + }, + { + "id": 10, + "source": 181, + "source_name": "Быкова Валентина Сергеевна", + "target": 187, + "target_name": "Гриненков Алексей Владимирович", + "relation_type": "colleague", + "description": "ПНачальник- подчиненный", + "interaction_intensity": "intense", + "created_at": "2026-05-14T02:35:57.602865" + }, + { + "id": 11, + "source": 102, + "source_name": "Степан", + "target": 20, + "target_name": "Артур Ахмедзянов", + "relation_type": "acquaintance", + "description": "", + "interaction_intensity": "intense", + "created_at": "2026-05-17T04:23:43.374514" + }, + { + "id": 12, + "source": 161, + "source_name": "А.В. Бельченко", + "target": 20, + "target_name": "Артур Ахмедзянов", + "relation_type": "acquaintance", + "description": "", + "interaction_intensity": "intense", + "created_at": "2026-05-17T13:53:03.182697" + } + ] +} \ No newline at end of file diff --git a/backups/full-backup-2026-06-24.json b/backups/full-backup-2026-06-24.json new file mode 100644 index 0000000..f64674a --- /dev/null +++ b/backups/full-backup-2026-06-24.json @@ -0,0 +1,2985 @@ +{ + "version": 2, + "exportedAt": "2026-06-24", + "source": "django-backup-before-rollback", + "contacts": [ + { + "id": 161, + "name": "А.В. Бельченко", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:48.040973", + "updated_at": "2026-03-15T05:42:48.040995", + "relations_count": 1 + }, + { + "id": 154, + "name": "А.И. Машошин", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:46.596607", + "updated_at": "2026-03-15T05:42:46.596669", + "relations_count": 0 + }, + { + "id": 153, + "name": "А.И. Стариков", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "Начальник сектора", + "created_at": "2026-03-15T05:42:46.438511", + "updated_at": "2026-05-14T02:29:17.773428", + "relations_count": 0 + }, + { + "id": 115, + "name": "Аглиулин Шамиль", + "email": "", + "phone": "+79610464441", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:39.717558", + "updated_at": "2026-03-15T05:42:39.717620", + "relations_count": 0 + }, + { + "id": 113, + "name": "Аглиулин Эмиль Шамилевич", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:39.418904", + "updated_at": "2026-03-15T05:42:39.418936", + "relations_count": 2 + }, + { + "id": 114, + "name": "Аглиулина Милена Шамилевна", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:39.564127", + "updated_at": "2026-03-15T05:42:39.564183", + "relations_count": 0 + }, + { + "id": 32, + "name": "Айрат Габидулин", + "email": "", + "phone": "+79963093836", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:24.423395", + "updated_at": "2026-03-15T05:42:24.423418", + "relations_count": 0 + }, + { + "id": 133, + "name": "Александр Александрович Александров", + "email": "", + "phone": "+79013454293", + "organization": "", + "position": "", + "notes": "Главный координационный центр. Подполковник. 2024 учился в Военном институте связи в Спб. Зп 150 тр. Москва для людей. Наслаждается жизнью. Работает 1\\3. Показывал фото дочери.", + "created_at": "2026-03-15T05:42:42.831933", + "updated_at": "2026-03-15T05:42:42.832028", + "relations_count": 0 + }, + { + "id": 39, + "name": "Александр Александрович Елисеев", + "email": "", + "phone": "89214891842", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:25.585459", + "updated_at": "2026-03-15T05:42:25.585502", + "relations_count": 0 + }, + { + "id": 26, + "name": "Александр Взрввозащита", + "email": "", + "phone": "8 911 166-65-65", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:23.390347", + "updated_at": "2026-03-15T05:42:23.390410", + "relations_count": 0 + }, + { + "id": 93, + "name": "Александр Сайкин", + "email": "", + "phone": "+79295831376", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:34.857700", + "updated_at": "2026-03-15T05:42:34.857734", + "relations_count": 0 + }, + { + "id": 15, + "name": "Александр Эдуардович Алексюк", + "email": "", + "phone": "+79212955441", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:21.310263", + "updated_at": "2026-03-15T05:42:21.310325", + "relations_count": 0 + }, + { + "id": 71, + "name": "Алексей Викторович Мурзаев", + "email": "", + "phone": "+79214764550", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:30.846868", + "updated_at": "2026-03-15T05:42:30.846964", + "relations_count": 0 + }, + { + "id": 150, + "name": "Алексей Кузнецов", + "email": "", + "phone": "89126503557", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:45.811440", + "updated_at": "2026-03-15T05:42:45.811501", + "relations_count": 0 + }, + { + "id": 123, + "name": "Алексей Михайлович Кузенков", + "email": "", + "phone": "+79219619580", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:40.945453", + "updated_at": "2026-03-15T05:42:40.945507", + "relations_count": 0 + }, + { + "id": 139, + "name": "Алексей Павлов", + "email": "", + "phone": "+7996450-29-19", + "organization": "", + "position": "", + "notes": "Вспыльчив. Любит поговорить. Обостренное чувство честности. Мнителен.\nНа НГ планировал уволиться (причины: вопросы с дочкой, и видимо товарищ предложил работу программистом с более высокой оплатой). Уговорили остаться уважаемые люди + выплатили высокую премию. Вышел на удаленку.", + "created_at": "2026-03-15T05:42:43.966363", + "updated_at": "2026-05-14T02:29:22.513547", + "relations_count": 0 + }, + { + "id": 3, + "name": "Алексей Смирнов", + "email": "", + "phone": "", + "organization": "Яндекс", + "position": "Разработчик", + "notes": "", + "created_at": "2026-03-14T09:22:00.513396", + "updated_at": "2026-03-14T09:22:00.513406", + "relations_count": 2 + }, + { + "id": 109, + "name": "Алексей Ходосов", + "email": "dion26rus@gmail.com", + "phone": "89216786805", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:38.789024", + "updated_at": "2026-05-14T02:21:45.391178", + "relations_count": 1 + }, + { + "id": 131, + "name": "Алина Корги", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:42.433588", + "updated_at": "2026-03-15T05:42:42.433627", + "relations_count": 0 + }, + { + "id": 89, + "name": "Алла Риелтер", + "email": "", + "phone": "8 962 720-36-73", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:34.184510", + "updated_at": "2026-03-15T05:42:34.184601", + "relations_count": 0 + }, + { + "id": 73, + "name": "Анатолий Мысов", + "email": "", + "phone": "+79214730344", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:31.179714", + "updated_at": "2026-03-15T05:42:31.179736", + "relations_count": 0 + }, + { + "id": 126, + "name": "Андрей", + "email": "", + "phone": "+7 (931) 964-80-47", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:41.471021", + "updated_at": "2026-03-15T05:42:41.471054", + "relations_count": 0 + }, + { + "id": 146, + "name": "Андрей Наумов", + "email": "", + "phone": "+79522867684", + "organization": "", + "position": "", + "notes": "Женат. Дочь. Большой опыт в электромонтаже. Душа компании. Располагает к себе людей. Хорошо ладит с детьми. Мягкий. Добросовестный. Трудолюбивый.\nДальнозорк", + "created_at": "2026-03-15T05:42:44.997469", + "updated_at": "2026-03-15T05:42:44.997494", + "relations_count": 0 + }, + { + "id": 74, + "name": "Андрей Николаев", + "email": "", + "phone": "89815639450", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:31.329122", + "updated_at": "2026-03-15T05:42:31.329184", + "relations_count": 0 + }, + { + "id": 75, + "name": "Андрей Николаев Моск", + "email": "", + "phone": "+79257177037", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:31.519869", + "updated_at": "2026-03-15T05:42:31.519943", + "relations_count": 0 + }, + { + "id": 152, + "name": "Андрей Шафранюк", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "к.т.н", + "created_at": "2026-03-15T05:42:46.258186", + "updated_at": "2026-03-15T05:42:46.258209", + "relations_count": 0 + }, + { + "id": 81, + "name": "Андрюха Орлов", + "email": "", + "phone": "89642960683", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:32.655827", + "updated_at": "2026-03-15T05:42:32.655850", + "relations_count": 0 + }, + { + "id": 95, + "name": "Ануфриева Света", + "email": "", + "phone": "89539358648", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:35.346735", + "updated_at": "2026-03-15T05:42:35.346828", + "relations_count": 0 + }, + { + "id": 175, + "name": "Артем", + "email": "", + "phone": "+7 995 913 77 50", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:50.710218", + "updated_at": "2026-03-15T05:42:50.710270", + "relations_count": 0 + }, + { + "id": 60, + "name": "Артем Витальевич Лунин", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:29.112836", + "updated_at": "2026-03-15T05:42:29.112870", + "relations_count": 0 + }, + { + "id": 167, + "name": "Артем Востриков", + "email": "", + "phone": "89132703333", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:49.307902", + "updated_at": "2026-03-15T05:42:49.307940", + "relations_count": 0 + }, + { + "id": 46, + "name": "Артем Клименко", + "email": "", + "phone": "+7 927 311-37-97", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:26.842013", + "updated_at": "2026-03-15T05:42:26.842035", + "relations_count": 0 + }, + { + "id": 20, + "name": "Артур Ахмедзянов", + "email": "", + "phone": "+79602340617", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:22.286368", + "updated_at": "2026-03-15T05:42:22.286400", + "relations_count": 2 + }, + { + "id": 179, + "name": "Баскаков Иван Анатольевич", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "В секторе Подшивалова", + "created_at": "2026-03-15T05:42:51.394701", + "updated_at": "2026-05-14T02:29:20.300137", + "relations_count": 0 + }, + { + "id": 6, + "name": "Баходир 2", + "email": "", + "phone": "8 931 986-04-51", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:19.967420", + "updated_at": "2026-03-15T05:42:19.967446", + "relations_count": 0 + }, + { + "id": 55, + "name": "Борис Александрович Летучев", + "email": "", + "phone": "89210857720", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:28.285100", + "updated_at": "2026-03-15T05:42:28.285124", + "relations_count": 0 + }, + { + "id": 99, + "name": "Боря сосед", + "email": "", + "phone": "8 967 359-25-07", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:36.046517", + "updated_at": "2026-03-15T05:42:36.046569", + "relations_count": 0 + }, + { + "id": 180, + "name": "Брага Юрий Алексеевич", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:51.541547", + "updated_at": "2026-03-15T05:42:51.541609", + "relations_count": 0 + }, + { + "id": 181, + "name": "Быкова Валентина Сергеевна", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "Начальник сектора. Мой начальник.", + "created_at": "2026-03-15T05:42:51.762749", + "updated_at": "2026-05-14T02:37:55.609887", + "relations_count": 1 + }, + { + "id": 156, + "name": "В.А. Потапов", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:46.875252", + "updated_at": "2026-03-15T05:42:46.875288", + "relations_count": 0 + }, + { + "id": 155, + "name": "В.В. Прокопович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:46.757341", + "updated_at": "2026-03-15T05:42:46.757392", + "relations_count": 0 + }, + { + "id": 158, + "name": "В.С. Мельканович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:47.509315", + "updated_at": "2026-03-15T05:42:47.509340", + "relations_count": 0 + }, + { + "id": 136, + "name": "Вадим Галкин", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:43.388761", + "updated_at": "2026-03-15T05:42:43.388868", + "relations_count": 0 + }, + { + "id": 34, + "name": "Вадим Сергеевич Гончаров", + "email": "", + "phone": "89212442006", + "organization": "", + "position": "", + "notes": "Служит в 14003. Начальник отделения. Планирует уволиться ~ 2026 г. Планирует продать однушку и заипотечиться в двушку, чтоб жить втроем на Комендане.", + "created_at": "2026-03-15T05:42:24.682908", + "updated_at": "2026-03-15T05:42:24.682939", + "relations_count": 0 + }, + { + "id": 108, + "name": "Вадим Харьков", + "email": "", + "phone": "+79112933468", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:38.587916", + "updated_at": "2026-03-15T05:42:38.587952", + "relations_count": 0 + }, + { + "id": 143, + "name": "Валентина Сергеевна", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "Пользуется вниманием. 14 лет в НИИ. Натянутые отношения с др. начальниками групп. Хорошие отношения с высокими начальниками. Работает над сферой организации проектов. На корпаративе может выпить несколько рюмок водки.", + "created_at": "2026-03-15T05:42:44.620660", + "updated_at": "2026-03-15T05:42:44.620689", + "relations_count": 0 + }, + { + "id": 172, + "name": "Валентина Сергеевна Быкова", + "email": "", + "phone": "+7921350-22-93", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:50.069189", + "updated_at": "2026-03-15T05:42:50.069233", + "relations_count": 0 + }, + { + "id": 116, + "name": "Валентинович Всеволод Шатов", + "email": "", + "phone": "+79214910619", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:39.871525", + "updated_at": "2026-03-15T05:42:39.871548", + "relations_count": 0 + }, + { + "id": 24, + "name": "Василий", + "email": "", + "phone": "+79998128872", + "organization": "", + "position": "", + "notes": "Хочет реализовать интернет проект.", + "created_at": "2026-03-15T05:42:23.072756", + "updated_at": "2026-03-15T05:42:23.072880", + "relations_count": 0 + }, + { + "id": 134, + "name": "Вера", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:43.076717", + "updated_at": "2026-03-15T05:42:43.076846", + "relations_count": 0 + }, + { + "id": 49, + "name": "Вероника Королева", + "email": "", + "phone": "+7-931-535-65-06", + "organization": "", + "position": "", + "notes": "Работает в детском саду.", + "created_at": "2026-03-15T05:42:27.442141", + "updated_at": "2026-03-15T05:42:27.442211", + "relations_count": 0 + }, + { + "id": 125, + "name": "Виктор Андронов", + "email": "", + "phone": "+79643429812", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:41.249174", + "updated_at": "2026-03-15T05:42:41.249235", + "relations_count": 0 + }, + { + "id": 57, + "name": "Виктор Локтев", + "email": "", + "phone": "+79121719937", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:28.679492", + "updated_at": "2026-03-15T05:42:28.679516", + "relations_count": 0 + }, + { + "id": 47, + "name": "Виталик Коптелов", + "email": "", + "phone": "+79144069116", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:27.011628", + "updated_at": "2026-03-15T05:42:27.011684", + "relations_count": 0 + }, + { + "id": 107, + "name": "Виталик Фролов", + "email": "", + "phone": "8 906 194-41-46", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:38.454000", + "updated_at": "2026-03-15T05:42:38.454095", + "relations_count": 0 + }, + { + "id": 42, + "name": "Витя Зос", + "email": "", + "phone": "+7 911 230-09-30", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:26.068814", + "updated_at": "2026-03-15T05:42:26.068848", + "relations_count": 0 + }, + { + "id": 80, + "name": "Витя Опар2", + "email": "", + "phone": "89992003135", + "organization": "", + "position": "", + "notes": "Уехал в Тайланд на полгода. Занимается спекуляцией крипты.\nИмееет дачу. Любит копаться в земле. Предлагает во второй половине 2025 заняться потолками.", + "created_at": "2026-03-15T05:42:32.467962", + "updated_at": "2026-03-15T05:42:32.468024", + "relations_count": 0 + }, + { + "id": 105, + "name": "Влад Богомолов", + "email": "", + "phone": "8 911 824-16-27", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:38.002532", + "updated_at": "2026-03-15T05:42:38.002588", + "relations_count": 0 + }, + { + "id": 21, + "name": "Владимир Артурович Березин", + "email": "", + "phone": "+79778491152", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:22.448377", + "updated_at": "2026-03-15T05:42:22.448400", + "relations_count": 0 + }, + { + "id": 182, + "name": "Волкова Александра Юрьевна", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:51.928588", + "updated_at": "2026-03-15T05:42:51.928611", + "relations_count": 0 + }, + { + "id": 25, + "name": "Галикеев Василь", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:23.210873", + "updated_at": "2026-03-15T05:42:23.210933", + "relations_count": 0 + }, + { + "id": 171, + "name": "Георгий Осипков", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "Помогает с контроллерами.", + "created_at": "2026-03-15T05:42:49.859344", + "updated_at": "2026-03-15T05:42:49.859372", + "relations_count": 0 + }, + { + "id": 168, + "name": "Георгий Подшивалов", + "email": "", + "phone": "+7 921 310 1889", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:49.448599", + "updated_at": "2026-03-15T05:42:49.448651", + "relations_count": 0 + }, + { + "id": 183, + "name": "Говоров Владимир Денисович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:52.015169", + "updated_at": "2026-03-15T05:42:52.015199", + "relations_count": 0 + }, + { + "id": 184, + "name": "Горбунов Николай Иванович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:52.209481", + "updated_at": "2026-03-15T05:42:52.209543", + "relations_count": 0 + }, + { + "id": 186, + "name": "Горбунов Станислав Александрович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:52.580351", + "updated_at": "2026-03-15T05:42:52.580380", + "relations_count": 1 + }, + { + "id": 185, + "name": "Горюнов Евгений Алексеевич", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:52.399745", + "updated_at": "2026-03-15T05:42:52.399934", + "relations_count": 0 + }, + { + "id": 187, + "name": "Гриненков Алексей Владимирович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:52.758699", + "updated_at": "2026-05-14T02:29:13.796983", + "relations_count": 1 + }, + { + "id": 237, + "name": "Гриценков Алексей Владимирович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:51:56.021181", + "updated_at": "2026-03-15T05:51:56.021228", + "relations_count": 0 + }, + { + "id": 188, + "name": "Гришманова Татьяна Александровна", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:53.016275", + "updated_at": "2026-03-15T05:42:53.016338", + "relations_count": 0 + }, + { + "id": 69, + "name": "Гулюта Сергей Михайлович", + "email": "", + "phone": "89214856521", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:30.476344", + "updated_at": "2026-03-15T05:42:30.476420", + "relations_count": 0 + }, + { + "id": 163, + "name": "Д.Г. Кореньков", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:48.694569", + "updated_at": "2026-03-15T05:42:48.694603", + "relations_count": 0 + }, + { + "id": 45, + "name": "Давлетшин Карим", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:26.694727", + "updated_at": "2026-03-15T05:42:26.694763", + "relations_count": 0 + }, + { + "id": 90, + "name": "Давлетшин Рустам Ринатович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:34.445382", + "updated_at": "2026-03-15T05:42:34.445455", + "relations_count": 0 + }, + { + "id": 130, + "name": "Даша Андреевна Драгун", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:42.253213", + "updated_at": "2026-03-15T05:42:42.253270", + "relations_count": 0 + }, + { + "id": 189, + "name": "Демиденко Дмитрий Алексеевич", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:53.189563", + "updated_at": "2026-03-15T05:42:53.189615", + "relations_count": 0 + }, + { + "id": 33, + "name": "Денис Гизатулин", + "email": "", + "phone": "+7 916 009-26-16", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:24.550248", + "updated_at": "2026-03-15T05:42:24.550276", + "relations_count": 0 + }, + { + "id": 97, + "name": "Дмитрий Александрович Сечко", + "email": "", + "phone": "+79210775033", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:35.640202", + "updated_at": "2026-03-15T05:42:35.640236", + "relations_count": 0 + }, + { + "id": 178, + "name": "Дмитрий Шторн", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:51.219239", + "updated_at": "2026-03-15T05:42:51.219274", + "relations_count": 0 + }, + { + "id": 19, + "name": "Добрынин Антон", + "email": "", + "phone": "8 987 019-58-65", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:22.154606", + "updated_at": "2026-03-15T05:42:22.154637", + "relations_count": 0 + }, + { + "id": 129, + "name": "Дочь", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:42.023423", + "updated_at": "2026-03-15T05:42:42.023498", + "relations_count": 0 + }, + { + "id": 38, + "name": "Дружинин", + "email": "", + "phone": "+79195548628", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:25.437295", + "updated_at": "2026-03-15T05:42:25.437329", + "relations_count": 0 + }, + { + "id": 29, + "name": "Душейко Владимир Владимирович", + "email": "", + "phone": "89216760552", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:23.965053", + "updated_at": "2026-03-15T05:42:23.965086", + "relations_count": 0 + }, + { + "id": 160, + "name": "Е.А. Горбунов", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:47.898581", + "updated_at": "2026-03-15T05:42:47.898632", + "relations_count": 0 + }, + { + "id": 164, + "name": "Евгений", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "Хорошо эрудирован. Не женат. Имеет 3д виртуальные очки. Приятен в общении. Проявил интерес к распечатанной турели.", + "created_at": "2026-03-15T05:42:48.816257", + "updated_at": "2026-03-15T05:42:48.816314", + "relations_count": 0 + }, + { + "id": 149, + "name": "Евгений Андрущенко", + "email": "", + "phone": "@EvgeniySPbRf", + "organization": "", + "position": "", + "notes": "Занимался стартапом по производству дронов полтора года.", + "created_at": "2026-03-15T05:42:45.637821", + "updated_at": "2026-03-15T05:42:45.637864", + "relations_count": 0 + }, + { + "id": 52, + "name": "Екатерина Наильевна Крикунова", + "email": "", + "phone": "89314171873", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:27.860197", + "updated_at": "2026-03-15T05:42:27.860221", + "relations_count": 0 + }, + { + "id": 147, + "name": "Екатерина Тихова", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:45.186628", + "updated_at": "2026-05-17T04:25:31.045777", + "relations_count": 1 + }, + { + "id": 190, + "name": "Ефимова Анна Сергеевна", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:53.360200", + "updated_at": "2026-03-15T05:42:53.360224", + "relations_count": 0 + }, + { + "id": 127, + "name": "Жена", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:41.628079", + "updated_at": "2026-03-15T05:42:41.628134", + "relations_count": 0 + }, + { + "id": 37, + "name": "Женя Додонов", + "email": "", + "phone": "+79119158495", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:25.229329", + "updated_at": "2026-03-15T05:42:25.229378", + "relations_count": 1 + }, + { + "id": 192, + "name": "Жуменков Сергей Васильевич", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:53.674630", + "updated_at": "2026-03-15T05:42:53.674681", + "relations_count": 2 + }, + { + "id": 191, + "name": "Журавлёв Алексей Сергеевич", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:53.517587", + "updated_at": "2026-03-15T05:42:53.517619", + "relations_count": 0 + }, + { + "id": 87, + "name": "Зайнулов Расим", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:33.807418", + "updated_at": "2026-03-15T05:42:33.807441", + "relations_count": 0 + }, + { + "id": 88, + "name": "Зайнулов Ринат Рафикович", + "email": "", + "phone": "+7 937 358-82-37", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:33.965442", + "updated_at": "2026-03-15T05:42:33.965506", + "relations_count": 0 + }, + { + "id": 92, + "name": "Зайнулов Рустам", + "email": "", + "phone": "+79991300454", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:34.715546", + "updated_at": "2026-03-15T05:42:34.715608", + "relations_count": 0 + }, + { + "id": 193, + "name": "Зайцев Сергей Александрович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:53.909059", + "updated_at": "2026-03-15T05:42:53.909094", + "relations_count": 0 + }, + { + "id": 82, + "name": "Звонков Павел", + "email": "", + "phone": "+79899568256", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:32.754444", + "updated_at": "2026-03-15T05:42:32.754466", + "relations_count": 0 + }, + { + "id": 194, + "name": "Знаменский Даниил Александрович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:54.053719", + "updated_at": "2026-03-15T05:42:54.053767", + "relations_count": 0 + }, + { + "id": 157, + "name": "И.В. Пашкевич", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:46.990213", + "updated_at": "2026-03-15T05:42:46.990246", + "relations_count": 1 + }, + { + "id": 62, + "name": "Иван Витальевич Малимон", + "email": "", + "phone": "89115805720", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:29.432589", + "updated_at": "2026-03-15T05:42:29.432621", + "relations_count": 0 + }, + { + "id": 1, + "name": "Иван Иванов", + "email": "ivan@test.com", + "phone": "", + "organization": "ООО Ромашка", + "position": "Директор", + "notes": "", + "created_at": "2026-03-14T09:22:00.510250", + "updated_at": "2026-03-14T09:22:00.510270", + "relations_count": 5 + }, + { + "id": 195, + "name": "Иванов Максим Станиславович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:54.277661", + "updated_at": "2026-03-15T05:42:54.277753", + "relations_count": 0 + }, + { + "id": 56, + "name": "Игорь Павлович Лобода", + "email": "", + "phone": "89314067638", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:28.482372", + "updated_at": "2026-03-15T05:42:28.482405", + "relations_count": 0 + }, + { + "id": 174, + "name": "Икбол", + "email": "", + "phone": "89955918819", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:50.521550", + "updated_at": "2026-03-15T05:42:50.521583", + "relations_count": 0 + }, + { + "id": 118, + "name": "Илдус Якупов", + "email": "", + "phone": "+79279571795", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:40.186406", + "updated_at": "2026-03-15T05:42:40.186461", + "relations_count": 0 + }, + { + "id": 104, + "name": "Ильнур Тимиргазин", + "email": "", + "phone": "+7 962 533-96-56", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:37.781757", + "updated_at": "2026-03-15T05:42:37.781780", + "relations_count": 0 + }, + { + "id": 122, + "name": "Ильнур Янтур", + "email": "", + "phone": "+79196228909", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:40.758321", + "updated_at": "2026-03-15T05:42:40.758344", + "relations_count": 0 + }, + { + "id": 17, + "name": "Инсаф Якупов Анварович", + "email": "", + "phone": "+79128812711", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:21.784841", + "updated_at": "2026-03-15T05:42:21.784872", + "relations_count": 0 + }, + { + "id": 137, + "name": "Катя", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:43.597679", + "updated_at": "2026-03-15T05:42:43.597741", + "relations_count": 0 + }, + { + "id": 142, + "name": "Катя Полтавская", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:44.489662", + "updated_at": "2026-03-15T05:42:44.489694", + "relations_count": 0 + }, + { + "id": 145, + "name": "Кирилл", + "email": "", + "phone": "+79117315490", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:44.885619", + "updated_at": "2026-03-15T05:42:44.885650", + "relations_count": 0 + }, + { + "id": 106, + "name": "Клименко Андрей Федорович", + "email": "", + "phone": "89217818881", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:38.242982", + "updated_at": "2026-03-15T05:42:38.243003", + "relations_count": 0 + }, + { + "id": 196, + "name": "Кобяшев Евгений Владимирович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:54.437218", + "updated_at": "2026-03-15T05:42:54.437268", + "relations_count": 0 + }, + { + "id": 197, + "name": "Колесников Максим Павлович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:54.590576", + "updated_at": "2026-03-15T05:42:54.590598", + "relations_count": 0 + }, + { + "id": 198, + "name": "Колесов Иван Сергеевич", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:54.740101", + "updated_at": "2026-03-15T05:42:54.740195", + "relations_count": 0 + }, + { + "id": 199, + "name": "Комарова Яна Александровна", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:54.905062", + "updated_at": "2026-03-15T05:42:54.905085", + "relations_count": 0 + }, + { + "id": 200, + "name": "Конюхов Геннадий Вячеславович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:55.006505", + "updated_at": "2026-03-15T05:42:55.006567", + "relations_count": 0 + }, + { + "id": 50, + "name": "Котляров", + "email": "", + "phone": "89112600481", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:27.609595", + "updated_at": "2026-03-15T05:42:27.609626", + "relations_count": 0 + }, + { + "id": 30, + "name": "Котляров Вова", + "email": "", + "phone": "+7 915 733-92-97", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:24.101293", + "updated_at": "2026-03-15T05:42:24.101511", + "relations_count": 0 + }, + { + "id": 72, + "name": "Кристина Мысцева", + "email": "", + "phone": "+79062805558", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:30.995906", + "updated_at": "2026-03-15T05:42:30.995941", + "relations_count": 0 + }, + { + "id": 51, + "name": "Ксюша Пулатова(Красникова)", + "email": "", + "phone": "+79516535670", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:27.723198", + "updated_at": "2026-03-15T05:42:27.723250", + "relations_count": 0 + }, + { + "id": 201, + "name": "Кузнецов Кирилл Вячеславович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:55.230256", + "updated_at": "2026-03-15T05:42:55.230279", + "relations_count": 0 + }, + { + "id": 202, + "name": "Куликовских Юлия Валентиновна", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:55.411693", + "updated_at": "2026-05-14T02:29:12.002232", + "relations_count": 0 + }, + { + "id": 159, + "name": "Л.А. Мартынова", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:47.698918", + "updated_at": "2026-03-15T05:42:47.698956", + "relations_count": 0 + }, + { + "id": 54, + "name": "Лаврищев", + "email": "", + "phone": "89210866646", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:28.151721", + "updated_at": "2026-03-15T05:42:28.151848", + "relations_count": 0 + }, + { + "id": 27, + "name": "Леонид Вилисов", + "email": "", + "phone": "+7 914 155-22-98", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:23.620436", + "updated_at": "2026-03-15T05:42:23.620460", + "relations_count": 0 + }, + { + "id": 10, + "name": "Лилия Ильясовна Аглиуллина", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:20.522723", + "updated_at": "2026-03-15T05:42:20.522781", + "relations_count": 0 + }, + { + "id": 9, + "name": "Лиля Аглиулина", + "email": "", + "phone": "+7 960 397-55-50", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:20.345590", + "updated_at": "2026-03-15T05:42:20.345656", + "relations_count": 0 + }, + { + "id": 203, + "name": "Литовченко Сергей Анатольевич", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:55.586908", + "updated_at": "2026-03-15T05:42:55.586938", + "relations_count": 0 + }, + { + "id": 61, + "name": "Люба", + "email": "", + "phone": "89212446797", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:29.268614", + "updated_at": "2026-03-15T05:42:29.268666", + "relations_count": 0 + }, + { + "id": 151, + "name": "Любовь Александровна", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:46.004330", + "updated_at": "2026-03-15T05:42:46.004404", + "relations_count": 0 + }, + { + "id": 41, + "name": "Маким Зайцев", + "email": "", + "phone": "+79276369798", + "organization": "", + "position": "", + "notes": "Занимается стройкой\nИграет в танки и знакомится с нужными людьми. Купил квартиру в Деме. Не женат. Обычно интересуется родителями.\nЛетом 2024 ездил на Дагестан. Жил в слоеном доме. НГ 2025 встречает с очередной девушкой.\nвстречает НГ с родителями девушки в Иглино\nСозванивались. В январе разошлись с партнером. Вместе работали 8 лет. Открыл свою фирму. СНН.", + "created_at": "2026-03-15T05:42:25.934153", + "updated_at": "2026-03-15T05:42:25.934186", + "relations_count": 0 + }, + { + "id": 138, + "name": "Максим Сергеевич Бабинцев", + "email": "", + "phone": "+79523657942", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:43.798677", + "updated_at": "2026-03-15T05:42:43.798738", + "relations_count": 0 + }, + { + "id": 177, + "name": "Максим Филипович Шарп", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:51.046857", + "updated_at": "2026-03-15T05:42:51.046902", + "relations_count": 0 + }, + { + "id": 28, + "name": "Малимон Витальевич", + "email": "", + "phone": "+7 911 007-25-75", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:23.804031", + "updated_at": "2026-03-15T05:42:23.804123", + "relations_count": 0 + }, + { + "id": 16, + "name": "Малинков Юрий Анатольевич", + "email": "", + "phone": "+79212441013", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:21.586650", + "updated_at": "2026-03-15T05:42:21.586764", + "relations_count": 0 + }, + { + "id": 204, + "name": "Малышев Владислав Александрович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:55.856786", + "updated_at": "2026-03-15T05:42:55.856851", + "relations_count": 0 + }, + { + "id": 205, + "name": "Малышкин Геннадий Александрович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:56.021720", + "updated_at": "2026-03-15T05:42:56.021742", + "relations_count": 0 + }, + { + "id": 5, + "name": "Малюк Андрей Андреевич", + "email": "", + "phone": "+7 996 502-13-72", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:19.849063", + "updated_at": "2026-03-15T05:42:19.849090", + "relations_count": 0 + }, + { + "id": 76, + "name": "Малюк Андрей Новый", + "email": "", + "phone": "+7 978 968-41-17", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:31.688292", + "updated_at": "2026-03-15T05:42:31.688328", + "relations_count": 0 + }, + { + "id": 67, + "name": "Мама", + "email": "", + "phone": "+7 931 376-43-75", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:30.160936", + "updated_at": "2026-03-15T05:42:30.160960", + "relations_count": 0 + }, + { + "id": 206, + "name": "Марасёв Станислав Евгеньевич", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:56.212143", + "updated_at": "2026-03-15T05:42:56.212208", + "relations_count": 0 + }, + { + "id": 11, + "name": "Марат Жаксыбаевич Адылханов", + "email": "", + "phone": "+79314061507", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:20.721503", + "updated_at": "2026-03-15T05:42:20.721558", + "relations_count": 0 + }, + { + "id": 53, + "name": "Марат Купаев", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:28.015164", + "updated_at": "2026-03-15T05:42:28.015198", + "relations_count": 0 + }, + { + "id": 66, + "name": "Марина Борисовна Малюк", + "email": "", + "phone": "+79115912127", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:30.033225", + "updated_at": "2026-03-15T05:42:30.033287", + "relations_count": 0 + }, + { + "id": 120, + "name": "Марина Якупова", + "email": "", + "phone": "8 (981) 758-69-35", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:40.414894", + "updated_at": "2026-03-15T05:42:40.414917", + "relations_count": 0 + }, + { + "id": 2, + "name": "Мария Петрова", + "email": "maria@test.com", + "phone": "", + "organization": "Газпром", + "position": "Аналитик", + "notes": "", + "created_at": "2026-03-14T09:22:00.512129", + "updated_at": "2026-03-14T09:22:00.512140", + "relations_count": 2 + }, + { + "id": 207, + "name": "Марков Антон Викторович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:56.404157", + "updated_at": "2026-03-15T05:42:56.404193", + "relations_count": 0 + }, + { + "id": 140, + "name": "Милош Бороцкий", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "Ездил на СВО 2024 году. По возвращении ию проблемы с коленом.\nДочь учится в частной школе.", + "created_at": "2026-03-15T05:42:44.124123", + "updated_at": "2026-05-14T02:29:36.836569", + "relations_count": 0 + }, + { + "id": 208, + "name": "Митрохин Виктор Сергеевич", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:56.539372", + "updated_at": "2026-03-15T05:42:56.539432", + "relations_count": 0 + }, + { + "id": 43, + "name": "Мухаметов Ильнар", + "email": "", + "phone": "+7 999 669-33-67", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:26.346481", + "updated_at": "2026-03-15T05:42:26.346515", + "relations_count": 0 + }, + { + "id": 14, + "name": "Мясников Александр", + "email": "", + "phone": "+79210717608", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:21.153553", + "updated_at": "2026-03-15T05:42:21.153629", + "relations_count": 0 + }, + { + "id": 68, + "name": "Надежда Манхеттен", + "email": "", + "phone": "8 921 898-25-85", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:30.333943", + "updated_at": "2026-03-15T05:42:30.334007", + "relations_count": 0 + }, + { + "id": 209, + "name": "Назарова Александра Викторовна", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:56.695813", + "updated_at": "2026-03-15T05:42:56.695874", + "relations_count": 0 + }, + { + "id": 63, + "name": "Настя Малимон", + "email": "", + "phone": "+79116852335", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:29.557319", + "updated_at": "2026-03-15T05:42:29.557349", + "relations_count": 0 + }, + { + "id": 112, + "name": "Настя Шакирова", + "email": "", + "phone": "+79214854728", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:39.288538", + "updated_at": "2026-03-15T05:42:39.288597", + "relations_count": 0 + }, + { + "id": 22, + "name": "Наталья Мама Бори", + "email": "", + "phone": "+7 903 466-07-20", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:22.591864", + "updated_at": "2026-03-15T05:42:22.591911", + "relations_count": 0 + }, + { + "id": 176, + "name": "Наур", + "email": "", + "phone": "@vozhd77", + "organization": "", + "position": "", + "notes": "На Донбассе. Воюет с 2014.", + "created_at": "2026-03-15T05:42:50.879448", + "updated_at": "2026-03-15T05:42:50.879500", + "relations_count": 0 + }, + { + "id": 210, + "name": "Некрасов Алексей Николаевич", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:56.839335", + "updated_at": "2026-03-15T05:42:56.839357", + "relations_count": 0 + }, + { + "id": 218, + "name": "Ненашев Александр Валерьевич", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:58.504178", + "updated_at": "2026-03-15T05:42:58.504208", + "relations_count": 0 + }, + { + "id": 170, + "name": "Никита Алексеевич Затеев", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:49.721524", + "updated_at": "2026-03-15T05:42:49.721579", + "relations_count": 0 + }, + { + "id": 219, + "name": "Николаев Антон Сергеевич", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:58.695709", + "updated_at": "2026-03-15T05:42:58.695742", + "relations_count": 0 + }, + { + "id": 211, + "name": "Николаев Игорь Владимирович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:56.952521", + "updated_at": "2026-03-15T05:42:56.952560", + "relations_count": 0 + }, + { + "id": 35, + "name": "Николай Александрович Горбаненко", + "email": "", + "phone": "89218139891", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:24.799763", + "updated_at": "2026-03-15T05:42:24.799844", + "relations_count": 0 + }, + { + "id": 166, + "name": "Николай Крюков", + "email": "", + "phone": "+7 960 235-13-56", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:49.132857", + "updated_at": "2026-03-15T05:42:49.132894", + "relations_count": 0 + }, + { + "id": 111, + "name": "Николай Петрович Черный", + "email": "", + "phone": "89210705228", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:39.122687", + "updated_at": "2026-03-15T05:42:39.122711", + "relations_count": 0 + }, + { + "id": 212, + "name": "Новиков Вадим Евгеньевич", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:57.165483", + "updated_at": "2026-03-15T05:42:57.165540", + "relations_count": 0 + }, + { + "id": 128, + "name": "Оксана", + "email": "", + "phone": "+7 953 171-32-13", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:41.844615", + "updated_at": "2026-03-15T05:42:41.844665", + "relations_count": 0 + }, + { + "id": 78, + "name": "Оксана Огнева", + "email": "", + "phone": "8 911 006-84-43", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:32.128593", + "updated_at": "2026-03-15T05:42:32.128615", + "relations_count": 0 + }, + { + "id": 59, + "name": "Олег Викторович Лопатин", + "email": "", + "phone": "89214814746", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:28.967747", + "updated_at": "2026-03-15T05:42:28.967770", + "relations_count": 0 + }, + { + "id": 79, + "name": "Онищенко", + "email": "", + "phone": "89121724618", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:32.323844", + "updated_at": "2026-03-15T05:42:32.323931", + "relations_count": 0 + }, + { + "id": 220, + "name": "Осечкин Роман Александрович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:58.814577", + "updated_at": "2026-03-15T05:42:58.814638", + "relations_count": 0 + }, + { + "id": 221, + "name": "Осмолин Владимир Владимирович", + "email": "", + "phone": "89215581401", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:58.979122", + "updated_at": "2026-03-15T05:42:58.979146", + "relations_count": 0 + }, + { + "id": 222, + "name": "Остапенко Никита Романович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:59.178463", + "updated_at": "2026-03-15T05:42:59.178505", + "relations_count": 0 + }, + { + "id": 64, + "name": "Отец Малимона", + "email": "", + "phone": "+79218642151", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:29.746834", + "updated_at": "2026-05-10T07:24:10.889352", + "relations_count": 0 + }, + { + "id": 101, + "name": "Отец Спб", + "email": "", + "phone": "+79110046322", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:36.471719", + "updated_at": "2026-03-15T05:42:36.471754", + "relations_count": 0 + }, + { + "id": 124, + "name": "Павел", + "email": "", + "phone": "@Pavel0880", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:41.105890", + "updated_at": "2026-03-15T05:42:41.105948", + "relations_count": 0 + }, + { + "id": 58, + "name": "Павел Локтев", + "email": "", + "phone": "8 (904) 613-59-68", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:28.785208", + "updated_at": "2026-03-15T05:42:28.785257", + "relations_count": 0 + }, + { + "id": 141, + "name": "Павел Полтавский", + "email": "", + "phone": "+79214944569", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:44.301654", + "updated_at": "2026-03-15T05:42:44.301688", + "relations_count": 0 + }, + { + "id": 223, + "name": "Павлов Алексей Александрович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:59.377177", + "updated_at": "2026-03-15T05:42:59.377198", + "relations_count": 0 + }, + { + "id": 213, + "name": "Павлов Дмитрий Александрович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:57.361861", + "updated_at": "2026-03-15T05:42:57.361884", + "relations_count": 0 + }, + { + "id": 214, + "name": "Панфёрова Галина Сергеевна", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:57.623999", + "updated_at": "2026-03-15T05:42:57.624050", + "relations_count": 0 + }, + { + "id": 83, + "name": "Паша Полтавский", + "email": "", + "phone": "+79214944569", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:32.916372", + "updated_at": "2026-03-15T05:42:32.916419", + "relations_count": 0 + }, + { + "id": 224, + "name": "Пашкевич Иван Владимирович", + "email": "", + "phone": "89119330006", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:59.552678", + "updated_at": "2026-03-15T05:42:59.552707", + "relations_count": 0 + }, + { + "id": 215, + "name": "Петрова Юлия Михайловна", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:57.755890", + "updated_at": "2026-03-15T05:42:57.755913", + "relations_count": 0 + }, + { + "id": 225, + "name": "Подшивалов Георгий Андреевич", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "Начальник сектора", + "created_at": "2026-03-15T05:42:59.690426", + "updated_at": "2026-05-14T02:33:17.478583", + "relations_count": 0 + }, + { + "id": 216, + "name": "Поляков Сергей Александрович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:58.005579", + "updated_at": "2026-03-15T05:42:58.005636", + "relations_count": 0 + }, + { + "id": 217, + "name": "Попова Анна Викторовна", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:58.305717", + "updated_at": "2026-03-15T05:42:58.305751", + "relations_count": 0 + }, + { + "id": 84, + "name": "Прокат Вело", + "email": "", + "phone": "88129093672", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:33.065999", + "updated_at": "2026-03-15T05:42:33.066061", + "relations_count": 0 + }, + { + "id": 44, + "name": "Радик Ишмаев", + "email": "", + "phone": "89272495520", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:26.522407", + "updated_at": "2026-03-15T05:42:26.522463", + "relations_count": 0 + }, + { + "id": 85, + "name": "Радмила", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:33.204502", + "updated_at": "2026-03-15T05:42:33.204554", + "relations_count": 0 + }, + { + "id": 86, + "name": "Радмир", + "email": "", + "phone": "+79373021892", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:33.596383", + "updated_at": "2026-03-15T05:42:33.596434", + "relations_count": 0 + }, + { + "id": 77, + "name": "Рамис Новый", + "email": "", + "phone": "8 962 693-28-84", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:31.968989", + "updated_at": "2026-03-15T05:42:31.969050", + "relations_count": 0 + }, + { + "id": 100, + "name": "Рамис Сосед", + "email": "", + "phone": "+7 931 982-62-48", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:36.244482", + "updated_at": "2026-03-15T05:42:36.244531", + "relations_count": 0 + }, + { + "id": 173, + "name": "Регина", + "email": "", + "phone": "89817262898", + "organization": "", + "position": "", + "notes": "Жена Икбола. Знакома с Сократом. Общительная.", + "created_at": "2026-03-15T05:42:50.277355", + "updated_at": "2026-03-15T05:42:50.277395", + "relations_count": 0 + }, + { + "id": 12, + "name": "Ренат Наильевич Аитов", + "email": "", + "phone": "+79657986479", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:20.888703", + "updated_at": "2026-03-15T05:42:20.888850", + "relations_count": 0 + }, + { + "id": 121, + "name": "Римма Якупова", + "email": "", + "phone": "+7 937 309-17-17", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:40.537990", + "updated_at": "2026-03-15T05:42:40.538052", + "relations_count": 0 + }, + { + "id": 13, + "name": "Ринат Аитов", + "email": "", + "phone": "89214870226", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:21.038669", + "updated_at": "2026-03-15T05:42:21.038701", + "relations_count": 0 + }, + { + "id": 119, + "name": "Ринат Ильгизович Якупов", + "email": "rinatka7@bk.ru", + "phone": "+79967980562", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:40.320586", + "updated_at": "2026-03-15T05:42:40.320632", + "relations_count": 0 + }, + { + "id": 110, + "name": "Роман Ринатович Хусаинов", + "email": "", + "phone": "89214912576", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:38.977862", + "updated_at": "2026-03-15T05:42:38.977918", + "relations_count": 0 + }, + { + "id": 162, + "name": "С.А. Горбунов", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:48.475001", + "updated_at": "2026-03-15T05:42:48.475063", + "relations_count": 0 + }, + { + "id": 94, + "name": "Сафура", + "email": "", + "phone": "+79053542960", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:35.181564", + "updated_at": "2026-03-15T05:42:35.181586", + "relations_count": 0 + }, + { + "id": 91, + "name": "Света Казань родственники", + "email": "", + "phone": "+79655908514", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:34.580369", + "updated_at": "2026-03-15T05:42:34.580392", + "relations_count": 0 + }, + { + "id": 98, + "name": "Света Симановская", + "email": "", + "phone": "8 981 803-22-09", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:35.911553", + "updated_at": "2026-03-15T05:42:35.911609", + "relations_count": 0 + }, + { + "id": 36, + "name": "Светлана Гулюта", + "email": "", + "phone": "89214835894", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:24.983954", + "updated_at": "2026-03-15T05:42:24.983987", + "relations_count": 0 + }, + { + "id": 165, + "name": "Светлана Морозова", + "email": "", + "phone": "@Svetlana_Morozova_Electropribor", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:49.010547", + "updated_at": "2026-03-15T05:42:49.010600", + "relations_count": 0 + }, + { + "id": 135, + "name": "Сергей Константинович Сурин", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "Офицер энергонадзора в Можайке. Зп 65 тр. Подрабатывает монтажом под ключ. 2 разряд по пауерлифтингу получил в Няндоме(показывал фото). Планирует уволиться в 2026 году.", + "created_at": "2026-03-15T05:42:43.227613", + "updated_at": "2026-03-15T05:42:43.227643", + "relations_count": 0 + }, + { + "id": 40, + "name": "Серега Емельянович", + "email": "", + "phone": "+79154189674", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:25.778921", + "updated_at": "2026-03-15T05:42:25.779010", + "relations_count": 0 + }, + { + "id": 70, + "name": "Сечко Москва", + "email": "", + "phone": "+79046590150", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:30.667676", + "updated_at": "2026-03-15T05:42:30.667719", + "relations_count": 0 + }, + { + "id": 227, + "name": "Смирнов Алексей Сергеевич", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:59.940627", + "updated_at": "2026-03-15T05:42:59.940665", + "relations_count": 0 + }, + { + "id": 148, + "name": "Соня", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:45.397991", + "updated_at": "2026-03-15T05:42:45.398043", + "relations_count": 0 + }, + { + "id": 228, + "name": "Стариков Александр Иванович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:43:00.097057", + "updated_at": "2026-03-15T05:43:00.097091", + "relations_count": 0 + }, + { + "id": 169, + "name": "Стас Маросев", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:49.581718", + "updated_at": "2026-05-14T02:33:20.778179", + "relations_count": 0 + }, + { + "id": 102, + "name": "Степан", + "email": "", + "phone": "+7 914 849-46-02", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:36.628573", + "updated_at": "2026-05-17T04:27:40.531840", + "relations_count": 1 + }, + { + "id": 48, + "name": "Степан Королев", + "email": "st.korolev@list.ru", + "phone": "+79817014384", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:27.251878", + "updated_at": "2026-05-10T08:17:19.742143", + "relations_count": 0 + }, + { + "id": 103, + "name": "Тарасов", + "email": "", + "phone": "+7 911 975-03-84", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:36.783930", + "updated_at": "2026-03-15T05:42:36.783953", + "relations_count": 0 + }, + { + "id": 144, + "name": "Татьяна", + "email": "", + "phone": "+7 995 628 4534", + "organization": "", + "position": "", + "notes": "Бизнес вумен. Учится по вечерам - студентка. Много работатет - рискует перегореть.", + "created_at": "2026-03-15T05:42:44.770697", + "updated_at": "2026-03-15T05:42:44.770720", + "relations_count": 0 + }, + { + "id": 65, + "name": "Теща Малимона", + "email": "", + "phone": "+79112195520", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:29.911947", + "updated_at": "2026-03-15T05:42:29.912041", + "relations_count": 0 + }, + { + "id": 229, + "name": "Тимофеев Виталий Николаевич", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:43:00.253713", + "updated_at": "2026-03-15T05:43:00.253775", + "relations_count": 0 + }, + { + "id": 226, + "name": "Топалов Владимир Владимирович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:59.808641", + "updated_at": "2026-03-15T05:42:59.808662", + "relations_count": 0 + }, + { + "id": 31, + "name": "Тумский В Г", + "email": "", + "phone": "89314156919", + "organization": "", + "position": "", + "notes": "ФГУП СКБ \\\"Титан\\\"", + "created_at": "2026-03-15T05:42:24.220384", + "updated_at": "2026-03-15T05:42:24.220434", + "relations_count": 0 + }, + { + "id": 230, + "name": "Тюрюхин Михаил Евгеньевич", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:43:00.418988", + "updated_at": "2026-03-15T05:43:00.419044", + "relations_count": 0 + }, + { + "id": 231, + "name": "Тюфряк Андрей Валерьевич", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:43:00.611877", + "updated_at": "2026-03-15T05:43:00.611957", + "relations_count": 0 + }, + { + "id": 236, + "name": "Устин", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:43:01.294031", + "updated_at": "2026-03-15T05:43:01.294088", + "relations_count": 0 + }, + { + "id": 232, + "name": "Ушаков Сергей Иванович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:43:00.747236", + "updated_at": "2026-03-15T05:43:00.747271", + "relations_count": 0 + }, + { + "id": 233, + "name": "Филименко Ян Игоревич", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:43:00.872021", + "updated_at": "2026-03-15T05:43:00.872045", + "relations_count": 0 + }, + { + "id": 234, + "name": "Чапков Руслан Ильгизович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:43:01.027109", + "updated_at": "2026-03-15T05:43:01.027145", + "relations_count": 0 + }, + { + "id": 4, + "name": "Шакиров Айдар", + "email": "", + "phone": "+79214854729", + "organization": "", + "position": "", + "notes": "https://yar.diskstation.me/dokuwiki/doku.php?id=wiki:parking:forum:forum", + "created_at": "2026-03-15T05:42:19.669385", + "updated_at": "2026-03-15T05:42:19.669415", + "relations_count": 0 + }, + { + "id": 23, + "name": "Шива Вадим", + "email": "", + "phone": "+380661894022", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:22.791033", + "updated_at": "2026-03-15T05:42:22.791095", + "relations_count": 0 + }, + { + "id": 117, + "name": "Шоди", + "email": "", + "phone": "8 921 641-40-97", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:40.008786", + "updated_at": "2026-03-15T05:42:40.008905", + "relations_count": 0 + }, + { + "id": 8, + "name": "Эмиль Аглиулин", + "email": "", + "phone": "89603975444", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:20.203159", + "updated_at": "2026-03-15T05:42:20.203228", + "relations_count": 0 + }, + { + "id": 7, + "name": "Яковлев А. А", + "email": "", + "phone": "89815539615", + "organization": "", + "position": "", + "notes": "\\\"ЦЕНКИ\\\" НИИСК", + "created_at": "2026-03-15T05:42:20.034206", + "updated_at": "2026-03-15T05:42:20.034245", + "relations_count": 0 + }, + { + "id": 235, + "name": "Яковлев Сергей Николаевич", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:43:01.170322", + "updated_at": "2026-03-15T05:43:01.170368", + "relations_count": 0 + }, + { + "id": 18, + "name": "Якупов Илдус Анварович", + "email": "", + "phone": "", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:21.962744", + "updated_at": "2026-05-17T13:55:24.151928", + "relations_count": 0 + }, + { + "id": 96, + "name": "Якупова Света", + "email": "", + "phone": "+7 937 308-53-58", + "organization": "", + "position": "", + "notes": "", + "created_at": "2026-03-15T05:42:35.513494", + "updated_at": "2026-03-15T05:42:35.513558", + "relations_count": 0 + }, + { + "id": 132, + "name": "Яна Яновна", + "email": "", + "phone": "89110063164", + "organization": "", + "position": "", + "notes": "Регистрация брака. 27.09.2024", + "created_at": "2026-03-15T05:42:42.636658", + "updated_at": "2026-03-15T05:42:42.636726", + "relations_count": 0 + } + ], + "relations": [ + { + "id": 1, + "source": 1, + "source_name": "Иван Иванов", + "target": 2, + "target_name": "Мария Петрова", + "relation_type": "colleague", + "description": "Партнёры по проекту", + "interaction_intensity": "intense", + "created_at": "2026-03-14T09:22:00.514711" + }, + { + "id": 2, + "source": 1, + "source_name": "Иван Иванов", + "target": 3, + "target_name": "Алексей Смирнов", + "relation_type": "friend", + "description": "", + "interaction_intensity": "intense", + "created_at": "2026-03-14T09:22:00.516057" + }, + { + "id": 3, + "source": 3, + "source_name": "Алексей Смирнов", + "target": 1, + "target_name": "Иван Иванов", + "relation_type": "acquaintance", + "description": "", + "interaction_intensity": "intense", + "created_at": "2026-03-15T04:59:10.431002" + }, + { + "id": 4, + "source": 2, + "source_name": "Мария Петрова", + "target": 1, + "target_name": "Иван Иванов", + "relation_type": "business", + "description": "", + "interaction_intensity": "intense", + "created_at": "2026-03-15T05:00:23.796924" + }, + { + "id": 5, + "source": 186, + "source_name": "Горбунов Станислав Александрович", + "target": 157, + "target_name": "И.В. Пашкевич", + "relation_type": "colleague", + "description": "Отношение нейтральные", + "interaction_intensity": "intense", + "created_at": "2026-03-15T05:48:15.751607" + }, + { + "id": 6, + "source": 37, + "source_name": "Женя Додонов", + "target": 192, + "target_name": "Жуменков Сергей Васильевич", + "relation_type": "acquaintance", + "description": "", + "interaction_intensity": "intense", + "created_at": "2026-03-15T05:54:44.442326" + }, + { + "id": 7, + "source": 192, + "source_name": "Жуменков Сергей Васильевич", + "target": 113, + "target_name": "Аглиулин Эмиль Шамилевич", + "relation_type": "acquaintance", + "description": "", + "interaction_intensity": "intense", + "created_at": "2026-03-15T05:57:57.794219" + }, + { + "id": 8, + "source": 1, + "source_name": "Иван Иванов", + "target": 113, + "target_name": "Аглиулин Эмиль Шамилевич", + "relation_type": "acquaintance", + "description": "", + "interaction_intensity": "intense", + "created_at": "2026-03-15T15:22:39.588059" + }, + { + "id": 9, + "source": 147, + "source_name": "Екатерина Тихова", + "target": 109, + "target_name": "Алексей Ходосов", + "relation_type": "acquaintance", + "description": "", + "interaction_intensity": "intense", + "created_at": "2026-05-10T07:47:58.237244" + }, + { + "id": 10, + "source": 181, + "source_name": "Быкова Валентина Сергеевна", + "target": 187, + "target_name": "Гриненков Алексей Владимирович", + "relation_type": "colleague", + "description": "ПНачальник- подчиненный", + "interaction_intensity": "intense", + "created_at": "2026-05-14T02:35:57.602865" + }, + { + "id": 11, + "source": 102, + "source_name": "Степан", + "target": 20, + "target_name": "Артур Ахмедзянов", + "relation_type": "acquaintance", + "description": "", + "interaction_intensity": "intense", + "created_at": "2026-05-17T04:23:43.374514" + }, + { + "id": 12, + "source": 161, + "source_name": "А.В. Бельченко", + "target": 20, + "target_name": "Артур Ахмедзянов", + "relation_type": "acquaintance", + "description": "", + "interaction_intensity": "intense", + "created_at": "2026-05-17T13:53:03.182697" + } + ] +} \ No newline at end of file diff --git a/deploy/.env.prod.example b/deploy/.env.prod.example index 476a785..ce6b07f 100644 --- a/deploy/.env.prod.example +++ b/deploy/.env.prod.example @@ -9,4 +9,5 @@ BACKEND_PORT=8000 # Только при profile with-backend (VITE_DATA_MODE=remote) DJANGO_SECRET_KEY=replace-with-long-random-string -ALLOWED_HOSTS=your-domain.com,www.your-domain.com +ALLOWED_HOSTS=social.deepfishing.ru +USE_JWT_AUTH=true diff --git a/deploy/README.md b/deploy/README.md index 8d86c3b..290f4de 100644 --- a/deploy/README.md +++ b/deploy/README.md @@ -1,87 +1,130 @@ -# Production deploy (контейнеры + прокси на хосте) +# Развёртывание Social Graph на сервере + +Инструкция для Linux-сервера (Ubuntu/Debian). Приложение публикуется через Docker; снаружи доступен только веб-прокси (80/443). + +> **Production:** [deploy/social.deepfishing.ru.md](./social.deepfishing.ru.md) — инструкция для https://social.deepfishing.ru ## Схема ```text -[Прокси на хосте :80/:443] - → frontend-контейнер (nginx, 127.0.0.1:8080) - → backend-контейнер (gunicorn, 127.0.0.1:8000 — только при remote) +Интернет :80 / :443 + ↓ +Прокси на хосте (Apache или nginx) + ↓ +┌───────────────────────────────────────┐ +│ frontend-контейнер (nginx) │ +│ 127.0.0.1:8080 → SPA + статика │ +└───────────────────────────────────────┘ + ↓ (только в режиме remote) +┌───────────────────────────────────────┐ +│ backend-контейнер (gunicorn) │ +│ 127.0.0.1:8000 → Django API │ +│ SQLite в Docker volume │ +└───────────────────────────────────────┘ ``` -SPA-маршрутизация (`try_files` → `index.html`) — **внутри** frontend-контейнера (`frontend/nginx.conf`). +| Режим | Где данные | Backend на сервере | +|-------|------------|--------------------| +| **local** (по умолчанию) | IndexedDB в браузере каждого пользователя | не нужен | +| **remote** | SQLite на сервере, общая БД | обязателен | -## 1. Клонирование и подготовка +Режим задаётся при **сборке** фронтенда (`VITE_DATA_MODE`). + +--- + +## 1. Требования к серверу + +- Linux (Ubuntu 22.04+ / Debian 12+) +- Docker Engine + Docker Compose plugin +- Git +- Домен, указывающий на IP сервера (для HTTPS) +- Apache2 **или** nginx на хосте (reverse proxy) + +Установка Docker (если ещё нет): ```bash -git clone /opt/social-graph -cd /opt/social-graph -git checkout main # или нужная ветка - -cp deploy/.env.prod.example deploy/.env.prod -# отредактируйте deploy/.env.prod +curl -fsSL https://get.docker.com | sh +sudo usermod -aG docker "$USER" +# перелогиньтесь, чтобы группа docker применилась +docker compose version ``` -`deploy/.env.prod` в git не коммитится (секреты и локальные порты). +--- -## 2. Local-first (рекомендуется) +## 2. Клонирование проекта -Данные пользователя — в браузере (IndexedDB). Backend на сервере **не поднимать**. +```bash +sudo mkdir -p /opt/social-graph +sudo chown "$USER:$USER" /opt/social-graph +git clone /opt/social-graph +cd /opt/social-graph +git checkout main # или нужная ветка +``` -В `deploy/.env.prod`: +--- + +## 3. Конфигурация окружения + +```bash +cp deploy/.env.prod.example deploy/.env.prod +nano deploy/.env.prod +``` + +### Вариант A — local-first (данные только в браузере) + +Подходит, если сервер — просто «хостинг интерфейса», без общей базы. ```env VITE_DATA_MODE=local + +FRONTEND_BIND=127.0.0.1 +FRONTEND_PORT=8080 ``` +Backend **не поднимается**. Каждый пользователь хранит данные локально; при смене браузера или устройства данные не переносятся автоматически (экспорт/импорт — через UI → Импорт). + +### Вариант B — remote (данные на сервере, вход по логину) + +Подходит для команды или одного аккаунта с доступом с разных устройств. + +```env +VITE_DATA_MODE=remote + +FRONTEND_BIND=127.0.0.1 +FRONTEND_PORT=8080 +BACKEND_BIND=127.0.0.1 +BACKEND_PORT=8000 + +DJANGO_SECRET_KEY=сгенерируйте-длинную-случайную-строку +ALLOWED_HOSTS=your-domain.com,www.your-domain.com +USE_JWT_AUTH=true +``` + +Сгенерировать секретный ключ: + +```bash +python3 -c "import secrets; print(secrets.token_urlsafe(50))" +``` + +Файл `deploy/.env.prod` **не коммитить** — в нём секреты. + +--- + +## 4. Сборка и запуск контейнеров + +Перейдите в каталог проекта: + +```bash +cd /opt/social-graph +``` + +### Только frontend (режим local) + ```bash docker compose -f docker-compose.prod.yml --env-file deploy/.env.prod up -d --build frontend ``` -Проверка: - -```bash -curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:8080/ -# ожидается 200 -``` - -## 3. Прокси на хосте - -### Apache2 - -```bash -sudo a2enmod proxy proxy_http headers -sudo cp deploy/apache/social-graph.conf /etc/apache2/sites-available/social-graph.conf -``` - -Отредактируйте `ServerName` и при необходимости порты (`FRONTEND_PORT` / `BACKEND_PORT` из `.env.prod`). - -```bash -sudo a2ensite social-graph.conf -sudo apache2ctl configtest -sudo systemctl reload apache2 -``` - -HTTPS: - -```bash -sudo certbot --apache -d your-domain.com -``` - -### nginx на хосте - -См. `deploy/proxy/nginx-host.conf.example`. - -## 4. Remote mode (frontend + backend) - -Общая БД на сервере. В `deploy/.env.prod`: - -```env -VITE_DATA_MODE=remote -DJANGO_SECRET_KEY=длинный-случайный-ключ -ALLOWED_HOSTS=your-domain.com,www.your-domain.com -``` - -Пересоберите frontend (режим зашивается при build) и поднимите оба сервиса: +### Frontend + backend (режим remote) ```bash docker compose -f docker-compose.prod.yml --env-file deploy/.env.prod build @@ -89,48 +132,215 @@ docker compose -f docker-compose.prod.yml --env-file deploy/.env.prod up -d --bu docker compose -f docker-compose.prod.yml --env-file deploy/.env.prod --profile with-backend up -d --build backend ``` -В `deploy/apache/social-graph.conf` раскомментируйте `ProxyPass /api ...` **выше** блока `ProxyPass /`. +Проверка: ```bash -sudo a2enmod proxy proxy_http headers +docker compose -f docker-compose.prod.yml ps +curl -s -o /dev/null -w "frontend: %{http_code}\n" http://127.0.0.1:8080/ +curl -s -o /dev/null -w "backend: %{http_code}\n" http://127.0.0.1:8000/api/v1/meta/choices/ +``` + +Ожидается `200` (backend в режиме remote с JWT может вернуть `401` без токена — это нормально, главное не `502`). + +Логи: + +```bash +docker logs sg_frontend --tail 50 +docker logs sg_backend --tail 50 +``` + +> **Конфликт с dev:** если в том же каталоге запускали `docker compose up`, сначала выполните `docker compose down`. + +--- + +## 5. Прокси на хосте + +Контейнеры слушают только `127.0.0.1`. Наружу открывается прокси. + +### Apache2 + +```bash +sudo apt install apache2 +sudo a2enmod proxy proxy_http headers rewrite +sudo cp deploy/apache/social-graph.conf /etc/apache2/sites-available/social-graph.conf +sudo nano /etc/apache2/sites-available/social-graph.conf +``` + +Измените `ServerName` / `ServerAlias` на ваш домен. + +**При `VITE_DATA_MODE=remote`** раскомментируйте блок API **выше** блока frontend: + +```apache +ProxyPass /api http://127.0.0.1:8000/api +ProxyPassReverse /api http://127.0.0.1:8000/api +``` + +Включите сайт: + +```bash +sudo a2ensite social-graph.conf +sudo a2dissite 000-default.conf # опционально +sudo apache2ctl configtest sudo systemctl reload apache2 ``` -## 5. Обновление +HTTPS: + +```bash +sudo apt install certbot python3-certbot-apache +sudo certbot --apache -d your-domain.com -d www.your-domain.com +``` + +### nginx на хосте + +```bash +sudo apt install nginx +sudo cp deploy/proxy/nginx-host.conf.example /etc/nginx/sites-available/social-graph +sudo nano /etc/nginx/sites-available/social-graph +``` + +Укажите `server_name` и при remote-режиме раскомментируйте `location /api/`. + +```bash +sudo ln -s /etc/nginx/sites-available/social-graph /etc/nginx/sites-enabled/ +sudo nginx -t +sudo systemctl reload nginx +``` + +HTTPS: + +```bash +sudo apt install certbot python3-certbot-nginx +sudo certbot --nginx -d your-domain.com -d www.your-domain.com +``` + +--- + +## 6. Первый вход (режим remote) + +1. Откройте `https://your-domain.com` +2. Перейдите на **Регистрация** (`/register`) и создайте аккаунт +3. Либо войдите под существующим пользователем + +Если на сервере уже есть данные от пользователя `legacy` (миграция), задайте ему пароль: + +```bash +docker compose -f docker-compose.prod.yml --profile with-backend exec backend python manage.py shell +``` + +```python +from django.contrib.auth import get_user_model +User = get_user_model() +u = User.objects.get(username='legacy') +u.set_password('ваш-пароль') +u.save() +exit() +``` + +--- + +## 7. Обновление версии ```bash cd /opt/social-graph git pull + docker compose -f docker-compose.prod.yml --env-file deploy/.env.prod up -d --build frontend + # при remote: -# docker compose -f docker-compose.prod.yml --env-file deploy/.env.prod --profile with-backend up -d --build backend +docker compose -f docker-compose.prod.yml --env-file deploy/.env.prod --profile with-backend up -d --build backend + sudo systemctl reload apache2 # или: sudo nginx -s reload ``` -## Порты по умолчанию +При изменении `VITE_DATA_MODE` нужна **пересборка** frontend (`--build`). -| Переменная | Значение | Назначение | -|------------|----------|------------| -| `FRONTEND_PORT` | 8080 | nginx в контейнере `sg_frontend` | -| `BACKEND_PORT` | 8000 | gunicorn в контейнере `sg_backend` | -| `FRONTEND_BIND` | 127.0.0.1 | только loopback на хосте | +--- -Наружу открыт только прокси (80/443). +## 8. Резервное копирование (remote) -## Миграция данных - -| Источник | Действие | -|----------|----------| -| CSV / JSON / **vCard (.vcf)** | UI → Импорт | -| Старый Django SQLite | экспорт JSON → Импорт | -| Локальный бэкап `.json` / `.sgpkg` | UI → «Импорт бэкапа» | - -## Устранение неполадок +База — SQLite в Docker volume `sqlite_data`. ```bash -docker compose -f docker-compose.prod.yml ps -docker logs sg_frontend --tail 50 -docker logs sg_backend --tail 50 # если поднят +docker compose -f docker-compose.prod.yml --profile with-backend exec backend \ + python manage.py dumpdata contacts --indent 2 > backup-contacts-$(date +%F).json ``` -Конфликт имени контейнера с dev: остановите `docker compose down` в том же каталоге перед prod-запуском. +Полный дамп через UI: **Импорт** → экспорт бэкапа (если включён в интерфейсе). + +Копия файла БД (осторожно — только при остановленном backend): + +```bash +docker compose -f docker-compose.prod.yml --profile with-backend stop backend +docker run --rm -v social-graph_sqlite_data:/data -v "$PWD":/backup alpine \ + cp /data/db.sqlite3 /backup/db.sqlite3-$(date +%F) +docker compose -f docker-compose.prod.yml --profile with-backend start backend +``` + +--- + +## 9. Порты и безопасность + +| Переменная | По умолчанию | Назначение | +|------------|--------------|------------| +| `FRONTEND_PORT` | 8080 | nginx в контейнере | +| `BACKEND_PORT` | 8000 | gunicorn | +| `FRONTEND_BIND` | 127.0.0.1 | только localhost | + +Рекомендуется: + +```bash +sudo ufw allow OpenSSH +sudo ufw allow 'Apache Full' # или 'Nginx Full' +sudo ufw enable +``` + +Порты 8080 и 8000 **не** открывать наружу — только через прокси. + +--- + +## 10. Устранение неполадок + +| Симптом | Что проверить | +|---------|----------------| +| 502 Bad Gateway | Контейнеры запущены? `docker ps`, логи `sg_frontend` / `sg_backend` | +| Белая страница после деплоя | Пересобран frontend? `VITE_DATA_MODE` совпадает с ожиданиями | +| API не отвечает в remote | Раскомментирован `ProxyPass /api` в Apache/nginx; backend в profile `with-backend` | +| «Сессия истекла» / 401 | `USE_JWT_AUTH=true` на backend; перелогин | +| Данные не общие между ПК | Нужен `VITE_DATA_MODE=remote`, не `local` | + +Полезные команды: + +```bash +docker compose -f docker-compose.prod.yml --env-file deploy/.env.prod ps +docker logs sg_frontend --tail 100 +docker logs sg_backend --tail 100 +docker compose -f docker-compose.prod.yml --profile with-backend exec backend python manage.py migrate +``` + +--- + +## 11. Краткая шпаргалка + +**Local (только UI):** + +```bash +cd /opt/social-graph +cp deploy/.env.prod.example deploy/.env.prod # VITE_DATA_MODE=local +docker compose -f docker-compose.prod.yml --env-file deploy/.env.prod up -d --build frontend +# настроить Apache/nginx → 127.0.0.1:8080 +``` + +**Remote (серверная БД + авторизация):** + +```bash +cd /opt/social-graph +cp deploy/.env.prod.example deploy/.env.prod +# VITE_DATA_MODE=remote, DJANGO_SECRET_KEY, ALLOWED_HOSTS, USE_JWT_AUTH=true +docker compose -f docker-compose.prod.yml --env-file deploy/.env.prod build +docker compose -f docker-compose.prod.yml --env-file deploy/.env.prod up -d --build frontend +docker compose -f docker-compose.prod.yml --env-file deploy/.env.prod --profile with-backend up -d --build backend +# прокси: / → :8080, /api → :8000 +``` + +Дополнительно: [README.md](../README.md), разработка — `docker compose up --build` (порты 5173 и 8000). diff --git a/deploy/social.deepfishing.ru.md b/deploy/social.deepfishing.ru.md new file mode 100644 index 0000000..e2ce68f --- /dev/null +++ b/deploy/social.deepfishing.ru.md @@ -0,0 +1,359 @@ +# Развёртывание Social Graph на [social.deepfishing.ru](https://social.deepfishing.ru) + +Инструкция для production-сервера **social.deepfishing.ru**. Приложение публикуется через Docker; снаружи доступен только веб-прокси (80/443). + +**Адрес приложения:** https://social.deepfishing.ru + +--- + +## Схема + +```text +https://social.deepfishing.ru (:443) + ↓ +Прокси на хосте (Apache или nginx) + ↓ +┌───────────────────────────────────────┐ +│ frontend-контейнер (nginx) │ +│ 127.0.0.1:8080 → SPA + статика │ +└───────────────────────────────────────┘ + ↓ (режим remote) +┌───────────────────────────────────────┐ +│ backend-контейнер (gunicorn) │ +│ 127.0.0.1:8000 → Django API │ +│ SQLite в Docker volume │ +└───────────────────────────────────────┘ +``` + +| Режим | Где данные | Backend | +|-------|------------|---------| +| **local** | IndexedDB в браузере | не нужен | +| **remote** | SQLite на сервере | обязателен | + +Для **social.deepfishing.ru** рекомендуется **remote** + `USE_JWT_AUTH=true` (регистрация, вход, общая база). + +--- + +## 1. Требования + +- Linux (Ubuntu 22.04+ / Debian 12+) +- Docker Engine + Docker Compose +- Git +- DNS: запись **A** (или **AAAA**) `social.deepfishing.ru` → IP сервера +- Apache2 **или** nginx на хосте + +Установка Docker: + +```bash +curl -fsSL https://get.docker.com | sh +sudo usermod -aG docker "$USER" +# перелогиньтесь +docker compose version +``` + +--- + +## 2. Клонирование + +```bash +sudo mkdir -p /opt/social-graph +sudo chown "$USER:$USER" /opt/social-graph +git clone /opt/social-graph +cd /opt/social-graph +git checkout main +``` + +--- + +## 3. Конфигурация `deploy/.env.prod` + +```bash +cd /opt/social-graph +cp deploy/.env.prod.example deploy/.env.prod +nano deploy/.env.prod +``` + +### Рекомендуемый конфиг для social.deepfishing.ru (remote) + +```env +VITE_DATA_MODE=remote + +FRONTEND_BIND=127.0.0.1 +FRONTEND_PORT=8080 +BACKEND_BIND=127.0.0.1 +BACKEND_PORT=8000 + +DJANGO_SECRET_KEY=<сгенерируйте-длинную-случайную-строку> +ALLOWED_HOSTS=social.deepfishing.ru +USE_JWT_AUTH=true +``` + +Сгенерировать `DJANGO_SECRET_KEY`: + +```bash +python3 -c "import secrets; print(secrets.token_urlsafe(50))" +``` + +### Альтернатива — только UI (local) + +Если backend не нужен, данные останутся в браузере каждого пользователя: + +```env +VITE_DATA_MODE=local +FRONTEND_BIND=127.0.0.1 +FRONTEND_PORT=8080 +``` + +Файл `deploy/.env.prod` **не коммитить**. + +--- + +## 4. Запуск контейнеров + +```bash +cd /opt/social-graph +``` + +### Remote (frontend + backend) + +```bash +docker compose -f docker-compose.prod.yml --env-file deploy/.env.prod build +docker compose -f docker-compose.prod.yml --env-file deploy/.env.prod up -d --build frontend +docker compose -f docker-compose.prod.yml --env-file deploy/.env.prod --profile with-backend up -d --build backend +``` + +### Только frontend (local) + +```bash +docker compose -f docker-compose.prod.yml --env-file deploy/.env.prod up -d --build frontend +``` + +### Проверка на сервере + +```bash +docker compose -f docker-compose.prod.yml ps +curl -s -o /dev/null -w "frontend: %{http_code}\n" http://127.0.0.1:8080/ +curl -s -o /dev/null -w "backend: %{http_code}\n" http://127.0.0.1:8000/api/v1/meta/choices/ +curl -s -o /dev/null -w "public: %{http_code}\n" https://social.deepfishing.ru/ +``` + +Логи: + +```bash +docker logs sg_frontend --tail 50 +docker logs sg_backend --tail 50 +``` + +> Перед prod-запуском остановите dev-контейнеры: `docker compose down` + +--- + +## 5. Прокси на хосте + +Контейнеры слушают **только** `127.0.0.1`. Снаружи — прокси на 80/443. + +### Apache2 + +```bash +sudo apt install apache2 +sudo a2enmod proxy proxy_http headers rewrite ssl +sudo cp deploy/apache/social-graph.conf /etc/apache2/sites-available/social-graph.conf +sudo nano /etc/apache2/sites-available/social-graph.conf +``` + +Пример VirtualHost: + +```apache + + ServerName social.deepfishing.ru + + ProxyPreserveHost On + RequestHeader set X-Forwarded-Proto "https" + RequestHeader set X-Forwarded-For %{REMOTE_ADDR}s + + # API (режим remote) + ProxyPass /api http://127.0.0.1:8000/api + ProxyPassReverse /api http://127.0.0.1:8000/api + + # Frontend SPA + ProxyPass / http://127.0.0.1:8080/ + ProxyPassReverse / http://127.0.0.1:8080/ + + ErrorLog ${APACHE_LOG_DIR}/social-graph-error.log + CustomLog ${APACHE_LOG_DIR}/social-graph-access.log combined + +``` + +```bash +sudo a2ensite social-graph.conf +sudo a2dissite 000-default.conf +sudo apache2ctl configtest +sudo systemctl reload apache2 +``` + +HTTPS (Let's Encrypt): + +```bash +sudo apt install certbot python3-certbot-apache +sudo certbot --apache -d social.deepfishing.ru +``` + +После certbot сайт будет доступен по https://social.deepfishing.ru . + +### nginx на хосте + +```bash +sudo apt install nginx +sudo nano /etc/nginx/sites-available/social-graph +``` + +```nginx +server { + listen 80; + server_name social.deepfishing.ru; + + location /api/ { + proxy_pass http://127.0.0.1:8000/api/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + location / { + proxy_pass http://127.0.0.1:8080; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } +} +``` + +```bash +sudo ln -s /etc/nginx/sites-available/social-graph /etc/nginx/sites-enabled/ +sudo nginx -t +sudo systemctl reload nginx +sudo certbot --nginx -d social.deepfishing.ru +``` + +--- + +## 6. Первый вход + +1. Откройте https://social.deepfishing.ru +2. **Регистрация:** https://social.deepfishing.ru/register +3. Или **вход:** https://social.deepfishing.ru/login + +Если на сервере есть пользователь `legacy` (данные после миграции), задайте пароль: + +```bash +cd /opt/social-graph +docker compose -f docker-compose.prod.yml --profile with-backend exec backend python manage.py shell +``` + +```python +from django.contrib.auth import get_user_model +User = get_user_model() +u = User.objects.get(username='legacy') +u.set_password('ваш-надёжный-пароль') +u.save() +exit() +``` + +Вход: https://social.deepfishing.ru/login → логин `legacy`. + +--- + +## 7. Обновление + +```bash +cd /opt/social-graph +git pull + +docker compose -f docker-compose.prod.yml --env-file deploy/.env.prod up -d --build frontend +docker compose -f docker-compose.prod.yml --env-file deploy/.env.prod --profile with-backend up -d --build backend + +sudo systemctl reload apache2 # или: sudo nginx -s reload +``` + +Проверка: https://social.deepfishing.ru + +--- + +## 8. Резервное копирование + +```bash +cd /opt/social-graph +docker compose -f docker-compose.prod.yml --profile with-backend exec backend \ + python manage.py dumpdata contacts --indent 2 \ + > backup-social-deepfishing-$(date +%F).json +``` + +Копия SQLite (backend должен быть остановлен): + +```bash +docker compose -f docker-compose.prod.yml --profile with-backend stop backend +docker run --rm -v social-graph_sqlite_data:/data -v "$PWD":/backup alpine \ + cp /data/db.sqlite3 /backup/db-social-deepfishing-$(date +%F).sqlite3 +docker compose -f docker-compose.prod.yml --profile with-backend start backend +``` + +--- + +## 9. Безопасность + +```bash +sudo ufw allow OpenSSH +sudo ufw allow 'Apache Full' # или 'Nginx Full' +sudo ufw enable +``` + +| Порт | Доступ | +|------|--------| +| 443, 80 | открыт (прокси) | +| 8080, 8000 | только 127.0.0.1 | + +--- + +## 10. Устранение неполадок + +| Симптом | Решение | +|---------|---------| +| 502 на https://social.deepfishing.ru | `docker ps`, логи `sg_frontend` / `sg_backend` | +| Страница открывается, API 404 | В прокси включён `ProxyPass /api` → `:8000` | +| 401 / не пускает | `USE_JWT_AUTH=true` в `.env.prod`, пересобрать backend | +| Данные не сохраняются между устройствами | `VITE_DATA_MODE=remote`, пересобрать frontend | +| Белый экран | `docker logs sg_frontend`, пересборка с `--build` | + +```bash +cd /opt/social-graph +docker compose -f docker-compose.prod.yml --env-file deploy/.env.prod ps +docker logs sg_frontend --tail 100 +docker logs sg_backend --tail 100 +docker compose -f docker-compose.prod.yml --profile with-backend exec backend python manage.py migrate +``` + +--- + +## 11. Шпаргалка (social.deepfishing.ru, remote) + +```bash +cd /opt/social-graph +cp deploy/.env.prod.example deploy/.env.prod +# ALLOWED_HOSTS=social.deepfishing.ru +# VITE_DATA_MODE=remote +# USE_JWT_AUTH=true +# DJANGO_SECRET_KEY=... + +docker compose -f docker-compose.prod.yml --env-file deploy/.env.prod build +docker compose -f docker-compose.prod.yml --env-file deploy/.env.prod up -d --build frontend +docker compose -f docker-compose.prod.yml --env-file deploy/.env.prod --profile with-backend up -d --build backend + +# Apache: ServerName social.deepfishing.ru +# ProxyPass /api → 127.0.0.1:8000 +# ProxyPass / → 127.0.0.1:8080 +# certbot --apache -d social.deepfishing.ru +``` + +**Проверка:** https://social.deepfishing.ru diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 942d4dd..ddac846 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -21,6 +21,7 @@ services: SECRET_KEY: ${DJANGO_SECRET_KEY:-change-me-in-production} DEBUG: "False" ALLOWED_HOSTS: ${ALLOWED_HOSTS:-localhost,127.0.0.1} + USE_JWT_AUTH: ${USE_JWT_AUTH:-false} DATABASE_PATH: /app/data/db.sqlite3 volumes: - sqlite_data:/app/data diff --git a/frontend/src/application/usecases/graph.test.js b/frontend/src/application/usecases/graph.test.js index 668d04e..c9314f1 100644 --- a/frontend/src/application/usecases/graph.test.js +++ b/frontend/src/application/usecases/graph.test.js @@ -83,4 +83,19 @@ describe('getGraphBundle', () => { expect(bundle.edges).toHaveLength(1) expect(bundle.edges[0].id).toBe('10') }) + + it('returns empty graph when map has no memberships', async () => { + listContacts.mockResolvedValue([ + { id: '1', name: 'Анна' }, + { id: '2', name: 'Борис' }, + ]) + listRelations.mockResolvedValue([ + { id: '10', source: '1', target: '2', relation_type: 'friend' }, + ]) + listMembershipsByMap.mockResolvedValue([]) + + const bundle = await getGraphBundle({ mapId: 'map-1' }) + expect(bundle.nodes).toHaveLength(0) + expect(bundle.edges).toHaveLength(0) + }) }) diff --git a/frontend/src/application/usecases/networkMaps.js b/frontend/src/application/usecases/networkMaps.js index 7006927..1b91d08 100644 --- a/frontend/src/application/usecases/networkMaps.js +++ b/frontend/src/application/usecases/networkMaps.js @@ -7,6 +7,8 @@ import { const mapRepo = () => getNetworkMapRepository() const membershipRepo = () => getNetworkMapMembershipRepository() +export const DEFAULT_NETWORK_MAP_NAME = 'Основная карта' + export async function listNetworkMaps() { return mapRepo().list() } @@ -26,6 +28,19 @@ export async function createNetworkMap(payload) { return created } +export async function ensureDefaultNetworkMap() { + const maps = await listNetworkMaps() + if (maps.length) return maps[0] + + const { getDefaultNetworkMapType } = await import('./networkMapTypes') + const defaultType = await getDefaultNetworkMapType() + return createNetworkMap({ + name: DEFAULT_NETWORK_MAP_NAME, + description: '', + mapTypeId: defaultType?.id, + }) +} + export async function updateNetworkMap(id, payload) { const updated = await mapRepo().update(id, payload) await appendChange({ diff --git a/frontend/src/components/AddContactToMapModal.vue b/frontend/src/components/AddContactToMapModal.vue index 250f4c8..698a37d 100644 --- a/frontend/src/components/AddContactToMapModal.vue +++ b/frontend/src/components/AddContactToMapModal.vue @@ -1,72 +1,257 @@ diff --git a/frontend/src/components/CreateContactModal.vue b/frontend/src/components/CreateContactModal.vue new file mode 100644 index 0000000..7057943 --- /dev/null +++ b/frontend/src/components/CreateContactModal.vue @@ -0,0 +1,35 @@ + + + diff --git a/frontend/src/components/GraphCanvasContextMenu.vue b/frontend/src/components/GraphCanvasContextMenu.vue new file mode 100644 index 0000000..f578d6d --- /dev/null +++ b/frontend/src/components/GraphCanvasContextMenu.vue @@ -0,0 +1,92 @@ + + + + + diff --git a/frontend/src/components/SearchableSelect.vue b/frontend/src/components/SearchableSelect.vue index 6cc386f..a15dcfb 100644 --- a/frontend/src/components/SearchableSelect.vue +++ b/frontend/src/components/SearchableSelect.vue @@ -16,7 +16,7 @@ @blur="onBlur" @keydown="onKeydown" /> -
    +
    +

    + Начните вводить имя для поиска +

    Ничего не найдено

    @@ -62,7 +65,7 @@ const allOptions = computed(() => const filteredOptions = computed(() => { const q = query.value.trim().toLocaleLowerCase('ru') - if (!q) return allOptions.value + if (!q) return [] return allOptions.value.filter((o) => o.label.toLocaleLowerCase('ru').includes(q) ) diff --git a/frontend/src/composables/useGraphNodeContextMenu.js b/frontend/src/composables/useGraphNodeContextMenu.js index 81626c1..c8aa759 100644 --- a/frontend/src/composables/useGraphNodeContextMenu.js +++ b/frontend/src/composables/useGraphNodeContextMenu.js @@ -9,11 +9,15 @@ export function useGraphNodeContextMenu() { const contextMenuEdge = ref(null) const edgeContextMenuX = ref(0) const edgeContextMenuY = ref(0) + const canvasContextMenuOpen = ref(false) + const canvasContextMenuX = ref(0) + const canvasContextMenuY = ref(0) function openContextMenu(node, event) { if (!node || !event) return edgeContextMenuOpen.value = false contextMenuEdge.value = null + canvasContextMenuOpen.value = false contextMenuNode.value = node contextMenuX.value = event.clientX contextMenuY.value = event.clientY @@ -24,17 +28,30 @@ export function useGraphNodeContextMenu() { if (!edge || !event) return contextMenuOpen.value = false contextMenuNode.value = null + canvasContextMenuOpen.value = false contextMenuEdge.value = edge edgeContextMenuX.value = event.clientX edgeContextMenuY.value = event.clientY edgeContextMenuOpen.value = true } + function openCanvasContextMenu(event) { + if (!event) return + contextMenuOpen.value = false + contextMenuNode.value = null + edgeContextMenuOpen.value = false + contextMenuEdge.value = null + canvasContextMenuX.value = event.clientX + canvasContextMenuY.value = event.clientY + canvasContextMenuOpen.value = true + } + function closeContextMenu() { contextMenuOpen.value = false contextMenuNode.value = null edgeContextMenuOpen.value = false contextMenuEdge.value = null + canvasContextMenuOpen.value = false } function closeEdgeContextMenu() { @@ -42,6 +59,10 @@ export function useGraphNodeContextMenu() { contextMenuEdge.value = null } + function closeCanvasContextMenu() { + canvasContextMenuOpen.value = false + } + function resolveEdgeAtPointer(network, domEvent, getEdges) { let edgeId = null if (domEvent && typeof network.getPointer === 'function' && typeof network.getEdgeAt === 'function') { @@ -82,7 +103,7 @@ export function useGraphNodeContextMenu() { } } - closeContextMenu() + openCanvasContextMenu(domEvent) } network.on('oncontext', onContext) @@ -98,10 +119,15 @@ export function useGraphNodeContextMenu() { contextMenuEdge, edgeContextMenuX, edgeContextMenuY, + canvasContextMenuOpen, + canvasContextMenuX, + canvasContextMenuY, openContextMenu, openEdgeContextMenu, + openCanvasContextMenu, closeContextMenu, closeEdgeContextMenu, + closeCanvasContextMenu, attachNodeContextHandlers, } } diff --git a/frontend/src/infrastructure/repositories/networkMapMembershipRepository.remote.js b/frontend/src/infrastructure/repositories/networkMapMembershipRepository.remote.js index e6058cf..e5b1414 100644 --- a/frontend/src/infrastructure/repositories/networkMapMembershipRepository.remote.js +++ b/frontend/src/infrastructure/repositories/networkMapMembershipRepository.remote.js @@ -23,7 +23,10 @@ export const remoteNetworkMapMembershipRepository = { return data }, async create(mapId, payload) { - const { data } = await api.post(`/network-maps/${mapId}/memberships/`, payload) + const { data } = await api.post(`/network-maps/${mapId}/memberships/`, { + map: mapId, + ...payload, + }) return data }, async update(mapId, id, payload) { diff --git a/frontend/src/lib/map/conflictLayout.js b/frontend/src/lib/map/conflictLayout.js index dfa3cfa..66f1e08 100644 --- a/frontend/src/lib/map/conflictLayout.js +++ b/frontend/src/lib/map/conflictLayout.js @@ -3,6 +3,7 @@ import { radiusRatioFromInvolvement, involvementFromRadiusRatio, } from '../../domain/conflictology' +import { hasStoredMapPlacement } from './positioning' export { CONFLICT_CENTER_NODE_ID } @@ -23,12 +24,14 @@ export function computeConflictPositions(nodes, layout) { } export function conflictNodeXY(node, layout, posById) { - const ratio = Number(node.map_radius_ratio) - const storedAngle = Number(node.map_angle) - if (Number.isFinite(ratio) && Number.isFinite(storedAngle)) { - const safeRatio = Math.max(0, Math.min(1, ratio)) - const r = safeRatio * layout.rOuter - return { x: r * Math.cos(storedAngle), y: r * Math.sin(storedAngle) } + if (hasStoredMapPlacement(node)) { + const ratio = Number(node.map_radius_ratio) + const storedAngle = Number(node.map_angle) + if (Number.isFinite(ratio) && Number.isFinite(storedAngle)) { + const safeRatio = Math.max(0, Math.min(1, ratio)) + const r = safeRatio * layout.rOuter + return { x: r * Math.cos(storedAngle), y: r * Math.sin(storedAngle) } + } } const p = posById.get(node.id) if (p) return p diff --git a/frontend/src/lib/map/positioning.js b/frontend/src/lib/map/positioning.js index 54dff54..54280b8 100644 --- a/frontend/src/lib/map/positioning.js +++ b/frontend/src/lib/map/positioning.js @@ -53,6 +53,12 @@ export function normalizedCircle(n, geometry = defaultGeometry()) { return circleKeys[Math.floor(circleKeys.length / 2)] || circleKeys[0] || 'productivity' } +export function hasStoredMapPlacement(node) { + const angle = node?.map_angle + const ratio = node?.map_radius_ratio + return angle != null && ratio != null && angle !== '' && ratio !== '' +} + export function computePolarPositions(rawNodes, layout, geometry = defaultGeometry()) { const { sectorKeys } = geometry const groups = new Map() @@ -87,12 +93,14 @@ export function computePolarPositions(rawNodes, layout, geometry = defaultGeomet export function nodeXY(n, layout, posById, geometry = defaultGeometry()) { const { sectorKeys } = geometry - const ratio = Number(n.map_radius_ratio) - const storedAngle = Number(n.map_angle) - if (Number.isFinite(ratio) && Number.isFinite(storedAngle)) { - const safeRatio = Math.max(0, Math.min(1, ratio)) - const r = safeRatio * layout.rOuter - return { x: r * Math.cos(storedAngle), y: r * Math.sin(storedAngle) } + if (hasStoredMapPlacement(n)) { + const ratio = Number(n.map_radius_ratio) + const storedAngle = Number(n.map_angle) + if (Number.isFinite(ratio) && Number.isFinite(storedAngle)) { + const safeRatio = Math.max(0, Math.min(1, ratio)) + const r = safeRatio * layout.rOuter + return { x: r * Math.cos(storedAngle), y: r * Math.sin(storedAngle) } + } } const p = posById.get(n.id) if (p) return p diff --git a/frontend/src/lib/map/positioning.test.js b/frontend/src/lib/map/positioning.test.js index e688d53..83cd018 100644 --- a/frontend/src/lib/map/positioning.test.js +++ b/frontend/src/lib/map/positioning.test.js @@ -4,6 +4,7 @@ import { sphereByAngle, ringByRadius, nodeXY, + computePolarPositions, defaultGeometry, } from './positioning' @@ -40,6 +41,19 @@ describe('map positioning', () => { expect(p.y).toBeCloseTo(0) }) + it('ignores null persisted coordinates and spreads nodes in sector', () => { + const layout = { rInner: 10, rMid: 20, rOuter: 100, cx: 0, cy: 0 } + const nodes = [ + { id: 1, life_sphere: 'other', network_circle: 'productivity', map_angle: null, map_radius_ratio: null }, + { id: 2, life_sphere: 'other', network_circle: 'productivity', map_angle: null, map_radius_ratio: null }, + ] + const posById = computePolarPositions(nodes, layout) + const p1 = nodeXY(nodes[0], layout, posById) + const p2 = nodeXY(nodes[1], layout, posById) + expect(p1.x).not.toBeCloseTo(p2.x) + expect(Math.hypot(p1.x, p1.y)).toBeGreaterThan(0) + }) + it('defaultGeometry matches SPHERE_ORDER', () => { expect(defaultGeometry().sectorKeys).toEqual(SPHERE_ORDER) }) diff --git a/frontend/src/views/GraphView.vue b/frontend/src/views/GraphView.vue index 135da69..83a9eb2 100644 --- a/frontend/src/views/GraphView.vue +++ b/frontend/src/views/GraphView.vue @@ -34,7 +34,7 @@ -
    +
    -
    +
    @@ -139,6 +139,20 @@ @edit="openEditRelation" /> + + + + 0) return + openCanvasContextMenu(event) +} + +async function onContactCreated(data, mapIds, pluginPayload) { + const created = await store.createContact(data) + if (mapIds?.length) { + await mapsStore.setContactMapMemberships(created.id, mapIds) + } + const { saveContactPluginData } = await import('../application/services/contactPluginService') + await saveContactPluginData(created.id, pluginPayload) + createContactOpen.value = false + await ensureGraphReady({ showSpinner: false }) +} + const store = useContactsStore() +const mapsStore = useNetworkMapsStore() const router = useRouter() const graphToolbarActions = getGraphToolbarActions() const graphArea = ref(null) diff --git a/frontend/src/views/NetworkMapRedirect.vue b/frontend/src/views/NetworkMapRedirect.vue index b65539b..842e8e2 100644 --- a/frontend/src/views/NetworkMapRedirect.vue +++ b/frontend/src/views/NetworkMapRedirect.vue @@ -7,6 +7,7 @@ diff --git a/frontend/src/views/NetworkMapView.vue b/frontend/src/views/NetworkMapView.vue index 771b526..57a8fc9 100644 --- a/frontend/src/views/NetworkMapView.vue +++ b/frontend/src/views/NetworkMapView.vue @@ -15,7 +15,7 @@ @create="openCreateMap" @manage="openEditMap" /> - @@ -42,15 +42,18 @@ -
    +

    На карте «{{ activeMap?.name || 'сети' }}» никого нет. - - из общего списка контактов или создайте новых в - карточках контактов.

    +
    + + или создайте контакт в карточках контактов +
    @@ -112,6 +115,21 @@ @edit="openEditRelation" /> + + + +
    @@ -174,6 +191,7 @@ import { involvementNodeSize, } from '../domain/conflictology' import { fetchGraphBundle } from '../composables/useGraphData' +import { ensureDefaultNetworkMap } from '../application/usecases/networkMaps' import { edgeFromRelation } from '../application/usecases/graph' import NetworkMapTopPanel from '../components/NetworkMapTopPanel.vue' import NetworkMapSwitcher from '../components/NetworkMapSwitcher.vue' @@ -182,6 +200,8 @@ import AddContactToMapModal from '../components/AddContactToMapModal.vue' import CreateRelationModal from '../components/CreateRelationModal.vue' import GraphNodeContextMenu from '../components/GraphNodeContextMenu.vue' import GraphEdgeContextMenu from '../components/GraphEdgeContextMenu.vue' +import GraphCanvasContextMenu from '../components/GraphCanvasContextMenu.vue' +import CreateContactModal from '../components/CreateContactModal.vue' import EditRelationModal from '../components/EditRelationModal.vue' import { useGraphNodeContextMenu } from '../composables/useGraphNodeContextMenu.js' import { useNetworkMapsStore } from '../stores/networkMaps' @@ -200,16 +220,46 @@ const { contextMenuEdge, edgeContextMenuX, edgeContextMenuY, + canvasContextMenuOpen, + canvasContextMenuX, + canvasContextMenuY, + openCanvasContextMenu, closeContextMenu, closeEdgeContextMenu, attachNodeContextHandlers, } = useGraphNodeContextMenu() +const createContactOpen = ref(false) + function openNodeInfo(node) { selectedNode.value = node || null selectedInvolvement.value = Number(node?.conflict_involvement) || 3 } +function openCreateContact() { + closeContextMenu() + createContactOpen.value = true +} + +function onMapBodyContextMenu(event) { + if (loading.value || nodes.value.length > 0) return + openCanvasContextMenu(event) +} + +async function onContactCreated(data, mapIds, pluginPayload) { + const created = await store.createContact(data) + const targetMapIds = mapIds?.length + ? mapIds + : (mapId.value ? [String(mapId.value)] : []) + if (targetMapIds.length) { + await mapsStore.setContactMapMemberships(created.id, targetMapIds) + } + const { saveContactPluginData } = await import('../application/services/contactPluginService') + await saveContactPluginData(created.id, pluginPayload) + createContactOpen.value = false + await load() +} + async function saveInvolvement() { const node = selectedNode.value if (!node?.membership_id) return @@ -334,6 +384,9 @@ const mapsStore = useNetworkMapsStore() const typesStore = useNetworkMapTypesStore() const mapId = computed(() => String(route.params.mapId || '')) +const createContactMapIds = computed(() => ( + mapId.value ? [String(mapId.value)] : [] +)) const activeMap = computed(() => mapsStore.maps.find((m) => String(m.id) === mapId.value) || null) const activeMapType = computed(() => { const typeId = activeMap.value?.mapTypeId @@ -691,7 +744,12 @@ function buildVisNodes() { } function initNetwork() { - if (!graphContainer.value) return + if (!graphContainer.value) { + if (initRetryCount >= INIT_RETRY_MAX) return + initRetryCount += 1 + initRetryTimer = setTimeout(initNetwork, 80) + return + } measureLayout() const el = graphContainer.value let { w, h } = layout.value @@ -877,8 +935,9 @@ async function load() { } finally { loading.value = false } + await store.fetchContacts() if (nodes.value.length > 0) { - await store.fetchContacts() + initRetryCount = 0 await nextTick() await new Promise((r) => requestAnimationFrame(() => requestAnimationFrame(r))) initNetwork() @@ -890,6 +949,10 @@ async function load() { } } +async function openAddContact() { + showAddContact.value = true +} + function switchMap(nextId) { if (!nextId || String(nextId) === mapId.value) return router.push({ name: 'NetworkMap', params: { mapId: nextId } }) @@ -930,8 +993,13 @@ async function onMapDelete() { closeMapForm() if (String(mapId.value) === String(deletingId)) { const nextId = mapsStore.maps[0]?.id - if (nextId) router.replace({ name: 'NetworkMap', params: { mapId: nextId } }) - else router.replace({ name: 'Contacts' }) + if (nextId) { + router.replace({ name: 'NetworkMap', params: { mapId: nextId } }) + return + } + const created = await ensureDefaultNetworkMap() + await mapsStore.fetchMaps() + router.replace({ name: 'NetworkMap', params: { mapId: created.id } }) } } @@ -941,6 +1009,13 @@ async function onAddContactToMap(contactId) { await load() } +watch(graphContainer, (el) => { + if (el && nodes.value.length > 0 && !network.value) { + initRetryCount = 0 + initNetwork() + } +}) + watch(mapId, async (next, prev) => { if (!next || next === prev) return network.value?.destroy() @@ -1039,4 +1114,11 @@ onUnmounted(() => { .legend-tension { color: #f1c40f; } .legend-alliance { color: #2ecc71; } .legend-neutral { color: #95a5a6; } +.empty-state-actions { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 10px; + margin-top: 12px; +}