1) Added handling for no provider accounts configured (or enabled for incoming/outgoing calls), and no

users configured (or enabled for outgoing calls).
2) Rewrote code to be more efficient by gathering all information about providers and users in one pass
at the start, and then using dictionaries with the data stored in them to build the sections.
3) Added translate() statements for default messages displayed (like "Dials all numbers").
4) Rewrote default messages for the "Incoming Calls" and "Providers Used for Outgoing Calls" sections
to be more descriptive.
This commit is contained in:
Iordan Iordanov 2011-11-07 02:02:33 +00:00
parent 5aada3821b
commit 3a3b9ed806

View file

@ -25,18 +25,20 @@ else
server = "" server = ""
end end
modulename = "pbx-calls" modulename = "pbx-calls"
voipmodulename = "pbx-voip" voipmodulename = "pbx-voip"
googlemodulename = "pbx-google" googlemodulename = "pbx-google"
usersmodulename = "pbx-users" usersmodulename = "pbx-users"
allvalidaccounts = {} allvalidaccounts = {}
nallvalidaccounts = 0 nallvalidaccounts = 0
validoutaccounts = {} validoutaccounts = {}
nvalidoutaccounts = 0 nvalidoutaccounts = 0
validinaccounts = {} validinaccounts = {}
nvalidinaccounts = 0 nvalidinaccounts = 0
allvalidusers = {} allvalidusers = {}
nallvalidusers = 0 nallvalidusers = 0
validoutusers = {}
nvalidoutusers = 0
-- Checks whether the entered extension is valid syntactically. -- Checks whether the entered extension is valid syntactically.
@ -101,15 +103,31 @@ m.uci:foreach(voipmodulename, "voip_provider",
end end
end) end)
-- Add Local User accounts to all valid users, and users allowed to make outgoing calls.
m.uci:foreach(usersmodulename, "local_user",
function(s1)
-- Add user to list of all valid users.
if s1.defaultuser ~= nil then
allvalidusers[s1.defaultuser] = true
nallvalidusers = nallvalidusers + 1
if s1.can_call == "yes" then
validoutusers[s1.defaultuser] = true
nvalidoutusers = nvalidoutusers + 1
end
end
end)
---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------
-- If there are no accounts configured, or no accountsenabled for outgoing calls, display a warning. -- If there are no accounts configured, or no accounts enabled for outgoing calls, display a warning.
-- Otherwise, display the usual help text within the section. -- Otherwise, display the usual help text within the section.
if nallvalidaccounts == 0 then if nallvalidaccounts == 0 then
text = "NOTE: There are no Google or SIP provider accounts configured." text = translate("NOTE: There are no Google or SIP provider accounts configured.")
elseif nvalidoutaccounts == 0 then elseif nvalidoutaccounts == 0 then
text = "NOTE: There are no Google or SIP provider accounts enabled for outgoing calls." text = translate("NOTE: There are no Google or SIP provider accounts enabled for outgoing calls.")
else else
text = "If you have more than one account which can make outgoing calls, you \ text = translate("If you have more than one account which can make outgoing calls, you \
should enter a list of phone numbers and prefixes in the following fields for each \ should enter a list of phone numbers and prefixes in the following fields for each \
provider listed. Invalid prefixes are removed silently, and only 0-9, X, Z, N, #, *, \ provider listed. Invalid prefixes are removed silently, and only 0-9, X, Z, N, #, *, \
and + are valid characters. The letter X matches 0-9, Z matches 1-9, and N matches 2-9. \ and + are valid characters. The letter X matches 0-9, Z matches 1-9, and N matches 2-9. \
@ -121,217 +139,152 @@ else
replace an empty list with a message that the provider dials all numbers. Be as specific as \ replace an empty list with a message that the provider dials all numbers. Be as specific as \
possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international dial codes \ possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international dial codes \
are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a space-separated \ are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a space-separated \
list, and/or one per line by hitting enter after every one." list, and/or one per line by hitting enter after every one.")
end end
s = m:section(NamedSection, "outgoing_calls", "call_routing", translate("Outgoing Calls"),
translate(text)) s = m:section(NamedSection, "outgoing_calls", "call_routing", translate("Outgoing Calls"), text)
s.anonymous = true s.anonymous = true
m.uci:foreach(googlemodulename, "gtalk_jabber", for k,v in pairs(validoutaccounts) do
function(s1) patterns = s:option(DynamicList, k, v)
-- If this provider is valid AND is enabled for outgoing calls, add it to the section.
if s1.username ~= nil and s1.name ~= nil and -- If the saved field is empty, we return a string
s1.make_outgoing_calls == "yes" then -- telling the user that this account would dial any exten.
patt = s:option(DynamicList, s1.name, s1.username) function patterns.cfgvalue(self, section)
value = self.map:get(section, self.option)
-- If the saved field is empty, we return a string
-- telling the user that this account would dial any exten. if value == nil then
function patt.cfgvalue(self, section) return {translate("Dials any number")}
value = self.map:get(section, self.option) else
return value
if value == nil then end
return {"Dials any number"} end
else
return value -- Write only valid extensions into the config file.
end function patterns.write(self, section, value)
end newvalue = {}
nindex = 1
-- Write only valid extensions into the config file. for index, field in ipairs(value) do
function patt.write(self, section, value) val = luci.util.trim(value[index])
newvalue = {} if is_valid_extension(val) == true then
nindex = 1 newvalue[nindex] = val
for index, field in ipairs(value) do nindex = nindex + 1
val = luci.util.trim(value[index]) end
if is_valid_extension(val) == true then end
newvalue[nindex] = val DynamicList.write(self, section, newvalue)
nindex = nindex + 1 end
end end
end
DynamicList.write(self, section, newvalue)
end
end
end)
m.uci:foreach(voipmodulename, "voip_provider",
function(s1)
-- If this provider is valid AND is enabled for outgoing calls, add it to the section.
if s1.defaultuser ~= nil and s1.host ~= nil and
s1.name ~= nil and s1.make_outgoing_calls == "yes" then
patt = s:option(DynamicList, s1.name, s1.defaultuser .. "@" .. s1.host)
-- If the saved field is empty, we return a string
-- telling the user that this account would dial any exten.
function patt.cfgvalue(self, section)
value = self.map:get(section, self.option)
if value == nil then
return {"Dials any number"}
else
return value
end
end
-- Write only valid extensions into the config file.
function patt.write(self, section, value)
newvalue = {}
nindex = 1
for index, field in ipairs(value) do
val = luci.util.trim(value[index])
if is_valid_extension(val) == true then
newvalue[nindex] = val
nindex = nindex + 1
end
end
DynamicList.write(self, section, newvalue)
end
end
end)
---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------
s = m:section(NamedSection, "incoming_calls", "call_routing", translate("Incoming Calls"), -- If there are no accounts configured, or no accounts enabled for incoming calls, display a warning.
translate("For each provider that receives calls, here you can restrict which users to ring \ -- Otherwise, display the usual help text within the section.
if nallvalidaccounts == 0 then
text = translate("NOTE: There are no Google or SIP provider accounts configured.")
elseif nvalidinaccounts == 0 then
text = translate("NOTE: There are no Google or SIP provider accounts enabled for incoming calls.")
else
text = translate("For each provider that receives calls, here you can restrict which users to ring \
on incoming calls. If the list is empty, the system will indicate that all users \ on incoming calls. If the list is empty, the system will indicate that all users \
which are enabled for incoming calls will ring. Invalid usernames will be rejected \ which are enabled for incoming calls will ring. Invalid usernames will be rejected \
silently. Also, entering a username here overrides the user's setting to not receive \ silently. Also, entering a username here overrides the user's setting to not receive \
incoming calls, so this way, you can make users ring only for select providers. \ incoming calls. This way, you can make certain users ring only for specific providers. \
Entries can be made in a space-separated list, and/or one per \ Entries can be made in a space-separated list, and/or one per line by hitting enter after \
line by hitting enter after every one.")) every one.")
end
s = m:section(NamedSection, "incoming_calls", "call_routing", translate("Incoming Calls"), text)
s.anonymous = true s.anonymous = true
m.uci:foreach(googlemodulename, "gtalk_jabber", for k,v in pairs(validinaccounts) do
function(s1) users = s:option(DynamicList, k, v)
if s1.username ~= nil and s1.register == "yes" then
field_name=string.gsub(s1.username, "%W", "_") -- If the saved field is empty, we return a string
gtalkaccts = s:option(DynamicList, field_name, s1.username) -- telling the user that this account would dial any exten.
function users.cfgvalue(self, section)
-- If the saved field is empty, we return a string value = self.map:get(section, self.option)
-- telling the user that this account would dial any exten.
function gtalkaccts.cfgvalue(self, section) if value == nil then
value = self.map:get(section, self.option) return {translate("Rings all users enabled for incoming calls")}
else
if value == nil then return value
return {"Rings all users"} end
else end
return value
end -- Write only valid user names.
end function users.write(self, section, value)
newvalue = {}
-- Write only valid user names. nindex = 1
function gtalkaccts.write(self, section, value) for index, field in ipairs(value) do
newvalue = {} trimuser = luci.util.trim(value[index])
nindex = 1 if allvalidusers[trimuser] == true then
for index, field in ipairs(value) do newvalue[nindex] = trimuser
trimuser = luci.util.trim(value[index]) nindex = nindex + 1
if allvalidusers[trimuser] == true then end
newvalue[nindex] = trimuser end
nindex = nindex + 1 DynamicList.write(self, section, newvalue)
end end
end end
DynamicList.write(self, section, newvalue)
end
end
end)
m.uci:foreach(voipmodulename, "voip_provider",
function(s1)
if s1.defaultuser ~= nil and s1.host ~= nil and s1.register == "yes" then
field_name=string.gsub(s1.defaultuser .. "_" .. s1.host, "%W", "_")
voipaccts = s:option(DynamicList, field_name, s1.defaultuser .. "@" .. s1.host)
-- If the saved field is empty, we return a string
-- telling the user that this account would dial any exten.
function voipaccts.cfgvalue(self, section)
value = self.map:get(section, self.option)
if value == nil then
return {"Rings all users"}
else
return value
end
end
-- Write only valid user names.
function voipaccts.write(self, section, value)
newvalue = {}
nindex = 1
for index, field in ipairs(value) do
trimuser = luci.util.trim(value[index])
if allvalidusers[trimuser] == true then
newvalue[nindex] = trimuser
nindex = nindex + 1
end
end
DynamicList.write(self, section, newvalue)
end
end
end)
---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------
-- If there are no user accounts configured, no user accounts enabled for outgoing calls,
-- display a warning. Otherwise, display the usual help text within the section.
if nallvalidusers == 0 then
text = translate("NOTE: There are no local user accounts configured.")
elseif nvalidoutusers == 0 then
text = translate("NOTE: There are no local user accounts enabled for outgoing calls.")
else
text = translate("If you would like, you could restrict which providers users are allowed to use for \
outgoing calls. By default all users can use all providers. To show up in the list below the user \
should be allowed to make outgoing calls in the \"User Accounts\" page. Enter VoIP providers in the \
format username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest to copy and \
paste the providers from above. Invalid entries, including providers not enabled for outgoing \
calls, will be rejected silently. Entries can be made in a space-separated list, and/or one per \
line by hitting enter after every one.")
end
s = m:section(NamedSection, "providers_user_can_use", "call_routing", s = m:section(NamedSection, "providers_user_can_use", "call_routing",
translate("Providers Used for Outgoing Calls"), translate("Providers Used for Outgoing Calls"), text)
translate("If you would like, you could restrict which providers users are allowed to use for outgoing \
calls. By default all users can use all providers. To show up in the list below the user should \
be allowed to make outgoing calls in the \"User Accounts\" page. Enter VoIP providers in the format \
username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste \
the providers from above. Invalid entries will be rejected silently. Entries can be made in a \
space-separated list, and/or one per line by hitting enter after every one."))
s.anonymous = true s.anonymous = true
m.uci:foreach(usersmodulename, "local_user", for k,v in pairs(validoutusers) do
function(s1) providers = s:option(DynamicList, k, k)
-- Add user to list of all valid users.
if s1.defaultuser ~= nil then allvalidusers[s1.defaultuser] = true end
if s1.defaultuser ~= nil and s1.can_call == "yes" then
providers = s:option(DynamicList, s1.defaultuser, s1.defaultuser)
-- If the saved field is empty, we return a string
-- telling the user that this account would dial any exten.
function providers.cfgvalue(self, section)
value = self.map:get(section, self.option)
if value == nil then -- If the saved field is empty, we return a string
return {"Uses all provider accounts"} -- telling the user that this account would dial any exten.
else function providers.cfgvalue(self, section)
newvalue = {} value = self.map:get(section, self.option)
-- Convert internal names to user@host values.
for i,v in ipairs(value) do if value == nil then
newvalue[i] = validoutaccounts[v] return {translate("Uses all providers enabled for outgoing calls")}
end else
return newvalue newvalue = {}
end -- Convert internal names to user@host values.
end for i,v in ipairs(value) do
newvalue[i] = validoutaccounts[v]
-- Cook the new values prior to entering them into the config file. end
-- Also, enter them only if they are valid. return newvalue
function providers.write(self, section, value) end
cookedvalue = {} end
cindex = 1
for index, field in ipairs(value) do -- Cook the new values prior to entering them into the config file.
cooked = string.gsub(luci.util.trim(value[index]), "%W", "_") -- Also, enter them only if they are valid.
if validoutaccounts[cooked] ~= nil then function providers.write(self, section, value)
cookedvalue[cindex] = cooked cookedvalue = {}
cindex = cindex + 1 cindex = 1
end for index, field in ipairs(value) do
end cooked = string.gsub(luci.util.trim(value[index]), "%W", "_")
DynamicList.write(self, section, cookedvalue) if validoutaccounts[cooked] ~= nil then
end cookedvalue[cindex] = cooked
end cindex = cindex + 1
end) end
end
DynamicList.write(self, section, cookedvalue)
end
end
---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------
s = m:section(TypedSection, "callthrough_numbers", translate("Call-through Numbers"), s = m:section(TypedSection, "callthrough_numbers", translate("Call-through Numbers"),
@ -350,7 +303,8 @@ p.default = "yes"
user = s:option(Value, "defaultuser", translate("User Name"), user = s:option(Value, "defaultuser", translate("User Name"),
translate("The number(s) specified above will be able to dial out with this user's providers. \ translate("The number(s) specified above will be able to dial out with this user's providers. \
Invalid usernames are dropped silently, please verify that the entry was accepted.")) Invalid usernames, including users not enabled for outgoing calls, are dropped silently. \
Please verify that the entry was accepted."))
function user.write(self, section, value) function user.write(self, section, value)
trimuser = luci.util.trim(value) trimuser = luci.util.trim(value)
if allvalidusers[trimuser] == true then if allvalidusers[trimuser] == true then