From 78d08230a87685dbff9b4c2b33ec46671bb61b6a Mon Sep 17 00:00:00 2001
From: vkovtun <viktor.kovtun@id.ethz.ch>
Date: Tue, 28 Mar 2023 16:54:05 +0200
Subject: [PATCH] SSDM-13256: Excluded "$" and "Auto generate codes" from the
 list of default attributes when exporting samples not for import.

---
 .../generic/server/xls/export/Attribute.java  |  73 ++++++++++--------
 .../helper/AbstractXLSEntityExportHelper.java |   4 +-
 .../xls/export/resources/export-sample.xlsx   | Bin 6630 -> 6445 bytes
 3 files changed, 43 insertions(+), 34 deletions(-)

diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/export/Attribute.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/export/Attribute.java
index 9318e05fbcd..1053b6d1d81 100644
--- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/export/Attribute.java
+++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/export/Attribute.java
@@ -20,69 +20,69 @@ package ch.ethz.sis.openbis.generic.server.xls.export;
 public enum Attribute
 {
 
-    $("$", true, true),
+    $("$", true, true, false),
 
-    ARCHIVING_STATUS("Archiving status", false, false),
+    ARCHIVING_STATUS("Archiving status", false, false, true),
 
-    AUTO_GENERATE_CODES("Auto generate codes", true, true),
+    AUTO_GENERATE_CODES("Auto generate codes", true, true, false),
 
-    CHILDREN("Children", true, false),
+    CHILDREN("Children", true, false, true),
 
-    CODE("Code", true, true),
+    CODE("Code", true, true, true),
 
-    DESCRIPTION("Description", true, true),
+    DESCRIPTION("Description", true, true, true),
 
-    DISALLOW_DELETION("Disallow Deletion", false, false),
+    DISALLOW_DELETION("Disallow Deletion", false, false, true),
 
-    EXPERIMENT("Experiment", true, false),
+    EXPERIMENT("Experiment", true, false, true),
 
-    GENERATE_CODES("Generate Codes", false, false),
+    GENERATE_CODES("Generate Codes", false, false, true),
 
-    GENERATED_CODE_PREFIX("Generated code prefix", true, true),
+    GENERATED_CODE_PREFIX("Generated code prefix", true, true, true),
 
-    IDENTIFIER("Identifier", true, true),
+    IDENTIFIER("Identifier", true, true, true),
 
-    LABEL("Label", true, true),
+    LABEL("Label", true, true, true),
 
-    MAIN_DATA_SET_PATH("Main Data Set Path", false, false),
+    MAIN_DATA_SET_PATH("Main Data Set Path", false, false, true),
 
-    MAIN_DATA_SET_PATTERN("Main Data Set Pattern", false, false),
+    MAIN_DATA_SET_PATTERN("Main Data Set Pattern", false, false, true),
 
-    MODIFICATION_DATE("Modification Date", false, false),
+    MODIFICATION_DATE("Modification Date", false, false, true),
 
-    MODIFIER("Modifier", false, false),
+    MODIFIER("Modifier", false, false, true),
 
-    ONTOLOGY_ID("Ontology ID", true, false),
+    ONTOLOGY_ID("Ontology ID", true, false, true),
 
-    ONTOLOGY_VERSION("Ontology Version", true, false),
+    ONTOLOGY_VERSION("Ontology Version", true, false, true),
 
-    ONTOLOGY_ANNOTATION_ID("Ontology Annotation Id", true, false),
+    ONTOLOGY_ANNOTATION_ID("Ontology Annotation Id", true, false, true),
 
-    PARENTS("Parents", true, false),
+    PARENTS("Parents", true, false, true),
 
-    PERM_ID("PermId", false, false),
+    PERM_ID("PermId", false, false, true),
 
-    PRESENT_IN_ARCHIVE("Present in archive", true, false),
+    PRESENT_IN_ARCHIVE("Present in archive", true, false, true),
 
-    PROJECT("Project", true, true),
+    PROJECT("Project", true, true, true),
 
-    REGISTRATION_DATE("Registration Date", false, false),
+    REGISTRATION_DATE("Registration Date", false, false, true),
 
-    REGISTRATOR("Registrator", false, false),
+    REGISTRATOR("Registrator", false, false, true),
 
-    SAMPLE("Sample", false, false),
+    SAMPLE("Sample", false, false, true),
 
-    SPACE("Space", true, true),
+    SPACE("Space", true, true, true),
 
-    STORAGE_CONFIRMATION("Storage confirmation", false, false),
+    STORAGE_CONFIRMATION("Storage confirmation", false, false, true),
 
-    UNIQUE_SUBCODES("Unique Subcodes", false, false),
+    UNIQUE_SUBCODES("Unique Subcodes", false, false, true),
 
-    URL_TEMPLATE("URL Template", false, false),
+    URL_TEMPLATE("URL Template", false, false, true),
 
-    VALIDATION_SCRIPT("Validation script", true, true),
+    VALIDATION_SCRIPT("Validation script", true, true, true),
 
-    VERSION("Version", true, true);
+    VERSION("Version", true, true, false);
 
     final String name;
 
@@ -90,11 +90,14 @@ public enum Attribute
 
     final boolean requiredForImport;
 
-    Attribute(final String name, final boolean importable, final boolean requiredForImport)
+    final boolean includeInDefaultList;
+
+    Attribute(final String name, final boolean importable, final boolean requiredForImport, final boolean includeInDefaultList)
     {
         this.name = name;
         this.importable = importable;
         this.requiredForImport = requiredForImport;
+        this.includeInDefaultList = includeInDefaultList;
     }
 
     public String getName()
@@ -112,4 +115,8 @@ public enum Attribute
         return requiredForImport;
     }
 
+    public boolean isIncludeInDefaultList()
+    {
+        return includeInDefaultList;
+    }
 }
diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/export/helper/AbstractXLSEntityExportHelper.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/export/helper/AbstractXLSEntityExportHelper.java
index 424c4564349..dbcc1a1eca9 100644
--- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/export/helper/AbstractXLSEntityExportHelper.java
+++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/export/helper/AbstractXLSEntityExportHelper.java
@@ -91,7 +91,9 @@ public abstract class AbstractXLSEntityExportHelper<ENTITY extends IPermIdHolder
                 // Headers
                 final Attribute[] importableAttributes = Arrays.stream(possibleAttributes).filter(Attribute::isImportable)
                         .toArray(Attribute[]::new);
-                final Attribute[] attributes = compatibleWithImport ? importableAttributes : possibleAttributes;
+                final Attribute[] defaultPossibleAttributes = Arrays.stream(possibleAttributes).filter(Attribute::isIncludeInDefaultList)
+                        .toArray(Attribute[]::new);
+                final Attribute[] attributes = compatibleWithImport ? importableAttributes : defaultPossibleAttributes;
 
                 final String[] fieldHeaders = Stream.concat(
                         Arrays.stream(attributes).map(Attribute::getName),
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/resources/export-sample.xlsx b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/resources/export-sample.xlsx
index 009bd2ed680e267a74920601d44e55d1693df698..ce75bbec3c14d1568bf9c66eb80feed5d1e4807c 100644
GIT binary patch
delta 4228
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
WsQ#FqUzm2lxOxaL`7@^9^Zo}5K%%bz

delta 4454
zcmZWt1yodBv>uwFr9;x8q`Re&lu}w6C1w~9=@=R$2S$_-1cnx*L8K87kWfUJ0qGQ}
zp_>Q(Z@oX>UTd#&?p^ykvG>{g-0xP1u85Hu=-}W|0|*HT0di5k)ubRSoa?q$97_WG
zrh@?Eu)!>$lfu*?vz1lnRgIEA10x<jmMYTv{;>XGX5CgNh^%^DXC?jB{=`TUJE#sU
zKs8v=rL%z8%iddFJVt@`^`9n$%kdj?90Meem?&&nV&Oae0PE!Fz!-`GA`FFLCkF6D
zI;!}xIiyT9uF^h%=Ibp#+0bgE{_532<pc)pBba)4QyV3)A3mxogBew`r!K<pE}3u@
z4`5M^RBazA2KPNA!WLO}1x!T&QJ-ELc>VTftC}BHFDVV`y{)5`cU0ijxPE>)@vsE(
zZTWyZ(5I$XSpF<PqOlzK^Bw;1{_2zD>a14b7A()8L6m1EW4Tm2Upp(Xt)=M+jz#>e
zK8&@4Ie&6Y^fD}01zU!Je9i;arznHhUF9uz|78NFNH3v?ikMr&9DV;o7=xsB&diEg
ze;wtnF6BF08QV`H$0%!qXK_RI92S97WeSSbdaVcD%)XS{n(Na;2?8d@A;Q6-1{V8a
zv~~FHZ`lf~mQ)o0dwYhj)@HiAztr13YlpS_>4OF`E8Kx_*5@<T@H}^nIzc!w6(KN_
zFlo(OH1t+JZ*<fz<cC#a<ZQ9Dk!%$Rfx4ZhDNm)w+qvJ5?O-(3*Yn~5tF3nBU;swJ
zVy5+1c<q`eZ1qG*NHzNGd`u&g+#vNUm`4}hVo^S?x@9DiZ74cVQYme%ndgza3tJYH
zIt#Azz^#TaDaT0K%sIBTr2jBX=}6zWP|4lVeM}SurXKobo$pwX7!?~C<8L1<kjOdT
zct-@(<0N2g^cC<Bw^7;(o}g8d$Egpct>F1#wm$arVX@4}qr8EY8l!koKLtk%i3|xx
z$s9|Gj7(j<A}(VDI#RcIb5tAc0+a12TBOc;r2|g76l17t32w|f8NJtro_@}%7|&uX
zM0I+9s}f?|eg{1>E|eGNoc;R6;knChw1n5YuY;=i6EwfaA065c1qiwvGR6&Vx-d8s
z@J|~JmabeeYH#GyZa9TAe*~p}No;TSWPKMuSkc>Vo`%+K{=U&y$l+yHlLJHUjV@a^
zoQyqx{~A)<+j6p(J8C(zfHok1Ro>B}%Gv>4sT8XNq5ZT=IDRIzd=B;Mq_;ShYNk;N
z6abt%pYtoV5|tc*obPh3D4W=l-Ax~UE1YH(L-VuK_yaNj5ZTAj+mF}|FD{I970fOt
z2ClACl7KKcVsj9T0{~QU0>}XW%2C7)J|E27Yf_UUWY#8cG*AhN6G^Oz?v;KJ<hbZq
zTMrdwOc+o>GLs%3AIQCS6jA6Mqm?GF9y=Xdm6}dXpI<F@+A0^R5H(7$8pBu-(21o!
z>AC2;IPf~<^~sLoRL@*0=(uylV7j%6Vf}Ppg|!T?cW|C4&UHzUo-g_1v};4hmjc*2
zoRaQ*;LTU3u4CTTZ4=HOt-DZ*mB+Jt0n<*YH19_})O^1wuk3-Nxg8rU7Q%TssaJuE
zTc+{l<*pF@Uk^@=GUay-++Y@h5603oSc$^goFtJ29A4uYDTO|y8Zv8Sk_$okmsj5-
zIat<ZsnT}coW7t14F#!AtL`d#PIJOW#vZ?Vx?zsLkrZQe<-0yu`^GLn-N<^$Kh-qd
zh7S=K6pyYnvVN-A?<-g$<oo&4`!;`hT`_C&`3zM|&=Lz0*<MUVO$6^gPn-W-=DqQd
zcvpH^@cnK<nS}Pd%+TnU@(!zkHEm)T{IhW?Z2s4rF2v@TV6Wu|cILFu2gGZb-!Nku
ze^YahOpeH#hV5qa>NiYH!PYY=Er##~|C)gekFcyeb+0O$KHq7iU>IuBHX@=bmL9pk
zMcp*4Yb*5O(t1r+D3TxgRBL!IQohnVL;xyP$bo#_FJ|6fxAxB7bNbdUo0>``_c{nk
z!5~OgO;Jzx9^vtekq<hYGC^Ac3(Q`(F{ci}tXcgin4-=PwxV;sTl&fE{a&XRMotH<
z;y3YvVjcN`RRX<Ge-f^~a^fTyJWo?P;!PT>eaLCO_y$?14`G<7wBK+~XC?Qy=R0ZF
z^vrpg#*=R%YxyXFzuu-yH=bY5(@ug9B8cGLx^tC9vkUFXamw)P^7bo%Q4w$`o=N<2
zL$vicuKDI)Sd!HBbkI6pu_;GSIy#Fn+~(-hv`pZqz1X3k4V<(eG3m1=I5>pXRO%f<
zlvyI>svGF1_zz`UaXg;p>XCteV&tqpz!3R{W%uUL3BAnX(xKmqPEa35au<;}sPbm=
zntE225?HK~Li_B}M58B6Y73XZOrV6W+xyPwXUQ+YGB`h;8<GbCb$V5`S(xwU4YV<;
zC2GmcAKy(56(eeMTGt|1PL~g`+ctwMKOhM4>M8tPEw%AJDu&TBpW@lFchl>{cbAf;
zXW6#f?@v1(IesXkaP1-LEagp44;SN%ReIjpuy)8|!Pcr&@%4P@D{PoLpWvKC@gq^*
z^McuD62fJGTk~8C)ExPG-5}ihEe2p%>?M~y(Jc(u!tGNLlv<Es?1v#4hhQr+HhiIW
z6@9qjER;4jWkQFzTXQ1~&))ISLKz<tn=-jAQD6;%WrnjB%^hoJ9a?Zei0aj(ielSK
z>)n6a`s{aB?0`lSVeiuzB8-YD?8iKJ1s4YGd*_z-gY}1L)Z~>~>~(it2i+Qk>bjvI
zn>#3fl5p5}cw#z9w2j3Wy{8R&jGnr^p+tmdID=NXNFDA{6e}hW5aDu>%<}QVH^%+S
zd#x;>5tpg$Gwbx#qHnPW_<^0Vun68$43n|nPM)zJ0R8kiY^1i6$-#`jJGmkv$QN}l
zR)E5b(voe3XB-ZxMPZA?RO8t{aEKRra{oKLVh<H9LQvDgB%A`F_X14`ujn?|4d#`L
zOcm`W;w@$&nmfgjOqwA8Ahgt?;hS+i7+H#)aXh--`px9q`0I?m-}^^xT<}}Hz_M9u
z3oWsjkEB$vtoV*_hV*v;d+ZS_d|DFG39L!GhKby9k4kk&5nfw=(EepdrHCbWn_h~{
zZbjT+2Go!mm+L6Y8Lz~kHS7v!1V0ojysuBi(U>bXVTNOO+;lpE0!^TH$nL2mc4Wt;
zEEN;LmLkvqND-h{a=Z%Wuo=tUERRZ29zSia8qbFjR*e^3YpUDV>fk<$$U!@hncFMN
zs`19E@t45yQ)so%6n6s8)^Q*=1fa>Jlp4B4+#ZaZd#0iQucNgLt)nGjgH-7p{m8AV
zaIsAt-+e>?mqbO?(W-~mNnWdg;aWxk#DQoEr;V-L+*KLXp<-stMaa~mj)KhAkg34T
z_Og0jysAUcb0DhNb@NYXI`Ro9Y3<qUu9u7QpzDfmrl8fp2QqD`n8kA_nPpw8&il?<
zWkSN=s$CZM^x3~0@v<3P0!g}jELpd7GHEu7US=u1!F$lXl~%^Sc=0<4+xS_$`Q90J
z9-5ffEcNX|xZUKbgnc6KmnS<arm#);2ko`sUeeWPvtdD$d9D(D4jS72-Lv<$2^ZZ8
z?^*V3k}UA6@M!eyMdWM;vbR5dKv-+DF4-(<QfSP@S=5LoHc`y3_hIgvW;{qfJgqxP
zoAHi}W4c>Wyi|SM)X_tloGN6MiD6sz$xN}N9B@t*+49R7WJ!wOKjLs0!iQ0C7izf`
z_mHff@S4X3%cP<B4Z$F9qbEV6z=?HmoA#4}L666tX=$app@=7YG9!MSMGO_zdJ+p+
z;tH1Sl1L1^pmdV63pgsf5~Gczl==*DIIlyGiC>c6T)yUGat03w004SUz`yTa6Tn|m
zOGHNg=R+BBo17b_2So}~L~oz*@%z>{j=^&;`Y6j@!X+s=ALXs~5hEgLQ00)arP&F+
znnyoy7*nZib1-M3In@}bkGHzD(l4Vppm!y+w$f4!PtOyTx3wp8+?<mhhCA9s>0cF`
z1E_*9^^)DuL<)J94w)hjva>2f2lZejl$2YktNR9WQW!SPGZ!_3o&M2Y_4CQFt2L4K
zGc=J{Uc0=uh2f<eyF8g63u(|}{7YrWa;6+hh+I7W0k*hiF?q7*k{H$T2I+4V|LKQH
zgKb#Uit#JoSEW^}Z4Afq0d@o4K%%IanhqJgS$u;fWGakZibrx%B6ncYLSz2>xMmF&
zRvc5+Z*y2^uld4&_8iK?(j=<KaEA)44Jl`Op>re$WeOeKxSyNP0*=Ww-6vdC;H0!(
zRPwot9+{{OH&otpd9(0Qf4e@6F^VjE-gzzo|Gnx@*2Q_}4gV5p97fZ!ZESbNFotq}
z%X#rp@QHZqr)4ge--@}hRtU=`)dte|1;;cE^9GpamXVK<4jS?@@~8y3vvj|ZxaIM#
z`4!Y;UNi|QY{`$%DI(sc!+@7VnxAFQX7^FN)($jq7s7bCHa&WqFT=ND)&Z&y<d|iX
zN*ktLXxL-{n?Clfn2`A;eVcoU!zOs3fG)7=FwE&tk<SnB=6rl%qfFVr0ssnuH|K-+
z9|Q^^eoF`@F5qxyQWi+T%>{1&b_*125!PwF^aGzA6--;Sak(D`3XS+|^n*=JzY$1R
zCge~`YHH$IWUBl+cv=3c5tFXQ5+$hSB(B@fBA>DRl**+^oQ&m7^_)Ria(K$2)g-UK
zdfgi%A)7qf5DIEpc%f%~2mGT%y-HiW#8+`GL1$7J4^ddSWOVf=bN{y*cx&PGhcXEs
zP!y5t*EL=y;nPBOk9x(ET&Ff(x2Qm3?m}ktJ74RAu1y~~)RPMF{gJir=kDK<82P4y
z(r{DtlM+3CDX~!-3eUwnW8O=DJj)N&%HeWh<aQa<__CDx)M2=06?k#bCL-V6yX?i8
zjVbDet+nx|MLI8cO6UiuBLzEjiut2^Rs>FP2>m(t1E?C{5lN=;CZnoDA$;?mEP{Ct
z4XidJJ_F0$YVX-!jb!v_(H5gq6OUyUKg~DF$VD{NM3Dcu?KoW1;QCeyayImZNmG7s
zjGJ8}ists5;JH`f3HMD*M5LY<23^MlgH8UQq($sdf?#f+gh{Sbl%{h(QyOS)61P|*
z;&T@qQ@%kfZ|S0N9<}*$e|7|7KDAd6-{uEubyRRmW9}eu(Tgd|S7V@ej}mVt3qFLN
zP&%=T-bt^)mwg@?I=&wk<oCPdK9F4pmrAxS`CElBSrB<<6i2<@dcwFHt?{}qDhau?
z<9bri2~)Fr?G$g9WQ!a7^KsakiWTz$EU#<#d$8RU>*EE((FmV7^<3Q9t{IJ@fYLA%
z?=l;)-HkV?Z+bw$={_j=_A2vnsdMT?e4_Yw`5=L*JV;G*82iNzj{HKARg13C3wh6N
zJMP`Xe2EH{cu}<fT&2d2p2;ckjboDVoOq9^uj^LUwRir_B)F-6{9*f7)CGT4vm#o_
zKdgV2R+j9V{hR#FLJ-_^0&F+0{#hI8|F<0e)!-8#uJ9QVNpvKC#>l2)!p<Z^+#<Wp
zXP|?HO%3?JzYHe-%%7W;{VjC}Ec!dJn|c0@CjfBkZ-eXJ!u6vg)WP5x)Wb{20s72I
z&<_Is?-YM_eQkWRX^MZrv#I_8xAXA$|7d1kllgH#=<913=31}q{~_NI9rPT3Jh33x
ZNbYz&{21PUZQju!uo*b<4d`xg{{xlY6`244

-- 
GitLab