+
    0°¿jÁ-  ã                   óØ  € R t ^ RIt^ RIt^ RIt^ RIHtHt ^ RIHt ]! ]	4      P                  4       P                  P                  P                  t]! ]	4      P                  4       P                  t]R,          R,          t]R,          R,          t]R,          R,          t]R,          t]! R	^	^4      tR
 tR t]! 4       tR tR tR tR tR tR tR t]R8X  d   ]! ]! 4       4      hR# )u§	  История PR-завода по дням: с чем сравнивать сегодняшние цифры.

Зачем. В эталоне PR Factory на обзоре стоит сравнение периодов: «99
опубликовано, +7 к 2026-09-16 (было 92)». У нас кнопки «Неделя» и «Месяц»
висели выключенными с подписью «сравнивать не с чем» - истории не было.
Она накопилась: реестр текстов помнит даты публикаций, журнал замеров -
просмотры по дням, база площадок - когда заведён аккаунт. Значит состояние
завода на любой прошедший день можно восстановить, а не хранить снимками.

Что считаем на каждую дату:
  опубликовано  - материалов вышло к этому дню включительно
  площадок      - на скольких площадках они вышли
  просмотры     - сумма последних замеров, сделанных не позже этой даты
  аккаунтов     - заведено аккаунтов к этому дню

Чего НЕ считаем, и это важно:
  «ждут ответа редакции» и «внешних ссылок» - у них в данных только текущее
  состояние. Задним числом восстановить нельзя: материал, который сегодня
  ждёт ответа, неделю назад мог ещё не быть отправлен, а отметки об этом
  не осталось. Пустое поле панель покажет честно, выдуманное - соврёт.

Правило журнала замеров: просмотры у площадок считаются нарастающим итогом,
поэтому «на дату» - это последний замер не позже неё, а не сумма за период.
Если публикация к этой дате ещё не мерилась, в сумму она не идёт вовсе:
ноль читался бы как «никто не смотрел».

Запуск: python3 панель/данные/обновить-историю-pr.py
N)ÚdateÚ	timedelta)ÚPathõ
   заводu    реестр-текстов.jsonu   площадки.jsonu#   просмотры-журнал.csvzreport.jsoniê  c           	     óÂ  € \         P                  ! R\        T ;'       g    R4      4      pV'       dV   \        \	        VP                  ^4      4      \	        VP                  ^4      4      \	        VP                  ^4      4      4      # \         P                  ! R\        T ;'       g    R4      4      pV'       d&   \        \        \        VP                  4       4      !  # R# )u_   Первая дата в строке, в любом из двух наших форматов.z(\d{2})\.(\d{2})\.(\d{4})Ú z(\d{4})-(\d{2})-(\d{2})N)ÚreÚsearchÚstrr   ÚintÚgroupÚmapÚgroups)ô   строкаô   мs   & ô%   обновить-историю-pr.pyô   датаr   1   s–   € ä	�ŠÐ/´°\×5GÐ5GÀRÓ1HÓ	I€Bß	Ü”C˜Ÿ™ ›Ó$¤c¨"¯(©(°1«+Ó&6¼¸B¿H¹HÀQ»KÓ8HÓIÐIÜ	�ŠÐ-¬s°<×3EÐ3EÀ2Ó/FÓ	G€Bß+-Œ4””S˜"Ÿ)™)›+Ó&Ñ'Ð7°4Ð7ó    c                 óÚ   € ^ RI p \        R,          R,          pV P                  P                  RV4      pV P                  P	                  V4      pVP
                  P                  V4       V# )u¢   завод/таблица-площадок.py - общий модуль признаков. Имя с дефисом,
обычным import не возьмёшь.Nr   u"   таблица-площадок.pyu   таблица_площадок)Úimportlib.utilô   КОРЕНЬÚutilÚspec_from_file_locationÚmodule_from_specÚloaderÚexec_module)Ú	importlibô   путьô   сr   s       r   ô   общий_модульr   :   sZ   € ó Ü˜lÕ*Ð-QÕQ€HØ	�‰×	/Ñ	/Ð0QÐS[Ó	\€BØ	�‰×	(Ñ	(¨Ó	,€BØ‡I�I×Ñ˜"ÔØ€Ir   c                ó,   € \         P                  V 4      # )u¼   Одно написание на площадку: в журнале живут и «myJane», и «myJane
(сеть Медиафорт)», а сверять их надо как одну.)ô   табô   имя_площадки)ô   пs   &r   r"   r"   H   s   € ô ×)Ñ)¨"Ó-Ð-r   c                 ó`   € \         P                  ! R R\        V 4      P                  4       4      # )u   [^а-яёa-z0-9]r   )r   Úsubr
   Úlower)ô   зs   &r   ô   ключ_заголовкаr(   N   s    € Ü�6Š6Ð% r¬3¨r«7¯=©=«?Ó;Ð;r   c            
     ó–  € \         P                  ! \        P                  RR7      4      R,          p . pV  F�  p\        P                  V4      '       d   VP                  R4      '       g   K7  \        VP                  R4      4      pV'       g   K[  VP                  V\        VP                  RR4      4      VR,          34       K‘  	  V# )	u`  Вышедшие материалы: (дата выхода, площадка, заголовок).

«Вышло, но не видно» публикацией не считается - у нас так помечен пост
на Sostav, который из кабинета не виден. Он есть, но читателя у него нет.
úutf-8©Úencodingu   текстыu   ссылкаu   статусu   площадкаr   u   заголовок)
ÚjsonÚloadsô   РЕЕСТРÚ	read_textr!   ô   вышло_читателюÚgetr   Úappendr"   )ô   рô   итогô   тô   дs       r   ô   публикацииr8   R   s¢   € ô 
�Š”L×*Ñ*°GÐ*Ó<Ó	=¸nÕ	M€BØ€HÛˆÜ×1Ñ1°"×5Ò5¸R¿V¹VÀN×=SÒ=SÙÜ�b—f‘f˜^Ó,Ó-ˆß‰2Ø�O‰O˜RÔ!8¸¿¹Ð@RÐTVÓ9WÓ!XÐZ\Ð]qÕZrÐsÖtñ ð €Or   c            	     óª  € / p \         P                  4       '       g   V # \        \         P                  RR7      P	                  4       4       FÙ  w  rVP                  R4      p\        V4      ^8  gJ   V^ ,          P                  R4      '       d,   V^,          P                  4       P                  4       '       g   Kq  \        V^,          4      \        V^,          4      3pV P                  V. 4      P                  \        V^ ,          4      V\        V^,          4      34       KÛ  	  V P!                  4        F  pVP#                  R R7       K  	  V # )u«  {(площадка, заголовок): [(дата, номер строки, число)]} - вся история.

Номер строки нужен, чтобы при двух записях за один день взять последнюю:
16.09.2026 у Smart-Lab так лежали ошибочные 2221 и исправление на 227,
и сортировка по значению брала большее.
r*   r+   Ú;Ú20c                 ó&   € V ^ ,          V ^,          3# )é    © )r6   s   &r   Ú<lambda>ô   замеры.<locals>.<lambda>t   s   €  " Q¥%¨¨A­¡r   )Úkey)ô   ЖУРНАЛÚexistsÚ	enumerater0   Ú
splitlinesÚsplitÚlenÚ
startswithÚstripÚisdigitr"   r(   Ú
setdefaultr3   r   r   ÚvaluesÚsort)r5   Úir   ô   чô   кô   спs         r   ô   замерыrR   c   s  € ð €HÜ×Ñ× Ò ØˆÜ$¤\×%;Ñ%;ÀWÐ%;Ó%M×%XÑ%XÓ%ZÖ[‰ˆØ×Ñ Ó$ˆÜˆr‹7�QŒ;˜b �e×.Ñ.¨t×4Ò4¸B¸q½E¿K¹K»M×<QÑ<Q×<SÒ<SÙÜ% b¨¥eÓ,Ô.IÈ"ÈQÍ%Ó.PÐQˆØ×Ñ˜B Ó#×*Ñ*¬H°R¸µU«O¸QÄÀBÀqÅEÃ
Ð+KÖLñ \ð —‘Ö!ˆØ�	‰	Ñ/ˆ	Ö0ñ "à€Or   c                 óÂ  € \         P                  ! \        P                  RR7      4      p \	        V \
        4      '       d
   V R,          MT p. pV F‚  pVP                  R4      R8X  g3   VP                  R4      '       g   \        P                  V4      '       d   KM  \        VP                  R4      4      pV'       g   Kq  VP                  V4       K„  	  \        V4      # )uð  Даты заведения аккаунтов - по тем же правилам, что и счётчик панели.

Не считаем: общий вход с соседней площадкой (у VK-сообщества тот же вход,
что у VK Статей) и снятые площадки. Pressfeed сняли 21.09.2026, а аккаунт
там когда-то заводили - если его не отнять, счётчик растёт после отказа.
r*   r+   u   площадкиu   аккаунтu
   общийu   аккаунт_общий_сu   аккаунт_заведён)r-   r.   ô   ПЛОЩАДКИr0   Ú
isinstanceÚdictr2   r!   ô
   снятаr   r3   Úsorted)ô   бô   карточкиr5   rP   r7   s        r   ô   аккаунтыr[   x   s²   € ô 
�ŠÔ$×.Ñ.¸Ð.Ó@Ó	A€BÜ1;¸BÄ×1EÒ1E�rÐ,Ö-È2ÐØ€HÛˆØ�6‰6Ð"Ó# |Ô3°r·v±vÐ>\×7]Ò7]Ôag×arÑarÐsu×avÒavÙÜ�b—f‘fÐ<Ó=Ó>ˆß‰2Ø�O‰O˜BÖñ ô �(ÓÐr   c                  óš  a€ \        4       p \        4       p\        4       p\        P                  ! 4       p. p\
        oSV8:  Edà   V  Uu. uF  qU^ ,          S8:  g   K  VNK  	  pp^ pV Uu0 uF  qU^,          \        V^,          4      3kK  	  up FO  w  r‰VP                  W‰3. 4       U
UUu. uF  w  r«qÊS8:  g   K  VNK  	  ppp
pV'       g   K@  W}R,          ,          pKQ  	  / pV Uu0 uF  qU^,          kK  	  up F¦  pV Uu. uF  qU^,          V8X  g   K  VNK  	  pp^ RppV F^  w   r¹VP                  V\        V	4      3. 4       U
UUu. uF  w  r«pV
S8:  g   K  VNK  	  ppp
pV'       g   KL  VVR,          ,          pRpK`  	  R\        V4      RV'       d   TMR/Wè&   K¨  	  TP                  RSP                  4       R\        V4      R\        V Uu0 uF  qU^,          kK  	  up4      RVR\        V3R	 lV 4       4      R
V/4       S\        ^R7      ,          oEKç  V# u upi u upi u uppp
i u upi u upi u uppp
i u upi )r=   FTõ   опубликованоõ   просмотрыNõ   датаõ   площадокõ   аккаунтовc              3   ó8   <"  € T F  qS8:  g   K  ^x € K  	  R# 5i)é   Nr>   )Ú.0ô   аr7   s   & €r   Ú	<genexpr>ô!   собрать.<locals>.<genexpr>±   s   øé € Ð%E±&¨BÀ"¹H§a¢a³&ùs   ƒ�
u   по_площадкам)Údayséÿÿÿÿ)r8   rR   r[   r   Útodayô   НАЧАЛОr(   r2   rG   r3   Ú	isoformatÚsumr   )ô   пубô   замô   аккô   сегодняô   рядr#   ô
   вышлиô   просмотровô   площадкаô   заголовокô   дтÚ_ô   нô
   точкиô   по_площадкамô   своиô   вô   мерилиr7   s                     @r   ô   собратьr   ‹   s`  ø€ Ü!Ó#€FÜ‹^€FÜÓ€FÜ—Z’Z“\€Nà€FÜ	€BØ
�Õ
Ù#)Ó9¡6˜R°­U°b©[—b�b¡6ˆ
Ð9Ø ÐÙkuÓ4vÑkuÐeg¸µeÔ=XÐY[Ð\]ÕY^Ó=_Ó5`ÑkuÔ4vÑ0ÐØ06·
±
Ð<LÐ;aÐceÔ0fÕuÑ0f¡ ¨"ÐrtÑjtŸ"˜"Ñ0fˆJÒuß‰zØ$°2­Õ6Ò$ñ 5wð #%ÐÙ1;Ó <±¨2 A§ ±Ô <ÐÙ%/ÓM¡Z˜r°aµ5Ð<LÑ3LŸ˜¡ZˆHÐMØ  %�ˆBÛ,4Ñ(��1Ø4:·J±JÐ@PÔRmð  oAó  SBð  @Cð  EGô  5Hõ (ñ  5H¡[ T¨bØ  B™J÷ !˜bñ  5H�
ò (ç‘:Ø˜* R�.Õ(�BØ#'’Lñ -5ð :TÔUXÐYaÓUbØ&:Ç,¹BÐTXð9ZÐ#Ó5ñ !=ð 	�‰Ø˜Ÿ™›Ø&¬¨J«Ø¤±ZÓ$@±Z¨r¨§U U±ZÑ$@Ó AØ Ð"6Ø ¤#Ô%E±&Ó%EÓ"EØ%Ð'>ð
ô 	ð 	Œi˜QÔÕ‹Ø€MùòC :ùâ4vùÜuùò !=ùÚMùô(ùò %AsB   Á	H&ÁH&Á+#H+Â-H0
Â=H0
Ã*H7ÄH<ÄH<ÅIÅIÇIc                  ó€  € \        4       p \        P                  ! \        P	                  R R7      4      pRV '       d   V ^ ,          R,          MRRV '       d   V R,          R,          MRRV R. RORRRR/VR,          R&   \        P                  \        P                  ! VR^R7      R,           R R7       V '       dx   V R,          p\        R\        V 4       RV ^ ,          R,           RV R,          R,           24       \        RVR,           RVR	,           RVR
,           RVR,           24       ^ # \        R4       ^ # )r*   r+   u   сr_   Nu   поu   рядu   что_естьr]   r`   r^   ra   u   чего_нетus   «ждут ответа» и «внешних ссылок» сравнить не с чем, истории нетu   как_считаноur  опубликовано и площадки - по датам выхода из реестра текстов; просмотры - последний замер не позже даты из завод/просмотры-журнал.csv, нарастающим итогом; аккаунты - по полю «аккаунт_заведён» базы площадокÚpru   историяF)Úensure_asciiÚindentÚ
u   история PR: u    дней, z - u1      на сегодня: опубликовано u   , площадок u   , просмотров u   , аккаунтов uV   история PR пуста: публикаций с датами не нашлосьri   )r]   r`   r^   ra   )	r   r-   r.   ô
   ОТЧЁТr0   Ú
write_textÚdumpsÚprintrG   )rr   ô
   отчётr#   s      r   ô   главнаяrŠ   ¸   sM  € ÜÓ€FÜ—’œJ×0Ñ0¸'Ð0ÓBÓC€Jà§vˆf�Q�i˜
Ö#°4Ø¯&��r•
˜:Ö&°dØ�&ØÒwØð  QØð #wð
*€JˆtÕÐ%Ñ&ô ×Ñœ$Ÿ*š* Z¸eÈAÔNÐQUÕUØ%ð ô 'çØ�B�ZˆÜÐ#¤C¨£K =°¸FÀ1½IÀjÕ<QÐ;RÐRUÐV\Ð]_ÕV`ÐakÕVlÐUmÐnÔoÜÐAÀ"ÐE_ÕB`ÐAað b"Ø"$Ð%7Õ"8Ð!9Ð9PÐQSÐThÕQiÐPjð k$Ø$&Ð';Õ$<Ð#=ð?ô 	@ñ
 ô 	ÐfÔgÙr   Ú__main__)Ú__doc__r-   r   ÚsysÚdatetimer   r   Úpathlibr   Ú__file__ÚresolveÚparentr   ô   ДАННЫЕr/   rT   rB   r…   rk   r   r   r!   r"   r(   r8   rR   r[   r   rŠ   Ú__name__Ú
SystemExitr>   r   r   Ú<module>r–      s÷   ðñó: Û 	Û 
ß $Ý á�H‹~×%Ñ%Ó'×.Ñ.×5Ñ5×<Ñ<€Ù�H‹~×%Ñ%Ó'×.Ñ.€Ø˜lÕ*Ð-OÕO€Ø ,Õ.Ð1HÕHÐ Ø˜lÕ*Ð-RÕR€Ø˜MÕ)€
ñ �D˜!˜QÓ€ò8òñ 
!Ó	"€ò.ò<òò"ò*ò&*òZð6 ˆzÔÙ
‘^Ó%Ó
&Ð&ñ r   