From 85ced5161ae6dde01e61481ffc25d143b4d04b40 Mon Sep 17 00:00:00 2001 From: Richard Cotrina Date: Sat, 23 May 2015 11:14:58 -0500 Subject: [PATCH] Listo Backend --- .gitignore | 3 +- docs/modelo.mwb | Bin 0 -> 17149 bytes docs/modelo.pdf | Bin 0 -> 51613 bytes docs/modelo.svg | 5548 +++++++++++++++++ src/citasalud/apps/api/serializers.py | 16 +- src/citasalud/apps/api/views.py | 5 +- .../apps/main/_migrations/0001_initial.py | 86 - src/citasalud/apps/main/admin.py | 24 +- src/citasalud/apps/main/fixtures/admins.json | 1 + ...{initial_data.json => especialidades.json} | 0 .../apps/main/migrations/0001_initial.py | 177 + .../0002_especialidades.py | 2 +- .../apps/main/migrations/0003_admins.py | 30 + .../{_migrations => migrations}/__init__.py | 0 src/citasalud/apps/main/models.py | 49 +- src/citasalud/settings/__init__.py | 19 +- src/citasalud/settings/djrf.py | 3 +- 17 files changed, 5812 insertions(+), 151 deletions(-) create mode 100644 docs/modelo.mwb create mode 100644 docs/modelo.pdf create mode 100644 docs/modelo.svg delete mode 100644 src/citasalud/apps/main/_migrations/0001_initial.py create mode 100644 src/citasalud/apps/main/fixtures/admins.json rename src/citasalud/apps/main/fixtures/{initial_data.json => especialidades.json} (100%) create mode 100644 src/citasalud/apps/main/migrations/0001_initial.py rename src/citasalud/apps/main/{_migrations => migrations}/0002_especialidades.py (94%) create mode 100644 src/citasalud/apps/main/migrations/0003_admins.py rename src/citasalud/apps/main/{_migrations => migrations}/__init__.py (100%) diff --git a/.gitignore b/.gitignore index 3d485cc..0cb3b27 100644 --- a/.gitignore +++ b/.gitignore @@ -59,9 +59,10 @@ target/ # Visual Studio Code Settings .settings/ -# SQLite 3 DB +# SQLite 3 DB & MySQL Backups *.db *.sqlite3 +*.mwb.bak # Node.js modules platforms/desktop/src/clients/admin/node_modules diff --git a/docs/modelo.mwb b/docs/modelo.mwb new file mode 100644 index 0000000000000000000000000000000000000000..909c13b73a139c868e225eb252cc94508b7aa552 GIT binary patch literal 17149 zcmZs@b95y^_bwbwl8J5GPA193wr$(CZQHhO+qN+=PdG_#=6!$ne)q2R{n6cZ_NqGT zboZ`(o_e0WOHL9L3>djtd_6d_X|9To6DA-#v|N4V|rxZJg+=T@C2mtgWuHtsOVnQ*L%=OT~;UZLYRG zH>DAP_^-3aRXAOqJJ{?!?in`UC4PY94TO_eh*5^0F6t^I7_WOAfQo?}oMlX`H8_DK z^u6K&o&LQ${d!@{?s_R%pph~0bq}w}O8vS!m-S8Y>er209Hx+1pw#_)T%7r}A1pQG zP+<}|f8bN|d4IqCG1}YXeYY$A#;U}8cRbuFR53oOZFm&XZ<%Kxe+m)o#=Poub3wNKDi=gmWIu{*~D}dxN zMI0jpW-A>|FX1(vve?_@iQ>;9|+ z(cwe$>HZX%77}&4g>PiowVH=IWt}Kp=XCpUs#N&nNj9?65fD?VtK9Lradw`{OdGQ$ zNGo#^+4bw%*Xd*AZ{*>++r!Gig>KK=!))a*t6iROQ(al-tlfp-_vwoZ`oBDrn;#WY zvmXz$!FST|+aDXCsi)B8g_2#fp{K2C-e1|X5i{L3ch{Dizn#lq6VA*A|4w?h{2ow= zc5|}_XguBTEpjs3PX)-`byR891)Y?d&_PhDA@$w zIE06va>MjQ&yS+vdPyvh19BIhpmxX(bq~YeXr)sgL~okC%}x1mEk*Xs%tl84`bfQ& z0I#2?ZarW6I2WJZ>s{Z~*PUw*IuH0ku6nOT3A*~#!EoeX~D|5!g+b&!U{#Wg%UJYP1hFybFLNQ94G|J+ynG*~AS z$Cd8LC2f3%7&5)sm0%;d`JBeS4G&EW-K?YVp?g1$5263kl&PI|MJM?ExeQT8uRN5R zIGjn(b!?Eo5Nl!I3I&!DIp&K7lhm3bMb-t$g(n?7LIn@=VnlMlq;j~sxOaA?E`;-< zCnnyzSvXLwTg1Ik5_(ef{X~;ne#wLUPUYlwNolOdwz7p6Q~Fq^;Qq~tBZO{MsJ5^g z1y{|+AYG&uCTC0`31dJv{8f0}C1PKu3c=-Tx57(4uF~Z8T|ywhUPAq)qHnOfey z{gHgX1Lx-3`9bRCo^=`9>Xw?f7gfHZclXpNp)e26LRMjGGClhE6%9P&$`(KQ^%bVm z)v)fd)RnvXxP750prno3HbMQ9(|5=FY19^zjQ8gc%Uy!@JKJBpCy8o9k-M)Jh_(Lx z&Sh_{2RF-8TstY+*sbf^4on=}Juxsm__n>F!mp3AcwLbG4u(E5d@d; zL|$YJMgBSgN4<o6j2xsbEza{({Xp+HLCB7b>aJH_5Q6$NiV#p3?9wQ z7h#j^oGz>}AGrCF-2QUKLZ3`vH3^BCj1NiQuNAL2xTCS12)xD|F8s|HrpW=`FN5$FbeEbuj)CP^moYd#45en-GnB z!`Wak->h#?VUi>4>~4n~!klbLD#c3tXCAk^PkDrr295T_^knTsRen~8dNd322LT6n z+l+P}$H?*zbFIhQuZYM|b^3-wHCv@SD2>NjyB$Vc1Gu!gAzHuJ9=3 zi9t6c`s+-s$@7vL!}?v`tsc*hec$tD@);l5LrU43Oq!$WPS-*g8q+)8l<1smHXZ79 zxXIGzccbF%_~q4x{3T>{%(!O92BOVz3ID1=;)~PH&0e1#a~PG>1<#yAu zqQbPuil2vq_uQ55=E*V3S2XxCkz{B*vntRL0GOdhaC8PmUbNa(O(0g`+q;@5-d@N8<%BgH(y>-7b|%nZstcureobJ8mc}Q zcQiEKyEE7tE zwUup`FEU{xLpGANO#xRvq6U(yq$t->HG*3Se6iyQD)#dN@9qG}9tE zWb>acXSreGm~>`$WLxfhB`FtT(LMOY{Spj3nxDfLx-YwU>5(2U?6*r4)m~zt#6=2x z6NhnlsQEcw7{}$|KVDc$xvqFmfp2qP78wK|RhNJ$08H$MsEk>kff?--S5Q?vc__@T zr_+W4OmB4*EQxsw;wGPr?wBldxXc!cW~RhsipP=nm{+|3y82Utp4$uu`clI;3L;3A z8_%u{|K~xM)q(btG9q5$(n_sONWkqysT;1RR#QHm=JL_l$NOD{6pPEr!FhhtTi1+< z5(K8sE4vajK%avW(IM%N{w$Q~eJ;KSip^HxQ_JiN&8dz8hxU7TFgQM4tEcMI%vFqp zv>N9;K6b}UVt5Teq!@AoFL@S!&#-fM`BGd~WWgb4lY%2b1AYMSnMJga9B~O!m;`|c zruY`*OvC`i8@GC=n#0Dj`A0{|x#;Z_%&6nXGo%Rt_|+`3nJYpbuU)vf{mes&40; zGsotiwcX0{ZtETf2K$}{1c8G?=o&v-gRc4Hj~BUJpMvu;4GkMK9rzWxza>Y4=rk0NPO1(lHFqt0tSaI;OA z0XAz!t!{N){pI^8vqI;Ht)bp;{tiM%0*zKw3Qo^`%&8UdnAE?Z2vSta=TXs>E}4)s z;f)M_Mj4mGImcMW%zjp$4ao|MNo9?xuHKrUWPp*NM6rRHek`l}O zeUanQ;V7!(OOU{zU?d8m5l`L)(i3tP+4A;zSHUNj+YTk)g5%g{ISi7d#Ib-1&Cmg1 z2&oc3PDJq2KP(#HB_;z;gi2Gw*&8ZJjEeYWMwwe>c6*Oi%mvkqx8MHg|AWr zDS~SitC@tblX@PSqP10sJ^-n^M)EP}%0j#p0zK)EzXnnnsrCfO2cEj@tlVQla_5jn zgT!3&Sx!|8dhf6FPuGGJ62^b;s@YEm_O8JBu7J=&99G3j15vtxrxz3j{Y_Piz&|34*Ln0YHhF|IuSrMNkH+`NsPi07x_LvRC7wql6_8>8zx*s zb!e&cG+K0;tBT%63+{vUzx$-h(N?x(~2w)Lb&XY&vaoL zz+Q{bl>1f2ifykv$v}lwNZ4N2RX-UBfycx}0_>&~I=X$@Y6}1cTlR7567*vSLVyKI zCwaY+f2j#TNa%Gq$>PA9`vt%oO@jARvWR-39FN~_6 z6okNK;!FZ^QVWk6tB#0CID5#H?RoQhzI$rz%(RR)p9rA~m4DAql72NZ=xZ4_d9CY0N zho1jVLoJ!Zb+d%1)`*U!=%OMX$GAL1YsuNx?%Gw>U%VhDR%~hAVNH85MCOob>Zf`s zaCn?){HD7E43eT);3o71B7W=b1Prk`)q$~Hem}z6_<4$jV5zn9<5WsOL5zy1nN%Z@!IR+7I3h5pd%bW!*+U zx<9VRC#=Y+|6IYxRsA=t(zWg$Yqg;gw0Z-hi{6+0P6*Xfm%N7r9{)|=eno!DvaS!2 z06Jd1W@7_?Xx;oNpn$X=m(!2G5J)LvCl=ct`bfcE1Oazeu6L3EchJo+f))HeD^a5l)u&6aXSB#wZy2wDKI zJO~LLb5^eVV?L)zkVVg#BM1X$(U6oF!SPBT45ZyEaR~Rtiznk&PMT#bA%)f1eGQ|b zB#Vo91%8b|2~o@gQ4h3E9vZuHdFEt{!gz#B%MVY^(t}Sd*!lwaLo1(K%zZ55e0c1J zhIw&1-`3WIEOctBhM74NB@a739rHCV{pWI|T=$v}z~GDduXjU8c08&$-4$siSc8j< z%B)L62yKG0WNk>s*0m>V;D4jy!GB>NV{y`{c=5T5r-_hRkRS&uW@xz0j!ygB<<8J4hnT#_J5*;hEnEa21|0#&}4>|hR;m^_RL*F3LNq)Atz!~44Q zz>v()E65>#M79(CN@i$J5ypXHl>549s@-{oHfAoRHc+~Cd0=2AweSc(P%0qQW;yx4 zn^~yFRa$s7w|@GFtX#d&dh^IMM5!Nv`~&*V;eW@mS0n3)vxOBrr_vCSAxmpO71!u zW8h~1kHw4f=re#=5M0qJcBYOl_Eek>{25@SbX78lpc`-D0^SLRFf>_*H+uBU;*Kit z=nZ@vKx$)%T@IMi2j##VjJA@feh%&I7S9?BzLJJ+{q+EGy4lz*&ey$?r<7*JEr@wc z&#FsPsaLhWz{1SHNQS|{f$-pu!P#CEhUMs8#SoEiE9XK>uw`eq`ggKM)=R zuO<)(k8NO(o7frT)~{;f@I{XI#J&Q`x0VpSH-PbB4|qMfIy-;gV7KT};u6V7*2UOW zVs{9T-o2ij_qgrtQf%w#LTW}N=t63w+LEhn-sk0;TUGH5eH z$^M_Ff0qn@i1K3HPr3ZOeD}CrYgSN!z%mm8|5BO?6TWLZcqoFc;3gvK#fY}ay*!}F zg^0a8KPE|oZx}3lPKi~QN4}2(msp>Om=9fE8t0*bjH(-v9Kdcq6PXY~2ajdcHwVf1 z!)y&Q8Xwjm!3_3V^`-NAQ5rFR0tSOBfTIbKYdb$AYoCJfuGFa;}%}y zo{|Y8UPXq=6#?~=prOC?>>v+-*{#4r2@K?zqw^5iagfnU?=92s#do*Ts4ydipjjm{ znPM^J5VlqLS$<+zb`o^hqtsb`Fe2GiqJuJqzRSl8E)O+wjk~$4a5nllGow&c>$*8y z+6&tVijPE)YQ8@oDyOqwP7N;ynjO74H|%nj{T?69*C>OZ6c5)c6oU6unaTb7Yqw~8 zh}WE2J8H`DkT4-!Bum5cV%P4}-{5NFs$?;+Q2vQ=h8;OOd2=2uvGG>s^$CQ(`B7sc z>%o+e@?fA^wEPE2-N-)JJg(dLCU+TezIbW-Bl3Hg4Q-PNiYc z!ls#LncxF9J7&j~Sob5f4^;40s&kY%HYCOr&W#OnR$mV*Cme{&a^zt~<0Z_E2lgi^ z2=al@*6zUFzBEy9fBjzJxXXfr5ZlNgW0vV8~{jdy|;#Dyo9%_LQIur2d-I=5oIHXN_&BB~=yo3kjww=*+-u`Z+Y^XSKY2EWd(sscD9w&+d+ zY-ijfFTyKM*BJRv5E!D|lL)UB?FjIAS%lXn?W066A0VP!f_wKoLp@spqTE>`CArrn zgcDclhqI2rxYr>Jh6p8s)>T-XeF%G?Vcv zGr7g)#tAZP+Kl!ZcTVVQKh*6q=m;AZrlDr>dDzapIl~x%SfybkRC+7(GMF-htNS(n z(5V8i_P#l(EP? z9{H)h5ra(~p`)NsA1rk{VLA8Kt$u?342fYnZDgZylU-pK?L!@~L7sKEzrqoFN`$|` z;_}E}zRm$eKpTso^^~!8Wwbo~5U47)qo5piWhvW92W`}FTxJQ|iKHC%Vij9U@~Rh1 zo=A<6k{!OVkjPl7=6G#r>zH~~d0J((t*t5;N@s{+JFIFS0~^?6wx!eQDjp2(BvhRh zTnc7?iT zV5EsER4IE7$Py>ow1uHyY{E1L4?BN7s4%|($UnuGSvQHSmoZgKq~A^f^3N$6v#SW> zoZXB*yj%c0! zZPgrx$P00cwwwI%Qn6VHJ_7hpobD;}Pzr!3@k}efR&}nxQ03;`n|Dr_e)B1EuVBfu zA2IuSJS54pp)V*bJlLTx+f-f#Trk11tHo%PUI)OHjfhARW!}woPss@WSLNQta_<&0 zSCugtt0}Gp3~aJQ!0>8eu!aLb$Y=&2zlVqj&5i=Z0{HXNNEaEDvB2^q*BRk42x8_k z*g+o5HxD3rRW;L2(OnY;v33>DRTw(_{_CNsoG# zX1ysLu{Xzke}cz<2?$$M@SoT6gl_GDn)u;2e*~yuP z0Rc_a9RSXSCql^zupuX2s*~aG4cbZ-fNQiB6QX*?Eu={wiYx}#QDSm+|APQ368Z?j z7aIL1P6zA{kkgV71ii=)^w;cV;n;gLdUyhdF`#frpdkrAp)EYWwk6Pjv_!Yupmd2| z^8?WzhTlM&RnLh6ytrGXK=2hKMvxvBjvdZ>GMe7qRD2=Ll4GUiJ2)STu;|$c#XxM; z#bd`4>q+9Y3{@%^BF-kpzr}xXErP^YJWUxwBz?4~JYnC@EiliE>%FD_d4uPthQ z0o8Sz(BE{Fi+nbR+0wA)?=&q$wqeiV&fg_%lTMUu+E;guF?A*9HOzAx`41D((8t2% ziFCUKo?}{=U3`alvcM06h^CkDHM?D4KO?NQ6d7ZpUXnQ7(W`S){zqS|3UPr*#x-*owJLhKZcP{wC(cHdv5N9^hpv=LnkCCqb3&#u z`D~8s4va~!n@xawE}{hy-R3BmphFQ0ouH$!c$jToNA#!855p6C&>-XuBpCu4J6cqk zJR`T{^riiH%;a<-7wz zl(7)U0Y5^Mde*uMbkmBd!BiVJAibh7OGSXOm8~?HGj4IiS%w<1<+O=v%slu_s%+M( zm#6WI^^LnBCnw*Gv=W&0z z3>qPr$6n--Q%(E>B@{yory!3VEJ83u9Y?@ykIxEZHPq_a!oe0F8cvyL z+O>OTYg}bQm;zU*9nvMlb#c$BfuK_!k*r=suG_3|((1FN(iok_u znTM6}td2Am^9*iM-CWdRyay}l7TCA|HWS{7ThJ+`>Ky}X(6%(~%xU+(B59A{Cu#TK z@3WF{xRO3X1LPJBh5M0^VkaiCJ3}NNMIewMnXip6#4m5S5LGfT#4E$H$0tjI|072g z1PH-U1eVeaYRE)2BnTujJGe}QKutu%P#FeAOoH(I8&fVbR4^P?5++Vwt&bDc9Lh^Q zYBKmAfIya^td*(VfL&>-Rc_n%m!U8&X5&hxcIbBDunpohb<(TO*FP)5I_#Bi8g6y$JNYD4P3D1oak zJP4ZWNlN|W--^%px4M0#(egqi_n+nL=W|F8)}hFi;m8o2Z53+YhUCD_kOZH0e5QtL z0TIfwZbCyKyB}>T!PKB_aPT$%U0cttz%_nTmV^JHEaB0T%D`)dj(-s1^jXv)DQ|OQ z$`yc+Qf(%eIqV(5!OB5eP9#t^CXiazGm$&?X(>=Vh7~HEAdVO2RL;S% zc2BA%}oX7$v@GkQ!8XJ&k73g#0DvI)vSzf(os*7nGa@>E+43 zA9x+c(Lp?EHNL18tD)?!d7=-xB%+~+eOG2%z5!VnlFIz<|AZu=GS-hRKXd7Wj z)^J9HxyGwUckonB=q065Ovhw40I`wHHHC02`-;R`=LT1 zZIe*F-jH7X=RY-NLuYKu=m6d*IAIpgg;1mX6=#bKJSl>&JZuy)DFQ=_3W>k`y8+Xr zH1xp!&prlRy*r1gP(C)u2CEdxvU7IcLJ;I0NCBy@Hc6(f`hzeE_Ib}i1R+>R7aH07 z0RnxX|2W0??fYE3lFR)N!Jo#vWq=@pg@*(g^(PW>t8yYNp)>yf;h;KsO72I2Kh5@H zrG^?9l2}INzNszILcKng0t_=F(rAjO%k=uTrN9Fr#|Y#|r5u)=$iF=nK%(yd{+D@- zoPu!X^hr5`KqIvo*2^Sd0mNUu=_wIU3nf#;;3!S4%5yVyDN#W@P#fMxZv4M(^7FFW z$D#tB7Uk8be_Tny_2g;u^Lus&xSTXIpcUKyxJnb`?>q^3QZnYKh$OCU1zw_fB!L6@ zMMOhH2#+^wI)`4}{J5p98 z((}Fe@}qX_CQ;d0ROMvNv#;RhKTC+#>~AI#3WDZIaeQa`Z)j4FTS&;~$RJU5afo=yLwF)? zU=hgElrmZW0ev#-w8p3RZu}5h34a`acGWq^@93@w_fNo10x@7Ih=I`fQ6`gsf|cRlCR9>_t6O(F%y zqo1G$AA`okuHQhHLa2{~L}o3UR^)@hH$Xxnbv-+Ss46ItrZx0nq&)?Snb^!sCb>1_ zqCghNUnKQ51Zypkj#GC~A&Y`TZ*=%%^0_Clwi9$Uts!XzzqoP|X=F^xs!0kBGZp?5 z0tWWnU&L(BiTR;Fuyzo1g9e6o^5k(2;uH zBQX{eGe}%WT_PrMYbYi;^OzqdE;Dh&q7~zUVDxB)BAs-4Uw--Em~jY~K@bFH zb6w+c$?mpl?RbB2;=G3=}=N zkf(7=u~5jXJd)r(=6A@o$vLw~o|fj6Wx9iBK5d`FKeuk5(<8UAamW>j5c6>PmtEHU z_1g?I>ONqfgG#K&KC?KX{>h^*>}r%u*!Vv>K=PFlD&NX}Jm6vbN|$$+1-x=GaATWC z9Wm^9S;TS)R|6G!r68G@&vMm_JKN3*RD<}RY)0OsBBNs+T$ysxv!XHT%SmUEo_3Fq zpK#+Wo1a_ZRApoO>Zid{f9tODwf1bzWoZY@3^2U&=$_VD9LS2St+WoodMDp}INv3i zTrW5QhjL~aV(;Z`I?@onvjQwWu=nt^YvY0p#f zFptup@zLS5tUJxFm-@XU4goa5-W|3`a%mL6K%%j7A(bIUq(U914u8hg#zBt6*I!%#ma zlH+&JqFHD>4CXF5)47CftxO67yUoj~VCTejZ4YG;xuNbk&&HREq_ zQp^<2ubZXQx?_<`e~ZsW!d}#|A;oyA9pZ{k-SRvjmT&n?$i+y&-sQjD{=y%l8}Oih zUXLS5ImdJL<6z07cUQU8|J`JVH^5iXwSc*kMz#o!le*;#%&e&sSfKz;eJc@|0lEHRw3iX*UCGZ)Vx!7tQ`xv&SCl3~!k2_m949u_uWUMmNw zLtUxQ%8hl_C+x178X64@EyFnM)fW=ICMVUu1X6;goX#kdc&r7@IHAE5i!Qges-lmN zoWJR!uX_loxB6y?g0RA#JiqUwWET1Bj#5@7Klix2TGw0c%r@@W*-8{V81|Tq`b6}4 zH&)fyppF?`6+Vv$$=RilQ|x}?e=~4=|6$-#GX6IM*XlcB%5jx2F)a6A2JWi!|1fa% z7=OMQI7e;EXo;I9*(FA*T;9G>m)^?t#GI(2<1Y5Fl5Y}@`*CA?0jIj4)ansIC_3zb z-L4?+ClOI@qWq(C(kxnU)Z-5;TA$vU@mE9^;>P(cf?tnqzwNLkNd5>ipJ7eEHb3MS zasaVp2AZTI49;zdnFG&x!A%#A9^WEHXN55$A>lMY*5?r%CO%K9SK-fSXwI3@9`)hy zHi^)LdS)-N%?3IhR$DFFljWNB9sT7VA+n(GI4E`hl9C}%_8Eb z+Gn|ZM+aOxICycj4VcF7UTp5%3Q<|H+pzu&HtGwwUfOdmO+$ckDxF%+uIMBN?NH47 zZQOaSbe#$LN5=np$v>ul4#>Hb&7NjV);t5jsZszHPB3`F6|+$+ml^k_DFGAV)aetm z&80hv=~)0PMuJYIRXSnSKJhl`6((>zi~)NnS)a+j*4(I7h>}XJ79#aL3B3C;n1}ok zUTeow=JVpRn~y|zEVGEv39^AUoIfo&lMe?HqSrv|#^4Um6T#abJ56JkM=6Jd*o+dL zw%4qrHB(KLfRRh2%8Mb)P|`omPEI;-tvk zUXUXsKj%x7aD{HNP&j`0+lM7xQTJQA0!VyxgJ=warJR#K0LFT?2#P-uilv+{u>w@O zVvft*|6iXzSOL#*s0^j;#ATOntCMuacmIx?Wt9KH_<7>2Yg3aSdG-IkFLZ1t50RxD zs5W`@x0!-JnX;_Y6;p4%wQ_|D-JSrGK7XpkZHH11_Di0maSfd^WQS6oq;mfh>6yZD z&-f2*s=4Bg8w~j)Sou_oWbsFgvH*ePlA|i7*2gjYm~OAOL!!}TMC%V)mEB*e0NSs+ zxpU=U<;vz}gZ7DMt_rV-$kUh#8ddq@S77_~Nhr`D*%9%K*#qhcT|^W&({t(^bdp-M zmx}gx_=w4qz*aZ*G8V>*c8os&wpV=4$>^MjOu> zMdvtkc(x1p8pkZ8y8zQy&6sLWHmtM-Xm)t>Xe)p4z=lsh8b%D+-5OAOJdZPV(Lu<` zzC{G=8u>4_-fZ}`&7NBtNX{j&n!=xz7CBZk!5i8?)w<;he!?0{yK=7q*Jq#B-{)s! z4N?&VCri=R47f?b16I#dijaEnBn_?=MPtk99i^?`GKPFAMwdVXo7NowYZE=xC8J2Q zLO2(U&3`?!%saTOQ+mo6ly?DZ8bj(bhTJVn3SQCx=jUQP#lyK_F-3ITQVH+nW23mr z$;qg}TC7m!Wmd@2VTPrnuaro!RMPnN4fcKajJM7X_~vHIiD0=6sp9dZ*+>87F$y-NAj`y4oJi zglFY>J{!EU?cMgOgQ+Xs?*9R@l6ZLlgk3A~08~r1huRvU${Xe}P&r$!>_#d$Vrf_6 zvrlyAaTJ*A+w1djR`PaQ^8n5D%0X-&0}h#uCWbcYe-PB9z4|FTE0z&7nKE6pnmp$vt&a-qI<(XiEeB*Tn$@*AVojrls?#2nFId^2n6s2sCrUYIEVzU}OJsUdZzR*c zIMr9M zY@wRhT}qWXN9EH7j5oIcblt}ny#yl%JMLNdEd~X*FQ3bytLZ9|Kg#%di2|=g!9(^(69qW`Nc3)fsyvddn$Km1V24#M|K!+9YvL%$JY*$B z-^q;7in2zEE5BQ;H;SJDDbwBQ`6@QK@p%8dZbkR~&P7e#>|DkFG@Z+?5({8%j>Mfj zI^9He_X;njs-i{ziRC^dy`6qPolB)3pL2C{_OSVh^{*3s?l9+!q`bev96 zOdbJwiUHipzuVsdJqGDhz+H;yRTRP1WQwDSN#E zGG)nXel^>bnPi?4wV#TJG zdtAi7ftuq2$_VE(1Zn~Xm3{XZ7+o*fx~Xa$)AG7ABcM*24b`W*}lG!FpHvd%cClC}Yw zfnEoM_$x1rXw(?T51fw~&kPYf4|p!en*$;b0L60V0@Fl^Z#>y9aY#ZdcH*#~Kc+}D zlr#}wsE9W!QX$51z=S!iz#8KyDgGHxla4xW4#WbK@srPR?MEIaBulslm`0^893M3> zORZzxao1Y{GnKfZ4ng$)CBq9`earB^7_X>ND$PHB{<}HIIV~_gW<;|l**p%QCLjM5 zXN9rt%CX9=YJ{f9>yI3o8z{ENoU`N< z1_mjVVmFOtcOm&e^DseJVnP26xkfgNdz@#U6Qbwa%+6=TLqxPY11Gvg48g<#nnud& zPavN9_rQUr0l+K(V%y`zE%>S8Knx<9K9aB8&f|@&NOt@K3zkWyJj}T%gbc*A987WM zb@FM*xhmZZVeb-#2vHT(*Htg$+ zu+vT&VgWrV$Q1wYdXzfasfcIb@1HwD%LWd_0_tC)rDlc0FlPpj6dieF30Df}9S&!r z9@Y=X;a3-8j25`$E(xM(B$YihA~9v`gV8gI;4%bbU`90QhWY~m)aavs0wA1Ci)za{ z$;%))q@6Cq78mzEA>b#5Vgb!aubzffP~l^qGhvA`sY-1g30-=JP(W2DNRaRMMnS|R z)CHLWG9kNQ8W_RsgK@%y4NTvKm}*gv_{~tLWS~ol$`~pcf;k6cX2LLy@goCxnp3J2 zEF(D&^Cr*)-cKWYEu9;WOB!X=A30bG0r54fuYb{xSw~Kj@oCy)M175U zCTD7vh}&i_%!QUdXqfVVW@r z27Wt6HRBvyuiGPZ(S#6I?)~q~*%~1qXoLE(f~%8uJ5uBX_})}y^K((FQrv`w%pq-)vq8ddp&>}+X#AP?yvGIt_Ajk`%iAX z%BHtuUTAtU@oU6S(p%qGz?<{3W@!b_2dJZzRNX1!n^K_}^pdn+O#% zz)WfHsKZ^cn;hNpT^WtQg5ik(L}Rt#PFBFLUkjO`JZ=x5J6ppmuZ~`*Yo{|0B8w*1 zTz!Ggr@w#WsmIo2`&<56Xoj}C3f203N8@xAw0^p|t~_t1wA;MMFLE9$(=D2d=O_DX zp;Quz=Ywg$`DTLt26x*2?3LCGrRE~P)|kgzG^biLcc#A-`)n~8l*fCvv{QAhb*6NY zdbfumTZaQSRSyFzP1d(YVWm(JzP}v%Y>5~|=7R~u*<)Diy{p4h*iNvPN2;`E+#eJ5 z=3>5<`u4))&3VkHJx&;~7qQj~)VOnG-B7|K*UA(908a0*LmAyyp801feXy@wSETM* zLvs+dT=4DJqF!!#co z0kHR?S*^E<9p$0Ozo}c(w|L&1Ah|Y0vaZ^x6yUTw(k<^a91yaT1vj7R8{R0K zFrsy|yL02fIR=_`wnCYdpfj-%X==C}zdKjU>>K9e-TZswRDn||9_xJON81CPBZlTS zZgX7}i&;zBbx!vm$){7jKuRb-^9MfvA+m`53JS&?ef zXxwNCRAX|#7W0|maXeCki>}(8W<{1$CGHI&QkO&j%qk|+l1J(|VkSewZHt9o3wpc- z)AY?zkG9I+4O?bBGYO^kgq@1-meWHyV8Q~<;wIZ}7Vnf1)c!1j8XeM6T4*>N!OfT3 z&PZR)7Y6!uq~m1^CiyTb&@T;8Z1*~-4R)b(>c#f(yp)Z?E-apI1sL8;*N5({(GS%Z zN(3C8SjBfl8!c@&4y&YIt)-?*T;Q3xeiB>-8iKylIRsw$_Qa-%a_^ez@X7ma_vw!j zlGw%f2GG?w{Anq~S$Leg>eeqk8@r0$4zMsb*@7q!x$lLPnNhgP6HV$Nl263@j(EvXtm9>hfVC8E{4L<)5ZS8Nll+Q^@`lr`~M9$WNU6m1hN`YZ!v z6eupR>mDI(F0p;6OGvR->v9UZ{!tTTCaf-lb|Lw|IM z{2=U4{@wI)Cf&7%|Iq4`KTwa%lob9K5DJ4Bu5{#t#w|$H~cH{*l3bWa zJd2E6o86q4JNb*xdB3+)gOTg>B)gz$y!TSVg&tzd{-M2}aR zj%4XBcx6q|ohHyP(U&rV{mwYWf6u@tPbG};KJQs6{Y?Mn-8;(omi*zbyPLiS=EuK0 z>~HAQZvj%Cok?$vN{G5LXror#*Xjf`X^OrlUz!~+ZDI9=-h6~uq({>PhMKpdptBIRX*+>(xE*H zI2sYN*QN*0Ea3;?oRtNB=B_VzQ{oD?W8C zi!5ISq3D*hhIkz^=Q!t22I;g3XRNxnj@dbEI}ARfi?y4}kKcvSje^sIq|eh-wcTu& znW!ax-!&0u^zW)TZxvgPoHuwcUOvv*VaF`Kc&&{T>j0#s%1hFLIOg4-AJ(K&Huj$3 zqBlIcbUi4Wj`#+5!KL@ZnME%bjsO61r>9q=plfMQuiBMc%BLCPUf1h@=^;^{J#La{ z%p*B^FW*crvc|Lo9tF))wVu+>MELZ`VQxn0I44opB>taB5|8?q0v#(I8tWrXo+%aG z$eOGLd=2;voG`~^x&!Wy=^F6a{CS6x(XW}&^Fj@pd&}{h$CvZa@*`y15s(qQoROO2 zz*al*oT-mZ_MDFd8Z=?8@S3oTgl##@A3pW`=k9P0-m9)<7YH~60|BGm3yIs7H=R2+ zMXd}!UA`V5^=oeQ(envfaoMNFbqA)NxzIU)b-WW5&oX(ce))F3RLEKy(_QI47B!;R zuU-;z=8~Tg9p4pL#OgkOGp$||yNy?j@Vz%eW4nWu%NN1b)G|5s2V>h~VDv6{XUfIU zzr%VyN3YM=Y<&Md%(mYg*M2^J0snuS3H;l3z}@EJRvY+x7XcU`An5N4pOFE*k-n2Y zosq#+(yZ(N1Ip+oEU9_}GojWFViZCMMslL#dVd)3NP(RO6t(@h&z=TKE!n5L&WCK5 zyB+qRA1~7EhOCZnm(P1f$<>A39DqGo9R(t25SWS}YMv5EKulnBugmJKS0H&ej)akf z@fGvu=kM6nHnj?++eJ8XZt|6MMGJvC=m2ZGV%_{AR3jNR3WMw}tr_rQ!;zIQ!FiPjV7q zY1~bm^><5S83QDCpN3CUV-6gr|Fy)k(;i)#Ir(U9;3CWajx*gH9i0E2&8mIF%$SjTR{f7oRErbhu>89%c3Nz<|px)8Ye? zm>M7W2OK?WWHiaoL1MY#V!OFTH<}}5SSQr;XnUUg^j}m}O@QMcb63o<)nAUk5AbGW z5@E)D`~xs5z+hV=hyoo3fvf}DF%S^-3=G>EwSY|YLm`lLV~cl$?s5l|R1o0J3ObU4 zff)!_0_new3=ED8zLmj&J__OaMcGNIdC3_HzWFJsISPqI$r+htsS1XA23)xy5#8eC bjMUu3Vk?E*%9JD>h2+eV#Nx!9(iAQL08LXB literal 0 HcmV?d00001 diff --git a/docs/modelo.pdf b/docs/modelo.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e5ad5a9f4197b6ea3727c3e9b3bcddea16ee4eb6 GIT binary patch literal 51613 zcmagFWmKF2v#psBTpM?HcXw|fxVyVsa0uSGy9N#J?h@Q3I0SchpZ?Cd_s-0nSu?+S zt^U{5?^{)S@24o0B%~NwnK1dx}OzL9Pp9-e%%9? z>X^%xOzh27`YHI&P~E;IrKx(oad?7zt-Op&zHO4e<@&EGVp?$MIG7 z>p=DE!`-Q3z?A=Ny5?e0C&(4iG+*#f# z4_({uTAavhpmZ@lNkO^kqqVVQXPT%v0z+voiKz(3vCjUoO1&gqA*MGN#~+xV&!4sp zF)MS%Q=SzNHV`}P{N0$JNt_(z`?X=hF|2^(y-(uGc8~F0T_!XD@wyH}UfmcQ=5Knu2dtP(?^j>}2BL3LT`*=k8ye>6- z7Jlbje>%0AZKJ|7nVz+QtkPY6A_!qGrT-BzIbJPzmbdj77hXCk{CSY)|Jp(9|2AKf z`I#bJbVPP#5Bu425{W@ME8JiWzpB-a@`sC=Y%$i%VTbUDB`l4^#&GsCV?61uVoON) zJYcg&GGrJfroj#E)X4@G$&llpzOPNcq7~Gd+F>b`(8IGr$Zind+ys4uDOXXf9B3C1 z*Dzi8^K_w+u=SoYRsdZr6l0BzTFlDX?Px%^;l9!Dr!JtM#UX<(g~R|Jg7QwHb1u%# zz#eJiTMkEz`3jdPoj0p4?3ywlhg!E-ro!9Suj+KjIm-zlUZHN9jHcTlog>C;qt}ax zdp|e(u+ZL9RPnEZmSV4jNZ@_+`5&6oU&Xd23Y16cre}DYs{ho`ksdh^^fwAfM{R>1 z&$bLeYiDZ%)%*hIxm0Zm@+0v_2XdP*Z8Z$+(6A3o;UU9vVq%!^F3;zyCk*GX?d>7QwNpp|1On1O-(WCVZB7x8 zhU^Fg)iLg*WlRh&^t*!AS`+u_1{yeY$=a)NM@j?NIxl`5`<`xkD3-!$>_!*_9r2+h zM??{Lt>GnRV~TZHSmWvhkNT2c3V7OO&t6H7b>)zpG~mRLKPUd}buc8o7_{<#eN~iL zm{ey<0B(M$>voCjK-xUUho)e}GI}vR0Q=h`Q zNDk}G|7X7knm2b}Fd+^Di1A$Wf)19SBA>@l0+uUw*~P(2)UgtlDEM%wjU|9qd@P~V zb#ZSJk4eunQOjlvgL6`>v(x&-+1(KtTLE^z=t=Dl8q>OT2nMufyNd)t>%zS(Hwvlr zs;+*r+_Do2sU~;PtCuhpR&?DqzjeO%lW{~zv1YAc8)l_QN2CK;-N#6y<&B_VbTyY7 z?-L@zA6FwA-oeW!bSJR@|FB)t#~oj6j!aY?nSut=7z2@la8Tv0-`{-(e|+Y~K#UXE zz!8P->wOp!?Qn3x-^I1jqD(tcev@>?1s(axrf-tv(-?a-IFE6pO0L0vZQWfu+lqs6{oUNhPc`^jZAN$^0iF#P$RFL;{fdgA_mam|`ye{5Du7sf_{}hz42B zSF%qY)bgjajzG-{k@-#*SwGZ?=})p$7S}Q|QcfFWed0 zB$UF$$sdK>_v00C{CEym?0LRh+j_Tv=8|}d^v&>V4o4Ey=Poir z#2gq{+g)o(dp~Vyc|SdvcMSM6B;%M^{nalbSXYQPA)kC?tYUNqa(*~|j_>~4>1Yl- zs+aF_@i;nOJs3g^r8yhBy;y!+HE7YJ7rSCa3)G4L2&q;%pPkZmDHK37aOg9UB?`KghkYK==G3+LXLdd1{G9{BJ!)>P7YokESakPT;cT-Tw^Go6AgWmP8QmG9(h?}e1C+ZNc;rB>xP&9%6ebPI_uOyp?z!BuepUv zQF%>F6^am!gQ-bTGhUj9;ElgO|wP`D5efhGgr z8XeW-Gfta=@D31|zOr10gO+fxsj#vAzBbRO%=Alq=hv^`Iy6G>_B>Rlh{=m${zm?X zn@K6qp7_fn*>iq4_~F7;*$cZFJEm62{b<+4c}AagApq!4bH6{-1x0I<$6NedTpGYH z-DF?`QdcrS9H!!ozG}@56yq=UZ=o=k4jWR@$k2M%7SH{m1F29x`4j zJioe96_yZZlP?G5Mu7IhSd_5&>o1lwvi6J*p-zQt1w&?r5rdUJs`Xj=S7okN4uaz_ zBn?Q2-&yNH${v-0g z(SF#{0(GJA2mUaf=Q_x0iHOYwZe2@jp@qBoF3*ea673mXQD^eHu*tVf(q93+Fb%{g zx+)*mkkKhA?Ee+Pa$rR^u)0=w*tsO_qa-Y;gO8u%xUB=cvCjAHKF0S|O2eeZ_sL=W zwcs1O#RGV*Q-C02NIZVC66it^SyY;)#m8Q=y_GesttvPmW(4JkcGmG zJNCTa^9MQM-B2(w+4^v`Y!&mrj&j1Cuj}hhd9)WM6U}zL)to>W-LNx`P&d24rrf2u z<=kykRj-)D32hA6b6lR&v(8SbBB4X%$F}sy^A%#l_VmUh?Q(OG^C-=n!XAeS&{=DuJ}XfXSuWz3JaVg?Z(@M~0#lSxfTS3rRDoy80U7_Ja&xz&cVD)Sao2K7=MU`O3E(&riorY~P?i4-E28 zV?m8yFPQDZL19DM4vxPXGf|I)>MV)5XX(;;syJZ{kI6KM8*~pLQG`mt`f(chFZfU| zl?k#u>`WktRMCfqRnv_ z@5j!AQk^RuOU&bSeXK0cXqdI(-&r$o2Uvx|=h>`9o$IqH8+tL;hDQ~sM&Dd)$`a=i zC3#n;7$a2~;d{){f?mwAoLBuS&exyToP3nqN)C8#ddcELfH*ffX?c4{gJli;#Ch$y zSLeKPyT0w}1dRB#jg$oTpdmixuS6G#Ldat9h!3<70PACJ4nYZ~lAPM_d)eQL#1nlw z51^p|qk=+v(9oc36&dl;@21)fF@Ql~KIKJp*dZul>d@_9q8qTpiN5`<>I)b%Pzw#P zaE>MHL%&!|?M{r?FQ_SfEBy{yd6+`-J4gWCe1#n>RK#i&7)u7eJ`{`Xm^)t&Th$Hb zhK{~#s{Ywr9pE49a7G(6OW-c$wW46#ADNkxzzcOtEKHKi&7|KC4WEudfPIq6mE(5$ zC*Lh5mfs*<59RZ7?D#3mD|ZEi++}8u4JCU&b2WG}*0_w~L6n0est;`11B~^GCdDE^=d#N=X zP~B~sq02NFVrEw4;MoUXjFQ00qs`MYA-<8JGp0^>%sjpm1-5!bZPZlRAkC@Z{sbCyZ%+-TC}_@Ofq!7v7RYG>RF7 z8F5i-=2f#8f+jJBp-yxGpZLW7l_{wtO)~9WC1#^pXDdZ5Z_4Oj z6hG(0nG#J6M>0nXzbc*6*ytb^)KHBNUT)<{b4>Ci%& zM}&`=H2uVAuBEV6BV86Pql|WMx>&esgG)fjo4`zsnrIUh4cBJV+~@V2ohSHprq-mh zr{abKkdqWYGCaGwZO{;eFl_O=JVZfBayM)5qyf1mjQ5K_#SGe`K%?Az>+bxq-N2a8K zG{-=qB>ZVoX{nepa2=?Vm1p3vgzC?h$k?lR)24rqtB+}Nhwr26_Zg{oi?NX` zs6-?pumrtr7@dn!BbaKWbXmdI@ZnmN-6*dLCs9&`AfCW5ls~RXhvYJiEAtOt?C;mD zy*FMSl-fxa{d*bJoBtNR$ zONdlZdX0k%@jb}w^nUt)^ zz6`J_T&5mLX>SsajiOLH&@bjuMyY7@?=oi?S)Zw{XXGll>9k|nSOV6)3wmnvG`ln$ z2v?!WdVnlleFX&wkG8(3R>2S~mceQlb|OL3|LXJ`yA~ zLTXXUjQ{B@cKD=rF^p}s zj*y?M@QF-NmkIOJL#{#`T$qO_y72Y^5ems}2DTmLlLq!CY8DX%^XfHLs){pfem zs#rZ;^g=8`FFdfKdim~<1Q_Fmc~4|EL@#>*?Wyt}9jfP7_ApUNxPg%3qkm{`9oe{v z_Cup6QsmcckHD2>-cF~bhrVbnCczz@A6o|~Go1=)qyx)bB08m(Z^Y=M^^}o)LdI*Z zCV^)2NHCJE1V!R@x1Goy@Mg=JnZ39Hsv6PGpDM+N7YF$~hXm2HvO@_-yu)NetP}RFN3z7*mGZJ+yu#x^ZUcXe@yrl(ckVXFk-A#F^V+tY_*%Dz z(!53hu?&JN0>J{A=9ZGZs>kR5~qK(vE__lB<=q8dh2E$V`3vAy2p4RXbe z*=gv6HzAHYrUM-clyoCRMPM`6@a#0A8M~lHZL1zOhRl1G?wvA73G+s>7;l&s(fz*M z;~C-kC|PJeJpK(9J%3D?U`bhY|N%bUPz^&YrwHTY6Ei!G1;2?eOmp*L2YwX0gx#GNMlIR!pXKp1Q0mFG6)WEjc@4W zqW5j1t8+s0jf^Wy=pf(!&dx46yqOd0N6&YZn4`V0*pmXXIX^d^3r_~^yoVD0vpl98 zqOHEL-TR9D=D&J@mZX2o z$eG9pL(}fJ^Q@)xFdHCt=vYLbq5K}?)04Fxr7RU4CWpz!+}5hqG&GHzMbFkF!ZGu( z@r1e}$Yvs8dRe1wI4(stf||(Gmajeq*8$%O0>BZ^DkM)Fa{zX+-hn(!fl4L_q^7aEXx2`}_Hz&F+h~G{!sdj_0KyUxq{kUsg`%CoQ+7=_mG)p+`0zi zz9T0>0q(xftDKpjQEv=ELv@^zI|2%L#;;AfpyZgwQLVv8GL_ioMFu*kdFdf_*hBf| zgIu3;cSQz^e0zQA5~FWVp+L9EuPejFPKSR6{g02bJkPoo@(mN#86JO0fDlg__Np1u zUY>VY8|O4Wa7GEYY5n%+6%la;SGHpmH)0NRlr8fc5_v4ePdY(7C;;u_orXCnF&zkV>ibc`^Ey;-~y)FYDoz;0YihiO5(iA?*kHldA3?U!q^+Q^!*4m3n zuIO`@bqQwkc~&`R&K=N;;-`7uRmeX(i4z`O$#nkVdut#M;-`$tMzvGG(w3=dAnh}d zr~$Xlg-==Vo{JEU4pV9oBm%hQ2!q9jI5SR9gL3~)2W4G#cC8BN$0h8T!BF9(jPyGC z@A&HI-Zus?-PPnKmWE&o3-&zluT_B9fN3%b!|#XRO;-&5enPJ~OTS-|+jG`)w_@p} z)dJ#aeipv6lz*u&ETO>Ca`GOhJGBh`$B2CC3gw*?(8;R*Hz%W#m(KYco*M`9+Psjqxe{ZsuRIaemeQv3;kd4T)xL}p z--!!iNIi5UwG8B4do(-%Ex4E_dC>gmX#rQjqp$$mQc&zB^syrWs(0pjKNBr5>E68$}`5)5Y-kWD+Kf=BBzxmTID$;8E6Ik@QKo1N~*fKR|p%q-H|UClOz7MHa%e|4Qpk@6MOb7x7V)(Op@0{Be$Sm{Ual7F^7 zF*p@Q^W9_cIFM1?Jsb_Lu|k97p$~{4FIq(>KKd31p$Lc}D=jlfozA6%;CM`dR*^j& zUTAX@gRn}6H_LgHy$(}B0_tj4o+5|QLEmWM!a5Tnb=V?0XI3a)V#jN$SXHJ)PdN%n zm4A*riae`W$M8cw361C8mH`SPdlO+=(@5_E0hx)rZ^U+!CUoBMrWr69l^)wZ+6gv%~Ve<3hT)hQZTrmH8k{0!X@N&SN>3qFghq zU8dL;WQutaF64uGwMB+LZn&$?G;H+KNGm-Ll7Xk}n2NX-u9)NSB})kI(kFDD6L%UI zM$kbbY=lLpstc&)0T`HEojfbxf9WPhNvx8{Q9pOwPf3% zEgq`qK4j4`ByIn!`YT0KYnE4nQu{XpN+$ACd#y=w#zB{wL5D&_y#SX}qCd33J}2qm zlB{v(r%psS_!PldehA7o6!|1uXa~fZbeO2&(>lK`B-g|^~k4@{MIkc?W;qqbPg)S zg|NE7_}z6N0hp!5XpE#(U*D24XWDK#63wYN2>%ReV1bxb7<64xrj=wW7S_PU3O1yX zVWmn(zvFI!3S+U%aK(FI1^?kK=0?O6l1Fj8)R=(pY9Fw=YzV_41`}kp>Ps|t4C17A zfJxIc6N?U0)+b3d|b0&(gwI0E1s zQHApYNh>D&ei307#GC+daaM7mfbd8mequ$i??6cYn>8DD8-5-$eAi64RVD`{B5$OlJxhOIgFQ>ImC({WxD~5-xFU}AlbgN z5lDbk3;HA(D~QbY@Z|{_#Sm|`u;IS)SW7C2p~6k*K7UCeG$_0(%qrzph=fd5p+aJZ zH5(E{Oslq9XxL34gPo5L!uqZvr``5J@wHJl0?EXU(d=|&$T>M%35ZQvt@aM=Q4X4T zlh6xTl(XcHC<*u{R{JEO%tIMJlDRF-O}VMVYh^}Z3>~`O9Y*;sRP&k#YcQQ1^Xw|D zoJrwdz%lCKONQ|rSSQv|32fpLIr;&$!H8vM{j$2wz)XT&NX8U+jL`O$F8t`W+?nK? zh0HR2t_^NNK3{hy6wGo>1HetFt0Km!JiPsPFvS7hF$TJ*9F=l|g(I51Y}d}bRbFPh zal|8zDktU~C9t@WXAB-*n}j}|2$6m0n}*a{d0~-Ya45;;a)aq2w^Ew#%cA{F;z3H# z!0-nJM7syRQtX0)R5~>dl5oZ6z#ehJy-`^c5nIML!B*W6r)jlXb+U z)LR{xKJ;zkE9chV@Uh6Qx34jp!3Zt&1nsB+KW@41sknX(_&B0{-EadHQqe@tQ>1y5 zCeGNUd1sThFYF?o=CrW3(nzcjwKWrxEn&_{!WPU)EUOqRd~HZ6khSpctyek%9jluh z_`{LQa}^ohN=^r(Du_t-tcY%TzuDNQb09t11lRMMwEC? zDKf)GiLVSVq&StLgCr+|TFrCTq7bGM3P4GOD>)`SJd)aQSC4tvIvNbAleDR_T{S^c zF}(&x`f4e}xyfiKj?(lT`%5#MIl)+g$`_AX(no}Zcc(1-R%P54 zVvPmJ#$&1$69!oEBzx4Oe@Z8c_Wc(fqqh{3ZGD%l^Phx0T;Qs|G;fCl@|4q z4&)KcdYVa9u`!LF@IPZ)khWmP@$k#94TU&~2*wS^Q%9i4nFN3T;iBi!Ah0s})4g}0 zVVVMw+e7$RQ`$DEiLMh{k;!Pa`gdSxz;`oB?cz`2#p=Mvv)`xOonee+HDFv-)rn#| z5u_#*y-f+Sd!V11ssdE!5hHp3F=QHqo)od=f*sE56`lDn`s_!|@&dvMY|S3uPC8QA zF4_*ypsBu27%QjrIF4sW^iw~kN^R0yejO6*FU;T)I2kg&|G}M|v|5rOqQFNuto)BX zU2T1c`t;Q$f~a>6i+ZtFUK<=0hv@!vi}b@1y}s`+vSv6B4!PBH7!%~3mR@s0yZU|} zau4|(5<_cx*&w=}2%)2EfAFMJdl7GvB&uVNk3!F`+G?y$r)a|G!IAm5!aUKBjcw~k zj!}29NCfYadg(9R;Za18z+uV!)V&iuEYiuM4F2(5Ry^@CKkIef>vcB!+z4z{QS?eY2U9_` zxZ2-3!b1wk35?Z19?_yU*6)u;6&fJ*sWz%);7r(PEqan!f+QfD2MQZo1NKcITb@pJ z=vT8G@|VG$h0saQurJpp=!od$^W2rVU~^v%OyCHB2^`iOb})gn`FH!rdfc|}@2ZkO zu98@-)`fI$U*e(k7}wfaGDg5ltB37a-+xnO>sH_2+YjA(FZ>?eGL1NMk0?Ra^WAgH zTo<^Pjl@kYiCYt9LU)Bk0$fv8PvrZX3V?g<=pipAvFMF%v31LmPs$L)kTb~`rdQC+ zyu6@J%K7m^V)Ol*Km3zkjU4**HPVYRb9wyg0F0tyW0C)APg6~J+Jlq#MH&^OWkKk& zu8%g|eJ1?!a3qn#goJuCq5WLWE$Xf$BA+)oq8A)>D*hN;O0Corbf+0AIWqTvCQ^m) zFwozaB%WmDDM_h@%AoXarmOXew*gie($-Uw%LpsV^Us$!cLE-X7|M562)Zdm+SVb8 zxEq;k&!6Eb_?#2Y2XMx=Ni8Zt;u|RSXdDeySYa9ibk*Z^)KoVk z=R;}$l=5paiLtKw25DcteudwXIog0kkpk8YqG6JT&0wOH6aeh9CB#fc9gEN=uiBiM zCJbdWrT8<=)FqoC79EP5b4z_LGE0aw9}k?iLjXI~6_Sg~FQEJ}^W!m8=YJ|o^cw;p z1im+a%q5%KV4YhmPls*pqU--3j2QXIFyNG!tG;XM@s6c{67e-MWrvrgDO?ep$|^`2-aSOb%#kOEyT$}7!hNnweAqK@ zW`LzQ7lZPRIFFBCPfSa*VoCf04Yu3FKO9mA7ZNWDX*E`aNG*Q8 z5A4|9IN502^n>E0@oz0;2pj)jkTBA8X2WoF!S9{C_Z~-O0d6>V6arv=1)R-DnV=F( zvyc~fZ=uD~fRV6oUQ~tVFg5HFg7Gu2cnUF^Vz7TusCKF!@zGtF=R_5zH=-yF;vJB? z^`+Yyz8)J$w1I&;H5l;;+7H5l2=YOvBD%@3y_Z?LRr5 z!qY5QrzScxG|8b(mzfQ-)O|m6-2&82&aAjajx|^KMucrjK`JI{x5XSs7JQRDZD`YA z9hvO1s}(U9@^do$F^~Et?l6=B9_<*HubmjRUA#-PsILy|%8%_ZV=n0(jI`}Rj>%T4 zhk75M*R|t&YrWI9FuW6dL~kv9d#v?gP%c&Cxm3BSM@P%!@WtK!l|ZRhi%IYc%Q&Cb zeciT`mkNtiWJ|YTx1Y~SPl3hb|A~B&sx9N*)s<_#9U_QJzxGwZ}8~29*?u%ceBON zqfzsG+tUae>EaX7S72>PBiBJdzuiEs&bR1%F{;l^CREp&WH3B!o`{yZ)5F$^qvZf{TVtWx+PCDe%tzCZYMFqvvAN zqh|MfzGgePb9ucQ40xd(OlYOS>=1N3yk9N7i!}$zV!0n{5?Ka6VQnEO@miW+c1-6D zUp*7umRNjplJ1eGsm)44D_~u=ZgP=H9^JhfBW>XS7vjZ-!uvw^zW}eT0x5e#61ljI z$$qbDHx@B^_gK5%ZVYq0VZSS*YvD4kbjEL5BjVA1HN;kp5~L8>pp(d{`|!!(E-q8k zrZR)<*)a<2Io;-XkjI-*gD3#xIX}@rx_v`3%Kj*kHC&rB{|iUNQ2iVzvYt2{J3!{z zk9Fn(^N9A7q3c?~8emVY#oCQo%GBP*fq|NrnG>~=6J9?UPn@^9O8T%~xdkNke~5O19WvPy}0@~KTf4dn<2fPnd#GtP|(gbhtxA^@Hs|4 zkL~hpK)taVaakcU;}ZKQpw#L=xt1PLVw{d zNQA(3F4@Mz9UiI9E(>DidmnOk?i6~KnciSzJI)>mOQfs7vE$mSjlwwt^L9i!Rzx&r z#AL>?S+KKOxVvqlP2OinDj5U$l$3cDt!8CBSPTA4>%~O=v=jLap~hO(F<WR&RE;8~e*GefNYkfpqucYxj5|NyGKciV;ki=FJZt zQK~r$p0aQywHysI8*SV1=+e$$J{d}ZL8awV~Pqy#Xp&V1ERm3w>9Kz&eH_LagB?>%G$(DoOmPPhy%e|==GTt-%$*6 zTcdg?#x3V@jNZv8DN*kv(qqOBlT@Y^rb4h=t@((8DsUJ}>(q-e<{VduD`kmhG+Q!o zCO5EQYHHk8;>2|dDI&6LIrsg#cH>S{U@VkzKSwHy&E^t#h%0A2TV?aHybc)Y12 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 literal 0 HcmV?d00001 diff --git a/docs/modelo.svg b/docs/modelo.svg new file mode 100644 index 0000000..3012aeb --- /dev/null +++ b/docs/modelo.svg @@ -0,0 +1,5548 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/citasalud/apps/api/serializers.py b/src/citasalud/apps/api/serializers.py index 5c594bb..b47765f 100644 --- a/src/citasalud/apps/api/serializers.py +++ b/src/citasalud/apps/api/serializers.py @@ -6,22 +6,22 @@ class MedicoSerializer(serializers.ModelSerializer): """ Serializador para Médico """ - + class Meta: model = Medico class UsuarioSerializer(serializers.ModelSerializer): - + class Meta: model = Usuario # fields = ('id', 'username', 'profile','is_superuser') - def create(self, validated_data): - profile_data = validated_data.pop('profile') - user = User.objects.create(**validated_data) - Profile.objects.create(user=user, **profile_data) - return user + # def create(self, validated_data): + # profile_data = validated_data.pop('profile') + # user = Usuario.objects.create(**validated_data) + # Profile.objects.create(user=user, **profile_data) + # return user class EspecialidadSerializer(serializers.ModelSerializer): @@ -29,4 +29,4 @@ class EspecialidadSerializer(serializers.ModelSerializer): class Meta: model = Especialidad - fields = ('id', 'nombre') + # fields = ('id', 'nombre') diff --git a/src/citasalud/apps/api/views.py b/src/citasalud/apps/api/views.py index c0009b0..a97d0fd 100644 --- a/src/citasalud/apps/api/views.py +++ b/src/citasalud/apps/api/views.py @@ -4,10 +4,11 @@ from rest_framework import authentication, permissions from .serializers import UsuarioSerializer + class CurrentUserView(APIView): - authentication_classes = (authentication.TokenAuthentication,) + authentication_classes = (authentication.TokenAuthentication, authentication.SessionAuthentication) permission_classes = (permissions.IsAuthenticated,) - + def get(self, request): serializer = UsuarioSerializer(request.user) return Response(serializer.data) diff --git a/src/citasalud/apps/main/_migrations/0001_initial.py b/src/citasalud/apps/main/_migrations/0001_initial.py deleted file mode 100644 index dff84a0..0000000 --- a/src/citasalud/apps/main/_migrations/0001_initial.py +++ /dev/null @@ -1,86 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import models, migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='CitaMedica', - fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('horario', models.DateTimeField(verbose_name=b'Hora de cita')), - ], - options={ - 'verbose_name': 'Cita m\xe9dica', - 'verbose_name_plural': 'Citas m\xe9dicas', - }, - ), - migrations.CreateModel( - name='Especialidad', - fields=[ - ('id', models.CharField(max_length=5, serialize=False, verbose_name=b'ID Especialidad', primary_key=True)), - ('nombre', models.CharField(max_length=32, verbose_name=b'Nombre')), - ], - options={ - 'ordering': ('id',), - 'verbose_name': 'Especialidad', - 'verbose_name_plural': 'Especialidades', - }, - ), - migrations.CreateModel( - name='Paciente', - fields=[ - ('nombre', models.CharField(max_length=32, verbose_name=b'Nombre')), - ('apellidos', models.CharField(max_length=32, verbose_name=b'Apellidos')), - ('telefono', models.CharField(max_length=9, verbose_name=b'Tel\xc3\xa9fono')), - ('nss', models.DecimalField(serialize=False, verbose_name=b'NSS', primary_key=True, decimal_places=0, max_digits=9)), - ], - options={ - 'verbose_name': 'Paciente', - 'verbose_name_plural': 'Pacientes', - }, - ), - migrations.CreateModel( - name='Personal', - fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('nombre', models.CharField(max_length=32, verbose_name=b'Nombre')), - ('apellidos', models.CharField(max_length=32, verbose_name=b'Apellidos')), - ('telefono', models.CharField(max_length=9, verbose_name=b'Tel\xc3\xa9fono')), - ('nregistropersonal', models.CharField(max_length=5, verbose_name=b'N\xc2\xb0 Registro personal')), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='Medico', - fields=[ - ('personal_ptr', models.OneToOneField(parent_link=True, auto_created=True, to='main.Personal')), - ('ncolegiado', models.CharField(max_length=5, serialize=False, verbose_name=b'N\xc2\xb0 Colegiado', primary_key=True)), - ('especialidades', models.ManyToManyField(related_name='especialidades', to='main.Especialidad', blank=True)), - ], - options={ - 'ordering': ('ncolegiado',), - 'verbose_name': 'M\xe9dico', - 'verbose_name_plural': 'M\xe9dicos', - }, - bases=('main.personal',), - ), - migrations.AddField( - model_name='citamedica', - name='paciente', - field=models.ForeignKey(to='main.Paciente'), - ), - migrations.AddField( - model_name='citamedica', - name='medico', - field=models.ForeignKey(to='main.Medico'), - ), - ] diff --git a/src/citasalud/apps/main/admin.py b/src/citasalud/apps/main/admin.py index 08ded34..fd4ccfd 100644 --- a/src/citasalud/apps/main/admin.py +++ b/src/citasalud/apps/main/admin.py @@ -2,10 +2,9 @@ from django.contrib import admin from .models import (Usuario, Especialidad, CitaMedica, Medico, - Paciente, Empleado, HistoriaClinica, Examen, - TipoExamen,) -from django.contrib.auth.admin import UserAdmin - + Paciente, Empleado, HistoriaClinica, Examen, + TipoExamen,) +# from django.contrib.auth.admin import UserAdmin admin.site.register(Usuario) admin.site.register(Especialidad) @@ -16,20 +15,3 @@ admin.site.register(HistoriaClinica) admin.site.register(Examen) admin.site.register(TipoExamen) - -# admin.site.register(Usuario, UsuarioAdmin) - -# class PersonalAdmin(admin.ModelAdmin): -# pass - - -# class PacienteAdmin(admin.ModelAdmin): -# pass - - -# class MedicoAdmin(admin.ModelAdmin): -# pass - - -# class CitaMedicaAdmin(admin.ModelAdmin): -# pass diff --git a/src/citasalud/apps/main/fixtures/admins.json b/src/citasalud/apps/main/fixtures/admins.json new file mode 100644 index 0000000..804eb77 --- /dev/null +++ b/src/citasalud/apps/main/fixtures/admins.json @@ -0,0 +1 @@ +[{"fields": {"username": "admin", "fecha_nacimiento": "1994-05-04", "first_name": "Richard", "last_name": "Cotrina", "apellido_materno": "", "is_active": true, "is_superuser": true, "ciudad": "", "is_staff": true, "last_login": null, "avatar": "/media/avatar/sin_imagen.png", "groups": [], "user_permissions": [], "password": "pbkdf2_sha256$20000$Gzp30JhioY4L$NPUURAvJ+7YZgxJavZGlC1voVhHcBedMeCEDsDvh6MU=", "telefono": "", "email": ""}, "model": "main.usuario", "pk": "76086783"}] diff --git a/src/citasalud/apps/main/fixtures/initial_data.json b/src/citasalud/apps/main/fixtures/especialidades.json similarity index 100% rename from src/citasalud/apps/main/fixtures/initial_data.json rename to src/citasalud/apps/main/fixtures/especialidades.json diff --git a/src/citasalud/apps/main/migrations/0001_initial.py b/src/citasalud/apps/main/migrations/0001_initial.py new file mode 100644 index 0000000..d5b8730 --- /dev/null +++ b/src/citasalud/apps/main/migrations/0001_initial.py @@ -0,0 +1,177 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +from django.conf import settings +import citasalud.apps.main.customfields + + +class Migration(migrations.Migration): + + dependencies = [ + ('auth', '0006_require_contenttypes_0002'), + ] + + operations = [ + migrations.CreateModel( + name='Usuario', + fields=[ + ('password', models.CharField(max_length=128, verbose_name='password')), + ('last_login', models.DateTimeField(null=True, verbose_name='last login', blank=True)), + ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), + ('dni', citasalud.apps.main.customfields.DNIField(max_length=8, unique=True, serialize=False, verbose_name=b'DNI', primary_key=True)), + ('username', models.CharField(unique=True, max_length=16, verbose_name=b'Nombre de usuario')), + ('first_name', models.CharField(max_length=32, verbose_name=b'Nombre')), + ('last_name', models.CharField(max_length=16, verbose_name=b'Ap. Paterno')), + ('apellido_materno', models.CharField(max_length=16, verbose_name=b'Ap. Materno')), + ('fecha_nacimiento', models.DateField(verbose_name=b'Fecha de Nacimiento')), + ('telefono', models.CharField(max_length=9, verbose_name=b'Tel\xc3\xa9fono', blank=True)), + ('ciudad', models.CharField(max_length=128, verbose_name=b'Ciudad de origen')), + ('email', models.EmailField(unique=True, max_length=254, verbose_name=b'E-mail', blank=True)), + ('avatar', models.ImageField(default=b'/media/avatar/sin_imagen.png', upload_to=b'avatar', verbose_name=b'Imagen', blank=True)), + ('is_active', models.BooleanField(default=False)), + ('is_staff', models.BooleanField(default=False)), + ('groups', models.ManyToManyField(related_query_name='user', related_name='user_set', to='auth.Group', blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', verbose_name='groups')), + ('user_permissions', models.ManyToManyField(related_query_name='user', related_name='user_set', to='auth.Permission', blank=True, help_text='Specific permissions for this user.', verbose_name='user permissions')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='CitaMedica', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('horario', models.DateTimeField(verbose_name=b'Hora de cita')), + ('asistio', models.BooleanField()), + ], + options={ + 'verbose_name': 'Cita m\xe9dica', + 'verbose_name_plural': 'Citas m\xe9dicas', + }, + ), + migrations.CreateModel( + name='Empleado', + fields=[ + ('nregistropersonal', models.DecimalField(serialize=False, verbose_name=b'N\xc2\xb0 Registro de Personal', primary_key=True, decimal_places=0, max_digits=9)), + ('departamento', models.CharField(max_length=32, verbose_name=b'Departamento')), + ('cargo', models.CharField(max_length=32, verbose_name=b'Cargo')), + ], + ), + migrations.CreateModel( + name='Especialidad', + fields=[ + ('id', models.CharField(max_length=5, serialize=False, verbose_name=b'ID Especialidad', primary_key=True)), + ('nombre', models.CharField(max_length=128, verbose_name=b'Nombre')), + ], + options={ + 'ordering': ('id',), + 'verbose_name': 'Especialidad', + 'verbose_name_plural': 'Especialidades', + }, + ), + migrations.CreateModel( + name='Examen', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('fecha_solitud', models.DateField(verbose_name=b'Fecha de Solicitud')), + ('fecha_aplicacion', models.DateField(verbose_name=b'Fecha de aplicaci\xc3\xb3n')), + ('observacion', models.CharField(max_length=256, verbose_name=b'Observacion')), + ], + options={ + 'verbose_name': 'Examen', + 'verbose_name_plural': 'Ex\xe1menes', + }, + ), + migrations.CreateModel( + name='HistoriaClinica', + fields=[ + ('numero', models.CharField(max_length=5, serialize=False, verbose_name=b'N\xc2\xb0 H.C.', primary_key=True)), + ], + options={ + 'verbose_name': 'Historia Cl\xednica', + 'verbose_name_plural': 'Historias Cl\xednicas', + }, + ), + migrations.CreateModel( + name='Paciente', + fields=[ + ('nss', models.DecimalField(serialize=False, verbose_name=b'NSS', primary_key=True, decimal_places=0, max_digits=9)), + ('usuario', models.OneToOneField(related_name='paciente', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'verbose_name': 'Paciente', + 'verbose_name_plural': 'Pacientes', + }, + ), + migrations.CreateModel( + name='Resultado', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('documento', models.PositiveIntegerField(verbose_name=b'N\xc2\xb0 de Documento Asociado')), + ('descripcion', models.CharField(max_length=256, verbose_name=b'Descripci\xc3\xb3n')), + ('examen', models.ForeignKey(to='main.Examen')), + ], + ), + migrations.CreateModel( + name='TipoExamen', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('nombre', models.CharField(max_length=64, verbose_name=b'Examen')), + ('descripcion', models.CharField(max_length=128, verbose_name=b'Descripci\xc3\xb3n')), + ], + options={ + 'verbose_name': 'Tipo de examen', + 'verbose_name_plural': 'Tipos de examen', + }, + ), + migrations.CreateModel( + name='Medico', + fields=[ + ('empleado_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='main.Empleado')), + ('ncolegiado', models.PositiveIntegerField(verbose_name=b'N\xc2\xb0 Colegiado')), + ('especialidades', models.ManyToManyField(related_name='especialidades', to='main.Especialidad', blank=True)), + ], + options={ + 'ordering': ('ncolegiado',), + 'verbose_name': 'M\xe9dico', + 'verbose_name_plural': 'M\xe9dicos', + }, + bases=('main.empleado',), + ), + migrations.AddField( + model_name='historiaclinica', + name='paciente', + field=models.OneToOneField(to='main.Paciente'), + ), + migrations.AddField( + model_name='examen', + name='historia', + field=models.ForeignKey(to='main.Paciente'), + ), + migrations.AddField( + model_name='examen', + name='tipo_examen', + field=models.ForeignKey(to='main.TipoExamen'), + ), + migrations.AddField( + model_name='empleado', + name='superior', + field=models.ForeignKey(related_name='jefe', to='main.Empleado'), + ), + migrations.AddField( + model_name='empleado', + name='usuario', + field=models.OneToOneField(related_name='personal', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='citamedica', + name='historia', + field=models.ForeignKey(to='main.HistoriaClinica'), + ), + migrations.AddField( + model_name='citamedica', + name='medico', + field=models.ForeignKey(to='main.Medico'), + ), + ] diff --git a/src/citasalud/apps/main/_migrations/0002_especialidades.py b/src/citasalud/apps/main/migrations/0002_especialidades.py similarity index 94% rename from src/citasalud/apps/main/_migrations/0002_especialidades.py rename to src/citasalud/apps/main/migrations/0002_especialidades.py index 668c747..6c61295 100644 --- a/src/citasalud/apps/main/_migrations/0002_especialidades.py +++ b/src/citasalud/apps/main/migrations/0002_especialidades.py @@ -4,7 +4,7 @@ from django.core.management import call_command fixture_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '../fixtures')) -fixture_filename = 'initial_data.json' +fixture_filename = 'especialidades.json' def load_fixture(apps, schema_editor): diff --git a/src/citasalud/apps/main/migrations/0003_admins.py b/src/citasalud/apps/main/migrations/0003_admins.py new file mode 100644 index 0000000..180021b --- /dev/null +++ b/src/citasalud/apps/main/migrations/0003_admins.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +from django.db import migrations +import os +from django.core.management import call_command + +fixture_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '../fixtures')) +fixture_filename = 'admins.json' + + +def load_fixture(apps, schema_editor): + fixture_file = os.path.join(fixture_dir, fixture_filename) + call_command('loaddata', fixture_file) + + +def unload_fixture(apps, schema_editor): + "Brutally deleting all entries for this model..." + + MyModel = apps.get_model("citasalud", "Usuario") + MyModel.objects.all().delete() + + +class Migration(migrations.Migration): + + dependencies = [ + ('main', '0002_especialidades'), + ] + + operations = [ + migrations.RunPython(load_fixture, reverse_code=unload_fixture), + ] diff --git a/src/citasalud/apps/main/_migrations/__init__.py b/src/citasalud/apps/main/migrations/__init__.py similarity index 100% rename from src/citasalud/apps/main/_migrations/__init__.py rename to src/citasalud/apps/main/migrations/__init__.py diff --git a/src/citasalud/apps/main/models.py b/src/citasalud/apps/main/models.py index f9ca41f..ecf96e5 100644 --- a/src/citasalud/apps/main/models.py +++ b/src/citasalud/apps/main/models.py @@ -6,10 +6,8 @@ class UsuarioManager(BaseUserManager): - def create_user(self, username, dni, fecha_nacimiento, first_name,last_name,password =None): + def create_user(self, username, dni, fecha_nacimiento, first_name, last_name, password=None): """ - Creates and saves a User with the given email, date of - birth and password. """ if not dni: raise ValueError('Ingrese un n° DNI válido.') @@ -26,12 +24,11 @@ def create_user(self, username, dni, fecha_nacimiento, first_name,last_name,pass user.save(using=self._db) return user - def create_superuser(self,username,dni,fecha_nacimiento, first_name,last_name,password): + def create_superuser(self, username, dni, fecha_nacimiento, first_name, last_name, password): """ - Creates and saves a superuser with the given email, date of - birth and password. """ - user = self.create_user(username, + user = self.create_user( + username, dni=dni, password=password, first_name=first_name, @@ -43,10 +40,10 @@ def create_superuser(self,username,dni,fecha_nacimiento, first_name,last_name,pa user.is_staff = True user.save(using=self._db) return user - + class Usuario(AbstractBaseUser, PermissionsMixin): - dni = DNIField("DNI", unique=True , primary_key= True) + dni = DNIField("DNI", unique=True, primary_key=True) username = models.CharField("Nombre de usuario", max_length=16, unique=True) first_name = models.CharField("Nombre", max_length=32) last_name = models.CharField("Ap. Paterno", max_length=16) @@ -59,13 +56,13 @@ class Usuario(AbstractBaseUser, PermissionsMixin): email = models.EmailField("E-mail", unique=True, blank=True) avatar = models.ImageField("Imagen", upload_to="avatar", null=False, default="/media/avatar/sin_imagen.png", blank=True) - - is_active = models.BooleanField(default = False) - is_staff = models.BooleanField(default = False) + + is_active = models.BooleanField(default=False) + is_staff = models.BooleanField(default=False) objects = UsuarioManager() - - USERNAME_FIELD= 'username' - REQUIRED_FIELDS = ['dni', 'fecha_nacimiento','first_name' ,'last_name' ] + + USERNAME_FIELD = 'username' + REQUIRED_FIELDS = ['dni', 'fecha_nacimiento', 'first_name', 'last_name'] def get_name(self): return self.first_name.split(" ")[0] @@ -91,7 +88,7 @@ class Empleado(models.Model): class Medico(Empleado): ncolegiado = models.PositiveIntegerField("N° Colegiado") especialidades = models.ManyToManyField("Especialidad", blank=True, related_name='especialidades') - + def _tipo(self): return TIPO_MEDICO.ESPECIALISTA if self.especialidades else TIPO_MEDICO.GENERAL tipo = property(_tipo) @@ -107,7 +104,7 @@ class Meta: class Especialidad(models.Model): id = models.CharField("ID Especialidad", max_length=5, primary_key=True) - nombre = models.CharField("Nombre", max_length=64) + nombre = models.CharField("Nombre", max_length=128) def __unicode__(self): return "%s - %s" % (self.id, self.nombre) @@ -133,6 +130,10 @@ class TipoExamen(models.Model): nombre = models.CharField("Examen", max_length=64) descripcion = models.CharField("Descripción", max_length=128) + class Meta: + verbose_name = "Tipo de examen" + verbose_name_plural = "Tipos de examen" + class Resultado(models.Model): examen = models.ForeignKey("Examen") @@ -147,19 +148,27 @@ class Examen(models.Model): observacion = models.CharField("Observacion", max_length=256) historia = models.ForeignKey("Paciente") + class Meta: + verbose_name = "Examen" + verbose_name_plural = "Exámenes" + class Paciente(models.Model): usuario = models.OneToOneField(Usuario, unique=True, related_name="paciente") nss = PrimaryNumberField("NSS", digits=9) - + def __unicode__(self): return "%s (%s)" % (self.usuario.get_short_name(), self.nss) class Meta: verbose_name = "Paciente" verbose_name_plural = "Pacientes" - + class HistoriaClinica(models.Model): numero = models.CharField("N° H.C.", max_length=5, primary_key=True) - paciente = models.OneToOneField("Paciente", unique=True) \ No newline at end of file + paciente = models.OneToOneField("Paciente", unique=True) + + class Meta: + verbose_name = "Historia Clínica" + verbose_name_plural = "Historias Clínicas" diff --git a/src/citasalud/settings/__init__.py b/src/citasalud/settings/__init__.py index fdb0dea..4ea6552 100644 --- a/src/citasalud/settings/__init__.py +++ b/src/citasalud/settings/__init__.py @@ -85,20 +85,17 @@ 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), + }, + 'mysql': { + 'ENGINE': 'django.db.backends.mysql', + 'NAME': 'citasalud', + 'USER': 'citasalud', + 'PASSWORD': 'citasalud', + 'HOST': 'dev', + 'PORT': '', } } -#DATABASES = { -# 'default': { -# 'ENGINE': 'django.db.backends.mysql', -# 'NAME': 'citasalud', -# 'USER': 'root', -# 'PASSWORD': 'LU7412369', -# 'HOST': 'dev', -# 'PORT': '', -# } -#} - # Internationalization # https://docs.djangoproject.com/en/1.7/topics/i18n/ diff --git a/src/citasalud/settings/djrf.py b/src/citasalud/settings/djrf.py index 686549a..4a887dc 100644 --- a/src/citasalud/settings/djrf.py +++ b/src/citasalud/settings/djrf.py @@ -2,9 +2,10 @@ # Use Django's standard `django.contrib.auth` permissions, # or allow read-only access for unauthenticated users. 'DEFAULT_PERMISSION_CLASSES': [ - 'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly' + 'rest_framework.permissions.IsAuthenticated' ], 'DEFAULT_AUTHENTICATION_CLASSES': ( + 'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.TokenAuthentication', ) }