Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
87 changes: 66 additions & 21 deletions PortaCapena.OdooJsonRpcClient/Converters/OdooModelMapper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -97,13 +97,17 @@ public static bool ConverOdooPropertyToDotNet(Type dotnetType, JToken value, out

public static string GetDotNetModel(string tableName, Dictionary<string, OdooPropertyInfo> properties, bool addSummary = true)
{
var existing = new Dictionary<string, bool>();

var builder = new StringBuilder();
builder.AppendLine($"[OdooTableName(\"{tableName}\")]");
builder.AppendLine($"[JsonConverter(typeof({nameof(OdooModelConverter)}))]");
builder.AppendLine($"public class {ConvertOdooNameToDotNet(tableName)}{OdooModelSuffix} : IOdooModel");
builder.AppendLine($"public partial class {ConvertOdooNameToDotNet(tableName, existing)}{OdooModelSuffix} : IOdooModel");
builder.AppendLine("{");

foreach (var property in properties)

existing.Clear();
foreach (var property in properties.OrderBy(p => p.Value.Name))
{
builder.AppendLine(string.Empty);

Expand All @@ -124,14 +128,17 @@ public static string GetDotNetModel(string tableName, Dictionary<string, OdooPro
}

builder.AppendLine($"[JsonProperty(\"{property.Key}\")]");
builder.AppendLine($"public {ConvertToDotNetPropertyTypeName(property, tableName)} {ConvertOdooNameToDotNet(property.Key)} {{ get; set; }}");
builder.AppendLine($"public {ConvertToDotNetTypeName(property, tableName)}{ConvertToDotNetNullable(property.Value)} {ConvertOdooNameToDotNet(property.Key, existing)} {{ get; set; }}");
}
builder.AppendLine("}");

var selectionsProps = properties.Where(x => x.Value.PropertyValueType == OdooValueTypeEnum.Selection).ToList();

foreach (var property in selectionsProps)
{
existing.Clear();


builder.AppendLine(string.Empty);
builder.AppendLine(string.Empty);

Expand All @@ -146,24 +153,26 @@ public static string GetDotNetModel(string tableName, Dictionary<string, OdooPro
}

builder.AppendLine($"[JsonConverter(typeof(StringEnumConverter))]");
builder.AppendLine($"public enum {ConvertOdooNameToDotNet(property.Value.String)}{ConvertOdooNameToDotNet(tableName)}{OdooEnumSuffix}");
builder.AppendLine($"public enum {ConvertToDotNetTypeName(property, tableName)}");
builder.AppendLine("{");

existing.Clear();
for (int i = 0; i < property.Value.Selection.Length; i++)
{
string[] item = property.Value.Selection[i];

if (i != 0)
builder.AppendLine(string.Empty);
builder.AppendLine($"[EnumMember(Value = \"{item[0]}\")]");
builder.AppendLine($"{ConvertOdooNameToDotNet(item[1])} = {i + 1},");
builder.AppendLine($"{ConvertOdooNameToDotNet(item[1], existing)} = {i + 1},");
}
builder.AppendLine("}");
}
return builder.ToString();
}

public static string ConvertToDotNetPropertyTypeName(KeyValuePair<string, OdooPropertyInfo> property, string tableName)

public static string ConvertToDotNetTypeName(KeyValuePair<string, OdooPropertyInfo> property, string tableName)
{
switch (property.Value.PropertyValueType)
{
Expand All @@ -172,40 +181,40 @@ public static string ConvertToDotNetPropertyTypeName(KeyValuePair<string, OdooPr
case OdooValueTypeEnum.Char:
return "string";
case OdooValueTypeEnum.Selection:
return $"{ConvertOdooNameToDotNet(property.Value.String)}{ConvertOdooNameToDotNet(tableName)}{OdooEnumSuffix}{(property.Value.ResultRequired ? "" : "?")}";
return $"{ConvertOdooNameToDotNet(property.Value.Name)}{ConvertOdooNameToDotNet(tableName)}{OdooEnumSuffix}";
case OdooValueTypeEnum.Text:
return "string";
case OdooValueTypeEnum.Html:
return "string";

case OdooValueTypeEnum.Boolean:
return property.Value.ResultRequired ? "bool" : "bool?";
return "bool";

case OdooValueTypeEnum.Monetary:
return property.Value.ResultRequired ? "decimal" : "decimal?";
return "decimal";

case OdooValueTypeEnum.Float:
return property.Value.ResultRequired ? "double" : "double?";
return "double";
case OdooValueTypeEnum.Integer:
if (property.Key.ToString().ToLower() == "id")
if (property.Key.Equals("id", StringComparison.InvariantCultureIgnoreCase))
return "long";
return property.Value.ResultRequired ? "int" : "int?";
return "int";

case OdooValueTypeEnum.Date:
return property.Value.ResultRequired ? "DateTime" : "DateTime?";
return "DateTime";
case OdooValueTypeEnum.Datetime:
return property.Value.ResultRequired ? "DateTime" : "DateTime?";
return "DateTime";

case OdooValueTypeEnum.Many2One:
return property.Value.ResultRequired ? "long" : "long?";
return "long";
case OdooValueTypeEnum.Many2OneReference:
return property.Value.ResultRequired ? "long" : "long?";
return "long";
case OdooValueTypeEnum.Many2Many:
return "long[]";
case OdooValueTypeEnum.One2Many:
return "long[]";
case OdooValueTypeEnum.One2One:
return property.Value.ResultRequired ? "long" : "long?";
return "long";

case OdooValueTypeEnum.Reference:
return ConvertOdooNameToDotNet(property.Value.RelationField) + OdooModelSuffix;
Expand All @@ -215,12 +224,48 @@ public static string ConvertToDotNetPropertyTypeName(KeyValuePair<string, OdooPr
}
}

public static string ConvertOdooNameToDotNet(string odooName)
public static string ConvertToDotNetNullable(OdooPropertyInfo value)
{
if (false
// required field should not be nullable
|| value.ResultRequired
// id are mandatory even if they're not marked as required
|| value.Name.Equals("id", StringComparison.InvariantCultureIgnoreCase)
// one2many and many2many are array even if there are zero relations
|| value.PropertyValueType == OdooValueTypeEnum.Many2Many
|| value.PropertyValueType == OdooValueTypeEnum.One2Many
)
{
return "";
}
else
return "?";
}

public static string ConvertOdooNameToDotNet(string odooName, IDictionary<string, bool> existing = null)
{
odooName = odooName.Replace("+", "Plus");
var odooNameCleaned = Regex.Replace(odooName, "[^A-Za-z0-9-]", "_");
var dotnetKeys = odooNameCleaned.Split('_', '-', '.', ',', ' ', ':', ';', '/', '\\', '*', '+', '(', ')', '[', ']').Select(x => CultureInfo.InvariantCulture.TextInfo.ToTitleCase(x));
return string.Join(string.Empty, dotnetKeys);
var dotnetKeys = odooNameCleaned
.Split('_', '-', '.', ',', ' ', ':', ';', '/', '\\', '*', '+', '(', ')', '[', ']')
.Select(x => CultureInfo.InvariantCulture.TextInfo.ToTitleCase(x))
.Where(x => !string.IsNullOrEmpty(x))
.ToList();
if (dotnetKeys.Count == 0)
dotnetKeys.Add("None");
var result = string.Join(string.Empty, dotnetKeys);

if (existing == null) existing = new Dictionary<string, bool>();

int i = 1;
string dedupResult;
do
{
dedupResult = $"{result}{(i < 2 ? "" : i.ToString())}";
i++;
} while (existing.ContainsKey(dedupResult));

existing[dedupResult] = true;
return dedupResult;
}

public static object ConvertToDotNetEnum(Type type, JToken value)
Expand Down