mirror of
https://github.com/cgrates/cgrates.git
synced 2026-02-12 02:26:26 +05:00
Remove ActivationInterval for Attributes (tests failing)
This commit is contained in:
committed by
Dan Christian Bogos
parent
5b62682506
commit
236c61ff1f
@@ -534,9 +534,6 @@ func TestLoadAttributeProfiles(t *testing.T) {
|
||||
ID: "ALS1",
|
||||
Contexts: []string{"con1", "con2", "con3"},
|
||||
FilterIDs: []string{"*string:~*req.Account:1001"},
|
||||
ActivationInterval: &utils.TPActivationInterval{
|
||||
ActivationTime: "2014-07-29T15:00:00Z",
|
||||
},
|
||||
Attributes: []*utils.TPAttribute{
|
||||
{
|
||||
FilterIDs: []string{"*string:~*req.Field1:Initial"},
|
||||
@@ -566,8 +563,6 @@ func TestLoadAttributeProfiles(t *testing.T) {
|
||||
t.Errorf("Expecting: %+v, received: %+v", eAttrProfiles[resKey].Contexts, csvr.attributeProfiles[resKey].Contexts)
|
||||
} else if !reflect.DeepEqual(eAttrProfiles[resKey].FilterIDs, csvr.attributeProfiles[resKey].FilterIDs) {
|
||||
t.Errorf("Expecting: %+v, received: %+v", eAttrProfiles[resKey].FilterIDs, csvr.attributeProfiles[resKey].FilterIDs)
|
||||
} else if !reflect.DeepEqual(eAttrProfiles[resKey].ActivationInterval.ActivationTime, csvr.attributeProfiles[resKey].ActivationInterval.ActivationTime) {
|
||||
t.Errorf("Expecting: %+v, received: %+v", eAttrProfiles[resKey].ActivationInterval, csvr.attributeProfiles[resKey].ActivationInterval)
|
||||
} else if !reflect.DeepEqual(eAttrProfiles[resKey].Attributes, csvr.attributeProfiles[resKey].Attributes) {
|
||||
t.Errorf("Expecting: %+v, received: %+v", eAttrProfiles[resKey].Attributes, csvr.attributeProfiles[resKey].Attributes)
|
||||
} else if !reflect.DeepEqual(eAttrProfiles[resKey].Blocker, csvr.attributeProfiles[resKey].Blocker) {
|
||||
|
||||
@@ -1453,14 +1453,13 @@ func APItoAttributeProfile(tpAttr *utils.TPAttributeProfile, timezone string) (a
|
||||
|
||||
func AttributeProfileToAPI(attrPrf *AttributeProfile) (tpAttr *utils.TPAttributeProfile) {
|
||||
tpAttr = &utils.TPAttributeProfile{
|
||||
Tenant: attrPrf.Tenant,
|
||||
ID: attrPrf.ID,
|
||||
FilterIDs: make([]string, len(attrPrf.FilterIDs)),
|
||||
Contexts: make([]string, len(attrPrf.Contexts)),
|
||||
Attributes: make([]*utils.TPAttribute, len(attrPrf.Attributes)),
|
||||
ActivationInterval: new(utils.TPActivationInterval),
|
||||
Blocker: attrPrf.Blocker,
|
||||
Weight: attrPrf.Weight,
|
||||
Tenant: attrPrf.Tenant,
|
||||
ID: attrPrf.ID,
|
||||
FilterIDs: make([]string, len(attrPrf.FilterIDs)),
|
||||
Contexts: make([]string, len(attrPrf.Contexts)),
|
||||
Attributes: make([]*utils.TPAttribute, len(attrPrf.Attributes)),
|
||||
Blocker: attrPrf.Blocker,
|
||||
Weight: attrPrf.Weight,
|
||||
}
|
||||
for i, fli := range attrPrf.FilterIDs {
|
||||
tpAttr.FilterIDs[i] = fli
|
||||
|
||||
@@ -1359,11 +1359,7 @@ func TestAPItoAttributeProfile(t *testing.T) {
|
||||
Tenant: "cgrates.org",
|
||||
ID: "ALS1",
|
||||
Contexts: []string{"con1"},
|
||||
FilterIDs: []string{"FLTR_ACNT_dan", "FLTR_DST_DE"},
|
||||
ActivationInterval: &utils.TPActivationInterval{
|
||||
ActivationTime: "2014-07-14T14:35:00Z",
|
||||
ExpiryTime: "",
|
||||
},
|
||||
FilterIDs: []string{"FLTR_ACNT_dan", "FLTR_DST_DE", "*ai:~*req.AnswerTime:2014-07-14T14:35:00Z"},
|
||||
Attributes: []*utils.TPAttribute{
|
||||
{
|
||||
Path: utils.MetaReq + utils.NestingSep + "FL1",
|
||||
@@ -1398,11 +1394,7 @@ func TestAttributeProfileToAPI(t *testing.T) {
|
||||
Tenant: "cgrates.org",
|
||||
ID: "ALS1",
|
||||
Contexts: []string{"con1"},
|
||||
FilterIDs: []string{"FLTR_ACNT_dan", "FLTR_DST_DE"},
|
||||
ActivationInterval: &utils.TPActivationInterval{
|
||||
ActivationTime: "2014-07-14T14:35:00Z",
|
||||
ExpiryTime: "2014-07-15T14:35:00Z",
|
||||
},
|
||||
FilterIDs: []string{"FLTR_ACNT_dan", "FLTR_DST_DE", "*ai:~*req.AnswerTime:2014-07-14T14:35:00Z;2014-07-15T14:36:00Z"},
|
||||
Attributes: []*utils.TPAttribute{
|
||||
{
|
||||
Path: utils.MetaReq + utils.NestingSep + "FL1",
|
||||
@@ -1435,11 +1427,7 @@ func TestAttributeProfileToAPI2(t *testing.T) {
|
||||
Tenant: "cgrates.org",
|
||||
ID: "ALS1",
|
||||
Contexts: []string{"con1"},
|
||||
FilterIDs: []string{"FLTR_ACNT_dan", "FLTR_DST_DE"},
|
||||
ActivationInterval: &utils.TPActivationInterval{
|
||||
ActivationTime: "2014-07-14T14:35:00Z",
|
||||
ExpiryTime: "",
|
||||
},
|
||||
FilterIDs: []string{"FLTR_ACNT_dan", "FLTR_DST_DE", "*ai:~*req.AnswerTime:2014-07-14T14:35:00Z"},
|
||||
Attributes: []*utils.TPAttribute{
|
||||
{
|
||||
Path: utils.MetaReq + utils.NestingSep + "FL1",
|
||||
@@ -1480,11 +1468,7 @@ func TestAPItoModelTPAttribute(t *testing.T) {
|
||||
Tenant: "cgrates.org",
|
||||
ID: "ALS1",
|
||||
Contexts: []string{"con1", "con2"},
|
||||
FilterIDs: []string{"FLTR_ACNT_dan", "FLTR_DST_DE"},
|
||||
ActivationInterval: &utils.TPActivationInterval{
|
||||
ActivationTime: "2014-07-14T14:35:00Z",
|
||||
ExpiryTime: "2014-07-15T14:35:00Z",
|
||||
},
|
||||
FilterIDs: []string{"FLTR_ACNT_dan", "FLTR_DST_DE", "*ai:~*req.AnswerTime:2014-07-14T14:35:00Z;2014-07-14T14:36:00Z"},
|
||||
Attributes: []*utils.TPAttribute{
|
||||
{FilterIDs: []string{"filter_id1", "filter_id2"},
|
||||
Path: utils.MetaReq + utils.NestingSep + "FL1",
|
||||
@@ -1499,7 +1483,7 @@ func TestAPItoModelTPAttribute(t *testing.T) {
|
||||
Tenant: "cgrates.org",
|
||||
ID: "ALS1",
|
||||
Contexts: "con1;con2",
|
||||
FilterIDs: "FLTR_ACNT_dan;FLTR_DST_DE",
|
||||
FilterIDs: "FLTR_ACNT_dan;FLTR_DST_DE;*ai:~*req.AnswerTime:2014-07-14T14:35:00Z;2014-07-14T14:36:00Z",
|
||||
AttributeFilterIDs: "filter_id1;filter_id2",
|
||||
Path: utils.MetaReq + utils.NestingSep + "FL1",
|
||||
Value: "Al1",
|
||||
@@ -1518,11 +1502,7 @@ func TestCsvDumpForAttributeModels(t *testing.T) {
|
||||
Tenant: "cgrates.org",
|
||||
ID: "ALS1",
|
||||
Contexts: []string{"con1"},
|
||||
FilterIDs: []string{"FLTR_ACNT_dan"},
|
||||
ActivationInterval: &utils.TPActivationInterval{
|
||||
ActivationTime: "2014-07-14T14:35:00Z",
|
||||
ExpiryTime: "",
|
||||
},
|
||||
FilterIDs: []string{"FLTR_ACNT_dan", "*ai:~*req.AnswerTime:2014-07-14T14:35:00Z"},
|
||||
Attributes: []*utils.TPAttribute{
|
||||
{
|
||||
Path: utils.MetaReq + utils.NestingSep + "FL1",
|
||||
@@ -1541,7 +1521,7 @@ func TestCsvDumpForAttributeModels(t *testing.T) {
|
||||
Tenant: "cgrates.org",
|
||||
ID: "ALS1",
|
||||
Contexts: "con1",
|
||||
FilterIDs: "FLTR_ACNT_dan",
|
||||
FilterIDs: "FLTR_ACNT_dan;*ai:~*req.AnswerTime:2014-07-14T14:35:00Z",
|
||||
Path: utils.MetaReq + utils.NestingSep + "FL1",
|
||||
Value: "Al1",
|
||||
Weight: 20,
|
||||
@@ -1558,10 +1538,10 @@ func TestCsvDumpForAttributeModels(t *testing.T) {
|
||||
if !reflect.DeepEqual(expected, rcv) {
|
||||
t.Errorf("Expecting : %+v,\n received: %+v", utils.ToJSON(expected), utils.ToJSON(rcv))
|
||||
}
|
||||
expRecord := []string{"cgrates.org", "ALS1", "con1", "FLTR_ACNT_dan", "2014-07-14T14:35:00Z", "", "*req.FL1", "", "Al1", "false", "20"}
|
||||
expRecord := []string{"cgrates.org", "ALS1", "con1", "FLTR_ACNT_dan;*ai:~*req.AnswerTime:2014-07-14T14:35:00Z", "20", "", "*req.FL1", "", "Al1", "false"}
|
||||
for i, model := range rcv {
|
||||
if i == 1 {
|
||||
expRecord = []string{"cgrates.org", "ALS1", "", "", "", "", "*req.FL2", "", "Al2", "false", "0"}
|
||||
expRecord = []string{"cgrates.org", "ALS1", "", "", "0", "", "*req.FL2", "", "Al2", "false"}
|
||||
}
|
||||
if csvRecordRcv, _ := CsvDump(model); !reflect.DeepEqual(expRecord, csvRecordRcv) {
|
||||
t.Errorf("Expecting : %+v, received: %+v", utils.ToJSON(expRecord), utils.ToJSON(csvRecordRcv))
|
||||
@@ -1577,7 +1557,7 @@ func TestModelAsTPAttribute2(t *testing.T) {
|
||||
Tenant: "cgrates.org",
|
||||
ID: "ALS1",
|
||||
Contexts: "con1",
|
||||
FilterIDs: "FLTR_ACNT_dan;FLTR_DST_DE",
|
||||
FilterIDs: "FLTR_ACNT_dan;FLTR_DST_DE;*ai:~*req.AnswerTime:2014-07-14T14:35:00Z;2014-07-14T14:36:00Z",
|
||||
Path: utils.MetaReq + utils.NestingSep + "FL1",
|
||||
Value: "Al1",
|
||||
Weight: 20,
|
||||
@@ -1588,11 +1568,7 @@ func TestModelAsTPAttribute2(t *testing.T) {
|
||||
Tenant: "cgrates.org",
|
||||
ID: "ALS1",
|
||||
Contexts: []string{"con1"},
|
||||
FilterIDs: []string{"FLTR_ACNT_dan", "FLTR_DST_DE"},
|
||||
ActivationInterval: &utils.TPActivationInterval{
|
||||
ActivationTime: "2014-07-14T14:35:00Z",
|
||||
ExpiryTime: "2014-07-15T14:35:00Z",
|
||||
},
|
||||
FilterIDs: []string{"*ai:~*req.AnswerTime:2014-07-14T14:35:00Z;2014-07-14T14:36:00Z", "FLTR_ACNT_dan", "FLTR_DST_DE"},
|
||||
Attributes: []*utils.TPAttribute{
|
||||
{
|
||||
FilterIDs: []string{},
|
||||
@@ -1607,11 +1583,7 @@ func TestModelAsTPAttribute2(t *testing.T) {
|
||||
Tenant: "cgrates.org",
|
||||
ID: "ALS1",
|
||||
Contexts: []string{"con1"},
|
||||
FilterIDs: []string{"FLTR_DST_DE", "FLTR_ACNT_dan"},
|
||||
ActivationInterval: &utils.TPActivationInterval{
|
||||
ActivationTime: "2014-07-14T14:35:00Z",
|
||||
ExpiryTime: "",
|
||||
},
|
||||
FilterIDs: []string{"*ai:~*req.AnswerTime:2014-07-14T14:35:00Z", "FLTR_ACNT_dan", "FLTR_DST_DE"},
|
||||
Attributes: []*utils.TPAttribute{
|
||||
{
|
||||
FilterIDs: []string{},
|
||||
@@ -1635,7 +1607,7 @@ func TestModelAsTPAttribute(t *testing.T) {
|
||||
Tenant: "cgrates.org",
|
||||
ID: "ALS1",
|
||||
Contexts: "con1",
|
||||
FilterIDs: "FLTR_ACNT_dan;FLTR_DST_DE",
|
||||
FilterIDs: "FLTR_ACNT_dan;FLTR_DST_DE;*ai:~*req.AnswerTime:2014-07-14T14:35:00Z",
|
||||
Path: utils.MetaReq + utils.NestingSep + "FL1",
|
||||
Value: "Al1",
|
||||
Weight: 20,
|
||||
@@ -1646,11 +1618,7 @@ func TestModelAsTPAttribute(t *testing.T) {
|
||||
Tenant: "cgrates.org",
|
||||
ID: "ALS1",
|
||||
Contexts: []string{"con1"},
|
||||
FilterIDs: []string{"FLTR_ACNT_dan", "FLTR_DST_DE"},
|
||||
ActivationInterval: &utils.TPActivationInterval{
|
||||
ActivationTime: "2014-07-14T14:35:00Z",
|
||||
ExpiryTime: "",
|
||||
},
|
||||
FilterIDs: []string{"*ai:~*req.AnswerTime:2014-07-14T14:35:00Z", "FLTR_ACNT_dan", "FLTR_DST_DE"},
|
||||
Attributes: []*utils.TPAttribute{
|
||||
{
|
||||
FilterIDs: []string{},
|
||||
@@ -1665,11 +1633,7 @@ func TestModelAsTPAttribute(t *testing.T) {
|
||||
Tenant: "cgrates.org",
|
||||
ID: "ALS1",
|
||||
Contexts: []string{"con1"},
|
||||
FilterIDs: []string{"FLTR_DST_DE", "FLTR_ACNT_dan"},
|
||||
ActivationInterval: &utils.TPActivationInterval{
|
||||
ActivationTime: "2014-07-14T14:35:00Z",
|
||||
ExpiryTime: "",
|
||||
},
|
||||
FilterIDs: []string{"*ai:~*req.AnswerTime:2014-07-14T14:35:00Z", "FLTR_DST_DE", "FLTR_ACNT_dan"},
|
||||
Attributes: []*utils.TPAttribute{
|
||||
{
|
||||
FilterIDs: []string{},
|
||||
@@ -4547,11 +4511,7 @@ func TestAPItoAttributeProfileError1(t *testing.T) {
|
||||
Tenant: "cgrates.org",
|
||||
ID: "ALS1",
|
||||
Contexts: []string{"con1"},
|
||||
FilterIDs: []string{"FLTR_ACNT_dan", "FLTR_DST_DE"},
|
||||
ActivationInterval: &utils.TPActivationInterval{
|
||||
ActivationTime: "2014-07-14T14:35:00Z",
|
||||
ExpiryTime: "",
|
||||
},
|
||||
FilterIDs: []string{"FLTR_ACNT_dan", "FLTR_DST_DE", "*ai:~*req.AnswerTime:2014-07-14T14:35:00Z"},
|
||||
Attributes: []*utils.TPAttribute{
|
||||
{
|
||||
Path: "",
|
||||
@@ -4574,11 +4534,7 @@ func TestAPItoAttributeProfileError2(t *testing.T) {
|
||||
Tenant: "cgrates.org",
|
||||
ID: "ALS1",
|
||||
Contexts: []string{"con1"},
|
||||
FilterIDs: []string{"FLTR_ACNT_dan", "FLTR_DST_DE"},
|
||||
ActivationInterval: &utils.TPActivationInterval{
|
||||
ActivationTime: "2014-07-14T14:35:00Z",
|
||||
ExpiryTime: "",
|
||||
},
|
||||
FilterIDs: []string{"FLTR_ACNT_dan", "FLTR_DST_DE", "*ai:~*req.AnswerTime:2014-07-14T14:35:00Z"},
|
||||
Attributes: []*utils.TPAttribute{
|
||||
{
|
||||
Path: utils.MetaReq + utils.NestingSep + "FL1",
|
||||
@@ -4596,32 +4552,6 @@ func TestAPItoAttributeProfileError2(t *testing.T) {
|
||||
|
||||
}
|
||||
|
||||
func TestAPItoAttributeProfileError3(t *testing.T) {
|
||||
tpAlsPrf := &utils.TPAttributeProfile{
|
||||
TPid: "TP1",
|
||||
Tenant: "cgrates.org",
|
||||
ID: "ALS1",
|
||||
Contexts: []string{"con1"},
|
||||
FilterIDs: []string{"FLTR_ACNT_dan", "FLTR_DST_DE"},
|
||||
ActivationInterval: &utils.TPActivationInterval{
|
||||
ActivationTime: "cat",
|
||||
ExpiryTime: "",
|
||||
},
|
||||
Attributes: []*utils.TPAttribute{
|
||||
{
|
||||
Path: utils.MetaReq + utils.NestingSep + "FL1",
|
||||
Value: "Al1",
|
||||
},
|
||||
},
|
||||
Weight: 20,
|
||||
}
|
||||
|
||||
_, err := APItoAttributeProfile(tpAlsPrf, "UTC")
|
||||
if err == nil || err.Error() != "Unsupported time format" {
|
||||
t.Errorf("\nExpecting <Unsupported time format>,\n Received <%+v>", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestAPItoModelTPAttributeNoAttributes(t *testing.T) {
|
||||
testStruct := &utils.TPAttributeProfile{}
|
||||
var expStruct AttributeMdls = nil
|
||||
|
||||
@@ -676,11 +676,8 @@ func TestGetLoadedIdsAttributeProfiles(t *testing.T) {
|
||||
TPid: testTPID,
|
||||
Tenant: "cgrates.org",
|
||||
ID: "ResGroup1",
|
||||
FilterIDs: []string{"*string:~*req.Account:1001"},
|
||||
ActivationInterval: &utils.TPActivationInterval{
|
||||
ActivationTime: "2014-07-29T15:00:00Z",
|
||||
},
|
||||
Contexts: []string{"sessions"},
|
||||
FilterIDs: []string{"*string:~*req.Account:1001", "*ai:~*req.AnswerTime:2014-07-29T15:00:00Z"},
|
||||
Contexts: []string{"sessions"},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
@@ -73,7 +73,7 @@ func TestVersionCompare(t *testing.T) {
|
||||
func TestCurrentDBVersions(t *testing.T) {
|
||||
expVersDataDB := Versions{
|
||||
utils.StatS: 4, utils.Accounts: 3, utils.Actions: 2,
|
||||
utils.Thresholds: 4, utils.Routes: 2, utils.Attributes: 6,
|
||||
utils.Thresholds: 4, utils.Routes: 2, utils.Attributes: 7,
|
||||
utils.Timing: 1, utils.RQF: 5, utils.Resource: 1,
|
||||
utils.Subscribers: 1, utils.Destinations: 1, utils.ReverseDestinations: 1,
|
||||
utils.Chargers: 2,
|
||||
|
||||
@@ -133,7 +133,7 @@ func (iDBMig *internalMigrator) remV3AttributeProfile(tenant, id string) (err er
|
||||
func (iDBMig *internalMigrator) getV4AttributeProfile() (v4attrPrf *v4AttributeProfile, err error) {
|
||||
return nil, utils.ErrNotImplemented
|
||||
}
|
||||
func (iDBMig *internalMigrator) getV5AttributeProfile() (v4attrPrf *engine.AttributeProfile, err error) {
|
||||
func (iDBMig *internalMigrator) getV5AttributeProfile() (v6attrPrf *v6AttributeProfile, err error) {
|
||||
return nil, utils.ErrNotImplemented
|
||||
}
|
||||
|
||||
|
||||
@@ -296,7 +296,7 @@ func (v1ms *mongoMigrator) getV4AttributeProfile() (v4attrPrf *v4AttributeProfil
|
||||
return v4attrPrf, nil
|
||||
}
|
||||
|
||||
func (v1ms *mongoMigrator) getV5AttributeProfile() (v5attrPrf *engine.AttributeProfile, err error) {
|
||||
func (v1ms *mongoMigrator) getV5AttributeProfile() (v6attrPrf *v6AttributeProfile, err error) {
|
||||
if v1ms.cursor == nil {
|
||||
v1ms.cursor, err = v1ms.mgoDB.DB().Collection(v1AttributeProfilesCol).Find(v1ms.mgoDB.GetContext(), bson.D{})
|
||||
if err != nil {
|
||||
@@ -308,11 +308,11 @@ func (v1ms *mongoMigrator) getV5AttributeProfile() (v5attrPrf *engine.AttributeP
|
||||
v1ms.cursor = nil
|
||||
return nil, utils.ErrNoMoreData
|
||||
}
|
||||
v5attrPrf = new(engine.AttributeProfile)
|
||||
if err := (*v1ms.cursor).Decode(v5attrPrf); err != nil {
|
||||
v6attrPrf = new(v6AttributeProfile)
|
||||
if err := (*v1ms.cursor).Decode(v6attrPrf); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return v5attrPrf, nil
|
||||
return v6attrPrf, nil
|
||||
}
|
||||
|
||||
//set
|
||||
|
||||
@@ -398,7 +398,7 @@ func (v1rs *redisMigrator) getV4AttributeProfile() (v3attrPrf *v4AttributeProfil
|
||||
return v4attr, nil
|
||||
}
|
||||
|
||||
func (v1rs *redisMigrator) getV5AttributeProfile() (v5attr *engine.AttributeProfile, err error) {
|
||||
func (v1rs *redisMigrator) getV5AttributeProfile() (v6attr *v6AttributeProfile, err error) {
|
||||
if v1rs.qryIdx == nil {
|
||||
v1rs.dataKeys, err = v1rs.rds.GetKeysForPrefix(context.TODO(), utils.AttributeProfilePrefix)
|
||||
if err != nil {
|
||||
@@ -413,7 +413,7 @@ func (v1rs *redisMigrator) getV5AttributeProfile() (v5attr *engine.AttributeProf
|
||||
if err = v1rs.rds.Cmd(&strVal, "GET", v1rs.dataKeys[*v1rs.qryIdx]); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if err := v1rs.rds.Marshaler().Unmarshal(strVal, &v5attr); err != nil {
|
||||
if err := v1rs.rds.Marshaler().Unmarshal(strVal, &v6attr); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
*v1rs.qryIdx = *v1rs.qryIdx + 1
|
||||
|
||||
@@ -709,15 +709,14 @@ type TPAttribute struct {
|
||||
|
||||
// TPAttributeProfile is used in APIs to manage remotely offline AttributeProfile
|
||||
type TPAttributeProfile struct {
|
||||
TPid string
|
||||
Tenant string
|
||||
ID string
|
||||
FilterIDs []string
|
||||
ActivationInterval *TPActivationInterval // Time when this limit becomes active and expires
|
||||
Contexts []string // bind this TPAttribute to multiple context
|
||||
Attributes []*TPAttribute
|
||||
Blocker bool
|
||||
Weight float64
|
||||
TPid string
|
||||
Tenant string
|
||||
ID string
|
||||
FilterIDs []string
|
||||
Contexts []string // bind this TPAttribute to multiple context
|
||||
Attributes []*TPAttribute
|
||||
Blocker bool
|
||||
Weight float64
|
||||
}
|
||||
|
||||
// TPChargerProfile is used in APIs to manage remotely offline ChargerProfile
|
||||
|
||||
Reference in New Issue
Block a user