This commit is contained in:
@@ -179,9 +179,13 @@ namespace AyaNova.PlugIn.V8
|
||||
|
||||
/*
|
||||
TODO:
|
||||
* Error should post somehow to server so can see at server what went wrong
|
||||
* custom fields processor for: User, Client, Contract, HeadOffice, LoanItem, part, project, purchaseorder, unit, unitmodel, vendor, workorderitem
|
||||
* See util.cs in winformapp for all custom field shit, lines 3114 is a good starting point
|
||||
* wiki / attached docs
|
||||
*
|
||||
* locales
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
@@ -208,7 +212,7 @@ namespace AyaNova.PlugIn.V8
|
||||
|
||||
//BIZ objects
|
||||
await ExportUsers(progress);
|
||||
//dumpLocales(tempArchiveFolder, progress);
|
||||
// await ExportLocales(progress);
|
||||
|
||||
|
||||
|
||||
@@ -277,8 +281,6 @@ namespace AyaNova.PlugIn.V8
|
||||
}
|
||||
#endregion locales
|
||||
|
||||
|
||||
|
||||
#region Seeds
|
||||
private class GZSeeds
|
||||
{
|
||||
@@ -348,10 +350,10 @@ namespace AyaNova.PlugIn.V8
|
||||
private async System.Threading.Tasks.Task ExportUsers(ProgressForm progress)
|
||||
{
|
||||
//Step 1: export the CustomFields to FormCustom if applicable so that when doing individual items we can export their custom data too
|
||||
var ocf=ObjectHasCustomFieldDataToExport("User");
|
||||
var ocf = ObjectHasCustomFieldDataToExport("User");
|
||||
bool ShouldExportCustom = ocf != null;
|
||||
|
||||
var DateCustomFields = await ExportCustomFieldSchema(ocf, "User", "User");
|
||||
var DateCustomFields = await ExportCustomFieldSchema(ocf, "User", "User");
|
||||
//Step 2: export the users
|
||||
|
||||
|
||||
@@ -410,7 +412,7 @@ var DateCustomFields = await ExportCustomFieldSchema(ocf, "User", "User");
|
||||
//Custom fields?
|
||||
if (ShouldExportCustom)
|
||||
{
|
||||
d.customFields = CustomFieldData(c,DateCustomFields);
|
||||
d.customFields = CustomFieldData(c, DateCustomFields);
|
||||
}
|
||||
|
||||
var a = await util.PostAsync("User", d.ToString());
|
||||
@@ -554,65 +556,124 @@ var DateCustomFields = await ExportCustomFieldSchema(ocf, "User", "User");
|
||||
|
||||
#endregion TAG ITEMS
|
||||
//--------------------------------------------
|
||||
#endregion object dump methods
|
||||
#endregion object export
|
||||
|
||||
|
||||
#region Dump
|
||||
|
||||
// /// <summary>
|
||||
// /// Write out the object properties as JSON
|
||||
// /// </summary>
|
||||
// /// <param name="tempArchiveFolder"></param>
|
||||
// /// <param name="o"></param>
|
||||
// private void ExportObjectToFolder(object o, string objectFileName, List<string> excludeProperties,
|
||||
// TypeAndID tid, string forceTypeString = "", JObject jExtra = null)
|
||||
// {
|
||||
|
||||
// var typestring = o.GetType().ToString();
|
||||
// if (!string.IsNullOrWhiteSpace(forceTypeString))
|
||||
// {
|
||||
// typestring = forceTypeString;
|
||||
// }
|
||||
|
||||
// var dumpFolder = tempArchiveFolder + Path.DirectorySeparatorChar + typestring;
|
||||
// makeFolderIfNotExist(dumpFolder);
|
||||
|
||||
// var outputFileName = dumpFolder + Path.DirectorySeparatorChar + objectFileName + ".json";
|
||||
// var wikiOutputPath = dumpFolder + Path.DirectorySeparatorChar + objectFileName + Path.DirectorySeparatorChar + "files";
|
||||
|
||||
// JsonSerializer serializer = new JsonSerializer();
|
||||
// serializer.NullValueHandling = NullValueHandling.Include;
|
||||
// serializer.ContractResolver = new ExcludeNamedPropertiesContractResolver(excludeProperties);
|
||||
// serializer.ReferenceLoopHandling = ReferenceLoopHandling.Serialize;
|
||||
#region Custom fields exporter
|
||||
|
||||
|
||||
//#if(DEBUG)
|
||||
// serializer.Formatting = Formatting.Indented;
|
||||
//#endif
|
||||
// // serializer.Converters.Add(new JavaScriptDateTimeConverter());
|
||||
// // serializer.NullValueHandling = NullValueHandling.Ignore;
|
||||
//export objects custom field data into jobject string
|
||||
private string CustomFieldData(object biz, List<int> dateFields)
|
||||
{
|
||||
dynamic d = new JObject();
|
||||
|
||||
// //generate file name, should be ID of object plus .json
|
||||
for (int x = 0; x < 10; x++)
|
||||
{
|
||||
object o = (object)biz.GetType().GetProperty("Custom" + x.ToString()).GetValue(biz, null);
|
||||
string s = o.ToString();
|
||||
if (string.IsNullOrWhiteSpace(s))
|
||||
{
|
||||
s = null;
|
||||
}
|
||||
if (s != null && dateFields.Contains(x))
|
||||
{
|
||||
//parse out to UTC date
|
||||
DateTime dt = new DateTime();
|
||||
if (DateTime.TryParse(s, out dt))
|
||||
{
|
||||
s = dt.ToUniversalTime().ToString("s");
|
||||
}
|
||||
}
|
||||
if (!string.IsNullOrWhiteSpace(s))
|
||||
d["c" + (x + 1).ToString()] = s;
|
||||
|
||||
// JObject jo = JObject.FromObject(o, serializer);
|
||||
// if (jExtra != null)
|
||||
// {
|
||||
// jo.Add("jextra", jExtra);
|
||||
// }
|
||||
}
|
||||
return d.ToString();
|
||||
}
|
||||
|
||||
static public ObjectCustomFields ObjectHasCustomFieldDataToExport(string sObject)
|
||||
{
|
||||
ObjectCustomFields ocf = ObjectCustomFields.GetItems(sObject);
|
||||
if (ocf.Count == 0)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
// using (StreamWriter sw = new StreamWriter(outputFileName))
|
||||
// using (JsonWriter writer = new JsonTextWriter(sw))
|
||||
// {
|
||||
foreach (ObjectCustomField f in ocf)
|
||||
{
|
||||
if (f.Visible)
|
||||
return ocf;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
// // serializer.Serialize(writer, o);
|
||||
// serializer.Serialize(writer, jo);
|
||||
// }
|
||||
private async System.Threading.Tasks.Task<List<int>> ExportCustomFieldSchema(ObjectCustomFields ocf, string v7CustomFieldObjectName, string RavenCustomTranslationKeyObjectName)
|
||||
{
|
||||
var ret = new List<int>();
|
||||
//NOTE: this code inspired by winforApp::Util.cs PrepareCustomFieldsGrid method
|
||||
dynamic d = new JObject();
|
||||
d.formkey = RavenCustomTranslationKeyObjectName;
|
||||
dynamic dtemplate = new JArray();
|
||||
foreach (ObjectCustomField f in ocf)
|
||||
{
|
||||
if (f.Visible)
|
||||
{
|
||||
int n = Convert.ToInt32(f.FieldName.Replace("Custom", "")) + 1;//raven custom fields are 1 based, v7 are zero based
|
||||
CustomFieldLocaleKeys.Add(RavenCustomTranslationKeyObjectName + n.ToString(),
|
||||
util.LocaleText.GetLocalizedText(v7CustomFieldObjectName + ".Label." + f.FieldName));
|
||||
|
||||
// //WIKI / ATTACHMENTS
|
||||
// DumpWikiPageAndAttachments(tid, wikiOutputPath);
|
||||
// }
|
||||
dynamic dt = new JObject();
|
||||
dt.fld = RavenCustomTranslationKeyObjectName + "Custom" + n.ToString();
|
||||
dt.hide = false;
|
||||
dt.required = false;
|
||||
switch (f.FieldType)
|
||||
{
|
||||
case FormFieldDataTypes.Currency:
|
||||
dt.type = util.AyaUiFieldDataType.Currency;
|
||||
break;
|
||||
case FormFieldDataTypes.DateOnly:
|
||||
dt.type = util.AyaUiFieldDataType.Date;
|
||||
ret.Add(n - 1);
|
||||
break;
|
||||
case FormFieldDataTypes.DateTime:
|
||||
dt.type = util.AyaUiFieldDataType.DateTime;
|
||||
ret.Add(n - 1);
|
||||
break;
|
||||
case FormFieldDataTypes.Number:
|
||||
dt.type = util.AyaUiFieldDataType.Decimal;
|
||||
break;
|
||||
case FormFieldDataTypes.Text:
|
||||
dt.type = util.AyaUiFieldDataType.Text;
|
||||
break;
|
||||
case FormFieldDataTypes.TimeOnly:
|
||||
dt.type = util.AyaUiFieldDataType.Time;
|
||||
ret.Add(n - 1);
|
||||
break;
|
||||
case FormFieldDataTypes.TrueFalse:
|
||||
dt.type = util.AyaUiFieldDataType.Bool;
|
||||
break;
|
||||
default:
|
||||
dt.type = util.AyaUiFieldDataType.Text;
|
||||
break;
|
||||
}
|
||||
dtemplate.Add(dt);
|
||||
}
|
||||
}
|
||||
d.template = dtemplate.ToString();
|
||||
|
||||
//ok, were here because there *are* custom fields available
|
||||
var a = await util.GetAsync("FormCustom/" + RavenCustomTranslationKeyObjectName);
|
||||
var ctoken = util.CTokenFromResponse(a);
|
||||
d.concurrencyToken = ctoken;
|
||||
await util.PutAsync("FormCustom/" + RavenCustomTranslationKeyObjectName, d.ToString());
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endregion custom fields
|
||||
|
||||
#region WIKI page exporter
|
||||
|
||||
|
||||
//WIKI
|
||||
#region Wikiable objects reference
|
||||
@@ -640,25 +701,23 @@ var DateCustomFields = await ExportCustomFieldSchema(ocf, "User", "User");
|
||||
*/
|
||||
#endregion
|
||||
|
||||
private void ExportWikiPageAndAttachments(TypeAndID tid, string wikiOutputPath)
|
||||
private async System.Threading.Tasks.Task<string> ExportWikiPageAndAttachments(TypeAndID tid)
|
||||
{
|
||||
//todo: upload attached files
|
||||
//todo: return wiki as string
|
||||
|
||||
// //may not exist
|
||||
// if (!WikiPage.HasWiki(tid.ID)) return;
|
||||
//may not exist
|
||||
if (!WikiPage.HasWiki(tid.ID)) return null;
|
||||
|
||||
// WikiPage w = WikiPage.GetItem(tid);
|
||||
// var content = w.GetContentAsString;
|
||||
// AyaFileList fl = AyaFileList.GetList(w.ID);
|
||||
WikiPage w = WikiPage.GetItem(tid);
|
||||
var content = w.GetContentAsString;
|
||||
AyaFileList fl = AyaFileList.GetList(w.ID);
|
||||
|
||||
// if (string.IsNullOrWhiteSpace(content) && fl.Count < 1) return;
|
||||
if (string.IsNullOrWhiteSpace(content) && fl.Count < 1) return null;
|
||||
|
||||
// makeFolderIfNotExist(wikiOutputPath);
|
||||
|
||||
// if (!string.IsNullOrWhiteSpace(content))
|
||||
// {
|
||||
// //write out the html wiki page
|
||||
// File.WriteAllText(wikiOutputPath + Path.DirectorySeparatorChar + "w.html", content);
|
||||
// }
|
||||
|
||||
|
||||
|
||||
// //files
|
||||
// foreach (AyaFileList.AyaFileListInfo i in fl)
|
||||
@@ -713,11 +772,19 @@ var DateCustomFields = await ExportCustomFieldSchema(ocf, "User", "User");
|
||||
// }
|
||||
|
||||
// }
|
||||
|
||||
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(content))
|
||||
return content;
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
||||
#endregion dump
|
||||
#endregion wiki
|
||||
|
||||
#region Utility methods
|
||||
|
||||
#region TAGS
|
||||
private void Tagit(Guid g, List<string> tags)
|
||||
{
|
||||
if (g == Guid.Empty) return;
|
||||
@@ -727,10 +794,8 @@ var DateCustomFields = await ExportCustomFieldSchema(ocf, "User", "User");
|
||||
{
|
||||
tags.Add(t);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
private void SetTags(dynamic d, List<string> tags)
|
||||
{
|
||||
dynamic dtags = new JArray();
|
||||
@@ -739,117 +804,40 @@ var DateCustomFields = await ExportCustomFieldSchema(ocf, "User", "User");
|
||||
d.tags = dtags;
|
||||
}
|
||||
|
||||
#endregion tags
|
||||
|
||||
|
||||
//export objects custom field data into jobject string
|
||||
private string CustomFieldData(object biz, List<int> dateFields)
|
||||
{
|
||||
dynamic d=new JObject();
|
||||
|
||||
for (int x = 0; x < 10; x++)
|
||||
{
|
||||
object o = (object)biz.GetType().GetProperty("Custom"+x.ToString()).GetValue(biz, null);
|
||||
string s = o.ToString();
|
||||
if (string.IsNullOrWhiteSpace(s))
|
||||
{
|
||||
s = null;
|
||||
}
|
||||
if (s!=null && dateFields.Contains(x))
|
||||
{
|
||||
//parse out to UTC date
|
||||
DateTime dt=new DateTime();
|
||||
if (DateTime.TryParse(s, out dt))
|
||||
{
|
||||
s = dt.ToUniversalTime().ToString("s");
|
||||
}
|
||||
}
|
||||
if(!string.IsNullOrWhiteSpace(s))
|
||||
d["c"+(x+1).ToString()] = s;
|
||||
|
||||
}
|
||||
return d.ToString();
|
||||
}
|
||||
|
||||
static public ObjectCustomFields ObjectHasCustomFieldDataToExport(string sObject)
|
||||
{
|
||||
ObjectCustomFields ocf = ObjectCustomFields.GetItems(sObject);
|
||||
if (ocf.Count == 0)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
foreach (ObjectCustomField f in ocf)
|
||||
{
|
||||
if (f.Visible)
|
||||
return ocf;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private async System.Threading.Tasks.Task<List<int>> ExportCustomFieldSchema(ObjectCustomFields ocf, string v7CustomFieldObjectName, string RavenCustomTranslationKeyObjectName)
|
||||
{
|
||||
var ret = new List<int>();
|
||||
//NOTE: this code inspired by winforApp::Util.cs PrepareCustomFieldsGrid method
|
||||
dynamic d = new JObject();
|
||||
d.formkey = RavenCustomTranslationKeyObjectName;
|
||||
dynamic dtemplate = new JArray();
|
||||
foreach (ObjectCustomField f in ocf)
|
||||
{
|
||||
if (f.Visible)
|
||||
{
|
||||
int n = Convert.ToInt32(f.FieldName.Replace("Custom", "")) + 1;//raven custom fields are 1 based, v7 are zero based
|
||||
CustomFieldLocaleKeys.Add(RavenCustomTranslationKeyObjectName + n.ToString(),
|
||||
util.LocaleText.GetLocalizedText(v7CustomFieldObjectName + ".Label." + f.FieldName));
|
||||
|
||||
dynamic dt = new JObject();
|
||||
dt.fld = RavenCustomTranslationKeyObjectName + "Custom" + n.ToString();
|
||||
dt.hide = false;
|
||||
dt.required = false;
|
||||
switch (f.FieldType)
|
||||
{
|
||||
case FormFieldDataTypes.Currency:
|
||||
dt.type = util.AyaUiFieldDataType.Currency;
|
||||
break;
|
||||
case FormFieldDataTypes.DateOnly:
|
||||
dt.type = util.AyaUiFieldDataType.Date;
|
||||
ret.Add(n-1);
|
||||
break;
|
||||
case FormFieldDataTypes.DateTime:
|
||||
dt.type = util.AyaUiFieldDataType.DateTime;
|
||||
ret.Add(n - 1);
|
||||
break;
|
||||
case FormFieldDataTypes.Number:
|
||||
dt.type = util.AyaUiFieldDataType.Decimal;
|
||||
break;
|
||||
case FormFieldDataTypes.Text:
|
||||
dt.type = util.AyaUiFieldDataType.Text;
|
||||
break;
|
||||
case FormFieldDataTypes.TimeOnly:
|
||||
dt.type = util.AyaUiFieldDataType.Time;
|
||||
ret.Add(n - 1);
|
||||
break;
|
||||
case FormFieldDataTypes.TrueFalse:
|
||||
dt.type = util.AyaUiFieldDataType.Bool;
|
||||
break;
|
||||
default:
|
||||
dt.type = util.AyaUiFieldDataType.Text;
|
||||
break;
|
||||
}
|
||||
dtemplate.Add(dt);
|
||||
}
|
||||
}
|
||||
d.template = dtemplate.ToString();
|
||||
|
||||
//ok, were here because there *are* custom fields available
|
||||
var a = await util.GetAsync("FormCustom/" + RavenCustomTranslationKeyObjectName);
|
||||
var ctoken = util.CTokenFromResponse(a);
|
||||
d.concurrencyToken = ctoken;
|
||||
await util.PutAsync("FormCustom/" + RavenCustomTranslationKeyObjectName, d.ToString());
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#region OLD JSON EXPORT STUFF
|
||||
|
||||
|
||||
#region contract resolver
|
||||
//public class ExcludeNamedPropertiesContractResolver : DefaultContractResolver
|
||||
//{
|
||||
// private readonly List<string> _excludeProperties;
|
||||
|
||||
// public ExcludeNamedPropertiesContractResolver(List<string> excludeProperties)
|
||||
// {
|
||||
// _excludeProperties = excludeProperties;
|
||||
// }
|
||||
|
||||
// protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
|
||||
// {
|
||||
// IList<JsonProperty> properties = base.CreateProperties(type, memberSerialization);
|
||||
|
||||
// // only serializer properties that start with the specified character
|
||||
// //properties = properties.Where(p => p.PropertyName.StartsWith(_startingWithChar.ToString())).ToList();
|
||||
// properties = properties.Where(p => !_excludeProperties.Contains(p.PropertyName)).ToList();
|
||||
|
||||
// return properties;
|
||||
// }
|
||||
//}
|
||||
#endregion contract resolver
|
||||
|
||||
|
||||
//private static string EnsureValidFileName(string fileName)
|
||||
//{
|
||||
// //make lower and replace spaces with dashes
|
||||
@@ -911,36 +899,9 @@ var DateCustomFields = await ExportCustomFieldSchema(ocf, "User", "User");
|
||||
|
||||
// }
|
||||
//}
|
||||
#endregion
|
||||
|
||||
#region contract resolver
|
||||
public class ExcludeNamedPropertiesContractResolver : DefaultContractResolver
|
||||
{
|
||||
private readonly List<string> _excludeProperties;
|
||||
|
||||
public ExcludeNamedPropertiesContractResolver(List<string> excludeProperties)
|
||||
{
|
||||
_excludeProperties = excludeProperties;
|
||||
}
|
||||
|
||||
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
|
||||
{
|
||||
IList<JsonProperty> properties = base.CreateProperties(type, memberSerialization);
|
||||
|
||||
// only serializer properties that start with the specified character
|
||||
//properties = properties.Where(p => p.PropertyName.StartsWith(_startingWithChar.ToString())).ToList();
|
||||
properties = properties.Where(p => !_excludeProperties.Contains(p.PropertyName)).ToList();
|
||||
|
||||
return properties;
|
||||
}
|
||||
}
|
||||
#endregion contract resolver
|
||||
|
||||
#endregion old
|
||||
|
||||
//eoc
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
//eons
|
||||
|
||||
Reference in New Issue
Block a user